Compare commits

...

21 Commits

Author SHA1 Message Date
Rob Herley 13aacd865c Merge pull request #1242 from to-s/main
Code scanning - action / CodeQL-Build (push) Has been cancelled
feat: save-always flag
2024-01-16 14:54:22 -05:00
Rob Herley 53b35c5439 Merge branch 'main' into main 2024-01-16 14:51:14 -05:00
Yang Cao 65b8989fab Merge pull request #1284 from takost/update-to-node-20
Update action to node20
2024-01-16 10:16:06 -05:00
Tatyana Kostromskaya d0be34d544 Fix dist 2024-01-15 14:19:39 +00:00
Tatyana Kostromskaya 66cf064d47 Merge branch 'main' into update-to-node-20 2024-01-15 14:13:28 +00:00
Rob Herley 1326563738 Merge branch 'main' into main 2024-01-11 15:19:28 -05:00
Rob Herley e12d46a63a Merge pull request #1302 from actions/robherley/v3.3.3
Code scanning - action / CodeQL-Build (push) Has been cancelled
Cache v3.3.3
2024-01-11 11:38:08 -05:00
Rob Herley 1baebfc3ba licensed 2024-01-11 10:45:45 -05:00
Rob Herley eb94f1a6bf cache v3.3.3 2024-01-11 10:37:08 -05:00
Tatyana Kostromskaya e71876755e Fix format 2024-01-10 15:40:24 +00:00
Tatyana Kostromskaya 01229828ff Apply workaround for earlyExit 2024-01-10 15:36:58 +00:00
Tatyana Kostromskaya 3185ecfd61 Update "only-" actions to node20 2024-01-10 15:00:25 +00:00
Tatyana Kostromskaya 25618a0a67 Bump version 2024-01-10 14:37:39 +00:00
Tatyana Kostromskaya a0a285ffd4 replace deprecated @zeit/ncc with @vercel/ncc 2023-12-15 11:00:48 +00:00
Tatyana Kostromskaya b00bedba4a Update license 2023-12-15 10:37:48 +00:00
Tatyana Kostromskaya 99d573b49d Rebuild dist 2023-12-15 10:17:02 +00:00
Tatyana Kostromskaya 6f0a1fdd90 Update check-dist node version 2023-12-14 15:30:15 +00:00
Tatyana Kostromskaya 2001ca4114 Update action to node20 2023-11-20 13:30:40 +00:00
to-s 0e9aed0d0d Revert "Update action.yml"
This reverts commit 3b7dac1789.
2023-11-09 00:31:17 +01:00
to-s 3b7dac1789 Update action.yml
Co-authored-by: Tomasz Janiszewski <janiszt@gmail.com>
2023-11-06 07:23:38 +01:00
to-s b1378c8403 added save-always input 2023-09-13 13:58:52 +02:00
27 changed files with 112950 additions and 115157 deletions
+2
View File
@@ -15,3 +15,5 @@ jobs:
call-check-dist:
name: Check dist/
uses: actions/reusable-workflows/.github/workflows/check-dist.yml@main
with:
node-version: "20.x"
+2 -2
View File
@@ -21,10 +21,10 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Node.js 16.x
- name: Setup Node.js 20.x
uses: actions/setup-node@v3
with:
node-version: 16.x
node-version: 20.x
cache: npm
- run: npm ci
- name: Prettier Format Check
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
+9
View File
@@ -111,3 +111,12 @@
### 3.3.2
- Fixes bug with Azure SDK causing blob downloads to get stuck.
### 3.3.3
- Updates @actions/cache to v3.2.3 to fix accidental mutated path arguments to `getCacheVersion` [actions/toolkit#1378](https://github.com/actions/toolkit/pull/1378)
- Additional audit fixes of npm package(s)
### 4.0.0
- Updated minimum runner version support from node 12 -> node 20
+2 -2
View File
@@ -2,7 +2,7 @@ import * as cache from "@actions/cache";
import * as core from "@actions/core";
import { Events, Inputs, RefKey } from "../src/constants";
import run from "../src/save";
import { saveRun } from "../src/saveImpl";
import * as actionUtils from "../src/utils/actionUtils";
import * as testUtils from "../src/utils/testUtils";
@@ -100,7 +100,7 @@ test("save with valid inputs uploads a cache", async () => {
return Promise.resolve(cacheId);
});
await run();
await saveRun();
expect(saveCacheMock).toHaveBeenCalledTimes(1);
expect(saveCacheMock).toHaveBeenCalledWith(
+12 -12
View File
@@ -2,7 +2,7 @@ import * as cache from "@actions/cache";
import * as core from "@actions/core";
import { Events, Inputs, RefKey } from "../src/constants";
import run from "../src/saveImpl";
import { saveImpl } from "../src/saveImpl";
import { StateProvider } from "../src/stateProvider";
import * as actionUtils from "../src/utils/actionUtils";
import * as testUtils from "../src/utils/testUtils";
@@ -77,7 +77,7 @@ test("save with invalid event outputs warning", async () => {
const invalidEvent = "commit_comment";
process.env[Events.Key] = invalidEvent;
delete process.env[RefKey];
await run(new StateProvider());
await saveImpl(new StateProvider());
expect(logWarningMock).toHaveBeenCalledWith(
`Event Validation Error: The event type ${invalidEvent} is not supported because it's not tied to a branch or tag ref.`
);
@@ -100,7 +100,7 @@ test("save with no primary key in state outputs warning", async () => {
});
const saveCacheMock = jest.spyOn(cache, "saveCache");
await run(new StateProvider());
await saveImpl(new StateProvider());
expect(saveCacheMock).toHaveBeenCalledTimes(0);
expect(logWarningMock).toHaveBeenCalledWith(`Key is not specified.`);
@@ -115,7 +115,7 @@ test("save without AC available should no-op", async () => {
const saveCacheMock = jest.spyOn(cache, "saveCache");
await run(new StateProvider());
await saveImpl(new StateProvider());
expect(saveCacheMock).toHaveBeenCalledTimes(0);
});
@@ -128,7 +128,7 @@ test("save on ghes without AC available should no-op", async () => {
const saveCacheMock = jest.spyOn(cache, "saveCache");
await run(new StateProvider());
await saveImpl(new StateProvider());
expect(saveCacheMock).toHaveBeenCalledTimes(0);
});
@@ -161,7 +161,7 @@ test("save on GHES with AC available", async () => {
return Promise.resolve(cacheId);
});
await run(new StateProvider());
await saveImpl(new StateProvider());
expect(saveCacheMock).toHaveBeenCalledTimes(1);
expect(saveCacheMock).toHaveBeenCalledWith(
@@ -194,7 +194,7 @@ test("save with exact match returns early", async () => {
});
const saveCacheMock = jest.spyOn(cache, "saveCache");
await run(new StateProvider());
await saveImpl(new StateProvider());
expect(saveCacheMock).toHaveBeenCalledTimes(0);
expect(infoMock).toHaveBeenCalledWith(
@@ -221,7 +221,7 @@ test("save with missing input outputs warning", async () => {
});
const saveCacheMock = jest.spyOn(cache, "saveCache");
await run(new StateProvider());
await saveImpl(new StateProvider());
expect(saveCacheMock).toHaveBeenCalledTimes(0);
expect(logWarningMock).toHaveBeenCalledWith(
@@ -259,7 +259,7 @@ test("save with large cache outputs warning", async () => {
);
});
await run(new StateProvider());
await saveImpl(new StateProvider());
expect(saveCacheMock).toHaveBeenCalledTimes(1);
expect(saveCacheMock).toHaveBeenCalledWith(
@@ -306,7 +306,7 @@ test("save with reserve cache failure outputs warning", async () => {
throw error;
});
await run(new StateProvider());
await saveImpl(new StateProvider());
expect(saveCacheMock).toHaveBeenCalledTimes(1);
expect(saveCacheMock).toHaveBeenCalledWith(
@@ -349,7 +349,7 @@ test("save with server error outputs warning", async () => {
throw new Error("HTTP Error Occurred");
});
await run(new StateProvider());
await saveImpl(new StateProvider());
expect(saveCacheMock).toHaveBeenCalledTimes(1);
expect(saveCacheMock).toHaveBeenCalledWith(
@@ -392,7 +392,7 @@ test("save with valid inputs uploads a cache", async () => {
return Promise.resolve(cacheId);
});
await run(new StateProvider());
await saveImpl(new StateProvider());
expect(saveCacheMock).toHaveBeenCalledTimes(1);
expect(saveCacheMock).toHaveBeenCalledWith(
+3 -3
View File
@@ -2,7 +2,7 @@ import * as cache from "@actions/cache";
import * as core from "@actions/core";
import { Events, Inputs, RefKey } from "../src/constants";
import run from "../src/saveOnly";
import { saveOnlyRun } from "../src/saveImpl";
import * as actionUtils from "../src/utils/actionUtils";
import * as testUtils from "../src/utils/testUtils";
@@ -90,7 +90,7 @@ test("save with valid inputs uploads a cache", async () => {
return Promise.resolve(cacheId);
});
await run();
await saveOnlyRun();
expect(saveCacheMock).toHaveBeenCalledTimes(1);
expect(saveCacheMock).toHaveBeenCalledWith(
@@ -122,7 +122,7 @@ test("save failing logs the warning message", async () => {
return Promise.resolve(cacheId);
});
await run();
await saveOnlyRun();
expect(saveCacheMock).toHaveBeenCalledTimes(1);
expect(saveCacheMock).toHaveBeenCalledWith(
+6 -2
View File
@@ -26,14 +26,18 @@ inputs:
description: 'Check if a cache entry exists for the given input(s) (key, restore-keys) without downloading the cache'
default: 'false'
required: false
save-always:
description: 'Run the post step to save the cache even if another step before fails'
default: 'false'
required: false
outputs:
cache-hit:
description: 'A boolean value to indicate an exact match was found for the primary key'
runs:
using: 'node16'
using: 'node20'
main: 'dist/restore/index.js'
post: 'dist/save/index.js'
post-if: success()
post-if: "success() || github.event.inputs.save-always"
branding:
icon: 'archive'
color: 'gray-dark'
+28084 -28578
View File
File diff suppressed because one or more lines are too long
+28067 -28561
View File
File diff suppressed because one or more lines are too long
+28135 -28626
View File
File diff suppressed because one or more lines are too long
+28135 -28599
View File
File diff suppressed because one or more lines are too long
+432 -741
View File
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "cache",
"version": "3.3.2",
"version": "4.0.0",
"private": true,
"description": "Cache dependencies and build outputs",
"main": "dist/restore/index.js",
@@ -23,7 +23,7 @@
"author": "GitHub",
"license": "MIT",
"dependencies": {
"@actions/cache": "^3.2.2",
"@actions/cache": "^3.2.3",
"@actions/core": "^1.10.0",
"@actions/exec": "^1.1.1",
"@actions/io": "^1.1.2"
@@ -34,7 +34,7 @@
"@types/node": "^16.18.3",
"@typescript-eslint/eslint-plugin": "^5.45.0",
"@typescript-eslint/parser": "^5.45.0",
"@zeit/ncc": "^0.20.5",
"@vercel/ncc": "^0.38.1",
"eslint": "^8.28.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-import": "^2.26.0",
+1 -1
View File
@@ -31,7 +31,7 @@ outputs:
cache-matched-key:
description: 'Key of the cache that was restored, it could either be the primary key on cache-hit or a partial/complete match of one of the restore keys'
runs:
using: 'node16'
using: 'node20'
main: '../dist/restore-only/index.js'
branding:
icon: 'archive'
+1 -1
View File
@@ -16,7 +16,7 @@ inputs:
default: 'false'
required: false
runs:
using: 'node16'
using: 'node20'
main: '../dist/save-only/index.js'
branding:
icon: 'archive'
+2 -9
View File
@@ -1,10 +1,3 @@
import saveImpl from "./saveImpl";
import { StateProvider } from "./stateProvider";
import { saveRun } from "./saveImpl";
async function run(): Promise<void> {
await saveImpl(new StateProvider());
}
run();
export default run;
saveRun(true);
+52 -3
View File
@@ -2,7 +2,11 @@ import * as cache from "@actions/cache";
import * as core from "@actions/core";
import { Events, Inputs, State } from "./constants";
import { IStateProvider } from "./stateProvider";
import {
IStateProvider,
NullStateProvider,
StateProvider
} from "./stateProvider";
import * as utils from "./utils/actionUtils";
// Catch and log any unhandled exceptions. These exceptions can leak out of the uploadChunk method in
@@ -10,7 +14,9 @@ import * as utils from "./utils/actionUtils";
// throw an uncaught exception. Instead of failing this action, just warn.
process.on("uncaughtException", e => utils.logWarning(e.message));
async function saveImpl(stateProvider: IStateProvider): Promise<number | void> {
export async function saveImpl(
stateProvider: IStateProvider
): Promise<number | void> {
let cacheId = -1;
try {
if (!utils.isCacheFeatureAvailable()) {
@@ -72,4 +78,47 @@ async function saveImpl(stateProvider: IStateProvider): Promise<number | void> {
return cacheId;
}
export default saveImpl;
export async function saveOnlyRun(
earlyExit?: boolean | undefined
): Promise<void> {
try {
const cacheId = await saveImpl(new NullStateProvider());
if (cacheId === -1) {
core.warning(`Cache save failed.`);
}
} catch (err) {
console.error(err);
if (earlyExit) {
process.exit(1);
}
}
// node will stay alive if any promises are not resolved,
// which is a possibility if HTTP requests are dangling
// due to retries or timeouts. We know that if we got here
// that all promises that we care about have successfully
// resolved, so simply exit with success.
if (earlyExit) {
process.exit(0);
}
}
export async function saveRun(earlyExit?: boolean | undefined): Promise<void> {
try {
await saveImpl(new StateProvider());
} catch (err) {
console.error(err);
if (earlyExit) {
process.exit(1);
}
}
// node will stay alive if any promises are not resolved,
// which is a possibility if HTTP requests are dangling
// due to retries or timeouts. We know that if we got here
// that all promises that we care about have successfully
// resolved, so simply exit with success.
if (earlyExit) {
process.exit(0);
}
}
+2 -14
View File
@@ -1,15 +1,3 @@
import * as core from "@actions/core";
import { saveOnlyRun } from "./saveImpl";
import saveImpl from "./saveImpl";
import { NullStateProvider } from "./stateProvider";
async function run(): Promise<void> {
const cacheId = await saveImpl(new NullStateProvider());
if (cacheId === -1) {
core.warning(`Cache save failed.`);
}
}
run();
export default run;
saveOnlyRun(true);