diff --git a/.github/workflows/release-new-action-version.yml b/.github/workflows/release-new-action-version.yml new file mode 100644 index 0000000..0b64c97 --- /dev/null +++ b/.github/workflows/release-new-action-version.yml @@ -0,0 +1,28 @@ +name: Release new action version +on: + release: + types: [released] + workflow_dispatch: + inputs: + TAG_NAME: + description: 'Tag name that the major tag will point to' + required: true + +env: + TAG_NAME: ${{ github.event.inputs.TAG_NAME || github.event.release.tag_name }} +permissions: + contents: write + +jobs: + update_tag: + name: Update the major tag to include the ${{ github.event.inputs.TAG_NAME || github.event.release.tag_name }} changes + environment: + name: releaseNewActionVersion + runs-on: ubuntu-latest + steps: + - name: Update the ${{ env.TAG_NAME }} tag + id: update-major-tag + uses: actions/publish-action@v0.3.0 + with: + source-tag: ${{ env.TAG_NAME }} + slack-webhook: ${{ secrets.SLACK_WEBHOOK }} diff --git a/.licenses/npm/@actions/cache.dep.yml b/.licenses/npm/@actions/cache.dep.yml index ffc3360..b37997f 100644 Binary files a/.licenses/npm/@actions/cache.dep.yml and b/.licenses/npm/@actions/cache.dep.yml differ diff --git a/RELEASES.md b/RELEASES.md index e81cb3e..e70823e 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,77 +1,54 @@ # Releases -### 3.0.0 +### 4.0.2 -- Updated minimum runner version support from node 12 -> node 16 +- Fixed restore `fail-on-cache-miss` not working. -### 3.0.1 +### 4.0.1 -- Added support for caching from GHES 3.5. -- Fixed download issue for files > 2GB during restore. +- Updated `isGhes` check -### 3.0.2 +### 4.0.0 -- Added support for dynamic cache size cap on GHES. +- Updated minimum runner version support from node 12 -> node 20 -### 3.0.3 +### 3.3.3 -- Fixed avoiding empty cache save when no files are available for caching. ([issue](https://github.com/actions/cache/issues/624)) +- 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) -### 3.0.4 +### 3.3.2 -- Fixed tar creation error while trying to create tar with path as `~/` home folder on `ubuntu-latest`. ([issue](https://github.com/actions/cache/issues/689)) +- Fixes bug with Azure SDK causing blob downloads to get stuck. -### 3.0.5 +### 3.3.1 -- Removed error handling by consuming actions/cache 3.0 toolkit, Now cache server error handling will be done by toolkit. ([PR](https://github.com/actions/cache/pull/834)) +- Reduced segment size to 128MB and segment timeout to 10 minutes to fail fast in case the cache download is stuck. -### 3.0.6 +### 3.3.0 -- Fixed [#809](https://github.com/actions/cache/issues/809) - zstd -d: no such file or directory error -- Fixed [#833](https://github.com/actions/cache/issues/833) - cache doesn't work with github workspace directory +- Added option to lookup cache without downloading it. -### 3.0.7 +### 3.2.6 -- Fixed [#810](https://github.com/actions/cache/issues/810) - download stuck issue. A new timeout is introduced in the download process to abort the download if it gets stuck and doesn't finish within an hour. +- Fix zstd not being used after zstd version upgrade to 1.5.4 on hosted runners. -### 3.0.8 +### 3.2.5 -- Fix zstd not working for windows on gnu tar in issues [#888](https://github.com/actions/cache/issues/888) and [#891](https://github.com/actions/cache/issues/891). -- Allowing users to provide a custom timeout as input for aborting download of a cache segment using an environment variable `SEGMENT_DOWNLOAD_TIMEOUT_MINS`. Default is 60 minutes. +- Added fix to prevent from setting MYSYS environment variable globally. -### 3.0.9 +### 3.2.4 -- Enhanced the warning message for cache unavailablity in case of GHES. +- Added option to fail job on cache miss. -### 3.0.10 +### 3.2.3 -- Fix a bug with sorting inputs. -- Update definition for restore-keys in README.md +- Support cross os caching on Windows as an opt-in feature. +- Fix issue with symlink restoration on Windows for cross-os caches. -### 3.0.11 +### 3.2.2 -- Update toolkit version to 3.0.5 to include `@actions/core@^1.10.0` -- Update `@actions/cache` to use updated `saveState` and `setOutput` functions from `@actions/core@^1.10.0` - -### 3.1.0-beta.1 - -- Update `@actions/cache` on windows to use gnu tar and zstd by default and fallback to bsdtar and zstd if gnu tar is not available. ([issue](https://github.com/actions/cache/issues/984)) - -### 3.1.0-beta.2 - -- Added support for fallback to gzip to restore old caches on windows. - -### 3.1.0-beta.3 - -- Bug fixes for bsdtar fallback if gnutar not available and gzip fallback if cache saved using old cache action on windows. - -### 3.2.0-beta.1 - -- Added two new actions - [restore](restore/action.yml) and [save](save/action.yml) for granular control on cache. - -### 3.2.0 - -- Released the two new actions - [restore](restore/action.yml) and [save](save/action.yml) for granular control on cache +- Reverted the changes made in 3.2.1 to use gnu tar and zstd by default on windows. ### 3.2.1 @@ -79,44 +56,75 @@ - Added support for fallback to gzip to restore old caches on windows. - Added logs for cache version in case of a cache miss. -### 3.2.2 +### 3.2.0 -- Reverted the changes made in 3.2.1 to use gnu tar and zstd by default on windows. +- Released the two new actions - [restore](restore/action.yml) and [save](save/action.yml) for granular control on cache -### 3.2.3 +### 3.2.0-beta.1 -- Support cross os caching on Windows as an opt-in feature. -- Fix issue with symlink restoration on Windows for cross-os caches. +- Added two new actions - [restore](restore/action.yml) and [save](save/action.yml) for granular control on cache. -### 3.2.4 +### 3.1.0-beta.3 -- Added option to fail job on cache miss. +- Bug fixes for bsdtar fallback if gnutar not available and gzip fallback if cache saved using old cache action on windows. -### 3.2.5 +### 3.1.0-beta.2 -- Added fix to prevent from setting MYSYS environment variable globally. +- Added support for fallback to gzip to restore old caches on windows. -### 3.2.6 +### 3.1.0-beta.1 -- Fix zstd not being used after zstd version upgrade to 1.5.4 on hosted runners. +- Update `@actions/cache` on windows to use gnu tar and zstd by default and fallback to bsdtar and zstd if gnu tar is not available. ([issue](https://github.com/actions/cache/issues/984)) -### 3.3.0 +### 3.0.11 -- Added option to lookup cache without downloading it. +- Update toolkit version to 3.0.5 to include `@actions/core@^1.10.0` +- Update `@actions/cache` to use updated `saveState` and `setOutput` functions from `@actions/core@^1.10.0` -### 3.3.1 +### 3.0.10 -- Reduced segment size to 128MB and segment timeout to 10 minutes to fail fast in case the cache download is stuck. +- Fix a bug with sorting inputs. +- Update definition for restore-keys in README.md -### 3.3.2 +### 3.0.9 -- Fixes bug with Azure SDK causing blob downloads to get stuck. +- Enhanced the warning message for cache unavailablity in case of GHES. -### 3.3.3 +### 3.0.8 -- 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) +- Fix zstd not working for windows on gnu tar in issues [#888](https://github.com/actions/cache/issues/888) and [#891](https://github.com/actions/cache/issues/891). +- Allowing users to provide a custom timeout as input for aborting download of a cache segment using an environment variable `SEGMENT_DOWNLOAD_TIMEOUT_MINS`. Default is 60 minutes. -### 4.0.0 +### 3.0.7 -- Updated minimum runner version support from node 12 -> node 20 +- Fixed [#810](https://github.com/actions/cache/issues/810) - download stuck issue. A new timeout is introduced in the download process to abort the download if it gets stuck and doesn't finish within an hour. + +### 3.0.6 + +- Fixed [#809](https://github.com/actions/cache/issues/809) - zstd -d: no such file or directory error +- Fixed [#833](https://github.com/actions/cache/issues/833) - cache doesn't work with github workspace directory + +### 3.0.5 + +- Removed error handling by consuming actions/cache 3.0 toolkit, Now cache server error handling will be done by toolkit. ([PR](https://github.com/actions/cache/pull/834)) + +### 3.0.4 + +- Fixed tar creation error while trying to create tar with path as `~/` home folder on `ubuntu-latest`. ([issue](https://github.com/actions/cache/issues/689)) + +### 3.0.3 + +- Fixed avoiding empty cache save when no files are available for caching. ([issue](https://github.com/actions/cache/issues/624)) + +### 3.0.2 + +- Added support for dynamic cache size cap on GHES. + +### 3.0.1 + +- Added support for caching from GHES 3.5. +- Fixed download issue for files > 2GB during restore. + +### 3.0.0 + +- Updated minimum runner version support from node 12 -> node 16 diff --git a/__tests__/restoreImpl.test.ts b/__tests__/restoreImpl.test.ts index 2f6d3a6..c61b51b 100644 --- a/__tests__/restoreImpl.test.ts +++ b/__tests__/restoreImpl.test.ts @@ -510,3 +510,19 @@ test("restore with save-always set", async () => { "true" ); }); + +test("restore failure with earlyExit should call process exit", async () => { + testUtils.setInput(Inputs.Path, "node_modules"); + const failedMock = jest.spyOn(core, "setFailed"); + const restoreCacheMock = jest.spyOn(cache, "restoreCache"); + const processExitMock = jest.spyOn(process, "exit").mockImplementation(); + + // call restoreImpl with `earlyExit` set to true + await restoreImpl(new StateProvider(), true); + + expect(restoreCacheMock).toHaveBeenCalledTimes(0); + expect(failedMock).toHaveBeenCalledWith( + "Input required and not supplied: key" + ); + expect(processExitMock).toHaveBeenCalledWith(1); +}); diff --git a/dist/restore-only/index.js b/dist/restore-only/index.js index d1695d2..9a59ac0 100644 --- a/dist/restore-only/index.js +++ b/dist/restore-only/index.js @@ -707,7 +707,10 @@ function assertDefined(name, value) { exports.assertDefined = assertDefined; function isGhes() { const ghUrl = new URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com'); - return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; + const hostname = ghUrl.hostname.trimEnd().toUpperCase(); + const isGitHubHost = hostname === 'GITHUB.COM'; + const isGheHost = hostname.endsWith('.GHE.COM') || hostname.endsWith('.GHE.LOCALHOST'); + return !isGitHubHost && !isGheHost; } exports.isGhes = isGhes; //# sourceMappingURL=cacheUtils.js.map @@ -59389,7 +59392,7 @@ const core = __importStar(__nccwpck_require__(2186)); const constants_1 = __nccwpck_require__(9042); const stateProvider_1 = __nccwpck_require__(1527); const utils = __importStar(__nccwpck_require__(6850)); -function restoreImpl(stateProvider) { +function restoreImpl(stateProvider, earlyExit) { return __awaiter(this, void 0, void 0, function* () { try { if (!utils.isCacheFeatureAvailable()) { @@ -59435,21 +59438,16 @@ function restoreImpl(stateProvider) { } catch (error) { core.setFailed(error.message); + if (earlyExit) { + process.exit(1); + } } }); } exports.restoreImpl = restoreImpl; function run(stateProvider, earlyExit) { return __awaiter(this, void 0, void 0, function* () { - try { - yield restoreImpl(stateProvider); - } - catch (err) { - console.error(err); - if (earlyExit) { - process.exit(1); - } - } + yield restoreImpl(stateProvider, earlyExit); // 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 diff --git a/dist/restore/index.js b/dist/restore/index.js index f32c494..03a12b5 100644 --- a/dist/restore/index.js +++ b/dist/restore/index.js @@ -707,7 +707,10 @@ function assertDefined(name, value) { exports.assertDefined = assertDefined; function isGhes() { const ghUrl = new URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com'); - return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; + const hostname = ghUrl.hostname.trimEnd().toUpperCase(); + const isGitHubHost = hostname === 'GITHUB.COM'; + const isGheHost = hostname.endsWith('.GHE.COM') || hostname.endsWith('.GHE.LOCALHOST'); + return !isGitHubHost && !isGheHost; } exports.isGhes = isGhes; //# sourceMappingURL=cacheUtils.js.map @@ -59389,7 +59392,7 @@ const core = __importStar(__nccwpck_require__(2186)); const constants_1 = __nccwpck_require__(9042); const stateProvider_1 = __nccwpck_require__(1527); const utils = __importStar(__nccwpck_require__(6850)); -function restoreImpl(stateProvider) { +function restoreImpl(stateProvider, earlyExit) { return __awaiter(this, void 0, void 0, function* () { try { if (!utils.isCacheFeatureAvailable()) { @@ -59435,21 +59438,16 @@ function restoreImpl(stateProvider) { } catch (error) { core.setFailed(error.message); + if (earlyExit) { + process.exit(1); + } } }); } exports.restoreImpl = restoreImpl; function run(stateProvider, earlyExit) { return __awaiter(this, void 0, void 0, function* () { - try { - yield restoreImpl(stateProvider); - } - catch (err) { - console.error(err); - if (earlyExit) { - process.exit(1); - } - } + yield restoreImpl(stateProvider, earlyExit); // 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 diff --git a/dist/save-only/index.js b/dist/save-only/index.js index e590b47..f542b2c 100644 --- a/dist/save-only/index.js +++ b/dist/save-only/index.js @@ -707,7 +707,10 @@ function assertDefined(name, value) { exports.assertDefined = assertDefined; function isGhes() { const ghUrl = new URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com'); - return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; + const hostname = ghUrl.hostname.trimEnd().toUpperCase(); + const isGitHubHost = hostname === 'GITHUB.COM'; + const isGheHost = hostname.endsWith('.GHE.COM') || hostname.endsWith('.GHE.LOCALHOST'); + return !isGitHubHost && !isGheHost; } exports.isGhes = isGhes; //# sourceMappingURL=cacheUtils.js.map diff --git a/dist/save/index.js b/dist/save/index.js index c27f5f8..f137655 100644 --- a/dist/save/index.js +++ b/dist/save/index.js @@ -707,7 +707,10 @@ function assertDefined(name, value) { exports.assertDefined = assertDefined; function isGhes() { const ghUrl = new URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com'); - return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; + const hostname = ghUrl.hostname.trimEnd().toUpperCase(); + const isGitHubHost = hostname === 'GITHUB.COM'; + const isGheHost = hostname.endsWith('.GHE.COM') || hostname.endsWith('.GHE.LOCALHOST'); + return !isGitHubHost && !isGheHost; } exports.isGhes = isGhes; //# sourceMappingURL=cacheUtils.js.map diff --git a/package-lock.json b/package-lock.json index 3a3b441..a232507 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cache", - "version": "4.0.0", + "version": "4.0.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cache", - "version": "4.0.0", + "version": "4.0.2", "license": "MIT", "dependencies": { "@actions/cache": "^3.2.3", @@ -36,9 +36,9 @@ } }, "node_modules/@actions/cache": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-3.2.3.tgz", - "integrity": "sha512-m8KvmcD+JxSLOfNUXuBF2jL0Lp+co/Fhbf0NTt0M9lz61WnXRdqpIGrOvTRZmKIl+7HaHil6kGE3fkEfrKQCQA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-3.2.4.tgz", + "integrity": "sha512-RuHnwfcDagtX+37s0ZWy7clbOfnZ7AlDJQ7k/9rzt2W4Gnwde3fa/qjSjVuz4vLcLIpc7fUob27CMrqiWZytYA==", "dependencies": { "@actions/core": "^1.10.0", "@actions/exec": "^1.0.1", @@ -9533,9 +9533,9 @@ }, "dependencies": { "@actions/cache": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-3.2.3.tgz", - "integrity": "sha512-m8KvmcD+JxSLOfNUXuBF2jL0Lp+co/Fhbf0NTt0M9lz61WnXRdqpIGrOvTRZmKIl+7HaHil6kGE3fkEfrKQCQA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-3.2.4.tgz", + "integrity": "sha512-RuHnwfcDagtX+37s0ZWy7clbOfnZ7AlDJQ7k/9rzt2W4Gnwde3fa/qjSjVuz4vLcLIpc7fUob27CMrqiWZytYA==", "requires": { "@actions/core": "^1.10.0", "@actions/exec": "^1.0.1", diff --git a/package.json b/package.json index 2a4391e..7468af5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cache", - "version": "4.0.0", + "version": "4.0.2", "private": true, "description": "Cache dependencies and build outputs", "main": "dist/restore/index.js", diff --git a/src/restoreImpl.ts b/src/restoreImpl.ts index 2582f38..b71a0bd 100644 --- a/src/restoreImpl.ts +++ b/src/restoreImpl.ts @@ -10,7 +10,8 @@ import { import * as utils from "./utils/actionUtils"; export async function restoreImpl( - stateProvider: IStateProvider + stateProvider: IStateProvider, + earlyExit?: boolean | undefined ): Promise { core.setOutput( Outputs.SaveAlways, @@ -88,6 +89,9 @@ export async function restoreImpl( return cacheKey; } catch (error: unknown) { core.setFailed((error as Error).message); + if (earlyExit) { + process.exit(1); + } } } @@ -95,14 +99,7 @@ async function run( stateProvider: IStateProvider, earlyExit: boolean | undefined ): Promise { - try { - await restoreImpl(stateProvider); - } catch (err) { - console.error(err); - if (earlyExit) { - process.exit(1); - } - } + await restoreImpl(stateProvider, earlyExit); // node will stay alive if any promises are not resolved, // which is a possibility if HTTP requests are dangling