diff --git a/packages/cache/RELEASES.md b/packages/cache/RELEASES.md index 43566ef155..bb14ed1bd8 100644 --- a/packages/cache/RELEASES.md +++ b/packages/cache/RELEASES.md @@ -1,9 +1,14 @@ # @actions/cache Releases +### 3.3.0 + +- Add support for zstd adapt mode. [#1772](https://github.com/actions/toolkit/pull/1772) +- Unlock zstd long mode. [#1772](https://github.com/actions/toolkit/pull/1772) + ### 3.2.4 - Updated `isGhes` check to include `.ghe.com` and `.ghe.localhost` as accepted hosts - + ### 3.2.3 - Fixed a bug that mutated path arguments to `getCacheVersion` [#1378](https://github.com/actions/toolkit/pull/1378) @@ -160,11 +165,11 @@ ### 0.2.1 - Fix to await async function getCompressionMethod - + ### 0.2.0 - Fixes issues with the zstd compression algorithm on Windows and Ubuntu 16.04 [#469](https://github.com/actions/toolkit/pull/469) - + ### 0.1.0 - Initial release diff --git a/packages/cache/__tests__/tar.test.ts b/packages/cache/__tests__/tar.test.ts index 4145d9a946..1e40f2b3ee 100644 --- a/packages/cache/__tests__/tar.test.ts +++ b/packages/cache/__tests__/tar.test.ts @@ -71,10 +71,7 @@ test('zstd extract tar', async () => { ] .concat(IS_WINDOWS ? ['--force-local'] : []) .concat(IS_MAC ? ['--delay-directory-restore'] : []) - .concat([ - '--use-compress-program', - IS_WINDOWS ? '"zstd -d --long=30"' : 'unzstd --long=30' - ]) + .concat(['--use-compress-program', '"zstd -d --long=30"']) .join(' '), undefined, { @@ -231,10 +228,7 @@ test('zstd create tar', async () => { ] .concat(IS_WINDOWS ? ['--force-local'] : []) .concat(IS_MAC ? ['--delay-directory-restore'] : []) - .concat([ - '--use-compress-program', - IS_WINDOWS ? '"zstd -T0 --long=30"' : 'zstdmt --long=30' - ]) + .concat(['--use-compress-program', '"zstd -T0 --adapt --long=30"']) .join(' '), undefined, // args { @@ -292,7 +286,7 @@ test('zstd create tar with windows BSDtar', async () => { expect(execMock).toHaveBeenNthCalledWith( 2, [ - 'zstd -T0 --long=30 --force -o', + 'zstd -T0 --adapt --long=30 --force -o', CacheFilename.Zstd.replace(/\\/g, '/'), TarFilename.replace(/\\/g, '/') ].join(' '), @@ -365,10 +359,7 @@ test('zstd list tar', async () => { ] .concat(IS_WINDOWS ? ['--force-local'] : []) .concat(IS_MAC ? ['--delay-directory-restore'] : []) - .concat([ - '--use-compress-program', - IS_WINDOWS ? '"zstd -d --long=30"' : 'unzstd --long=30' - ]) + .concat(['--use-compress-program', '"zstd -d --long=30"']) .join(' '), undefined, { @@ -442,7 +433,7 @@ test('zstdWithoutLong list tar', async () => { ] .concat(IS_WINDOWS ? ['--force-local'] : []) .concat(IS_MAC ? ['--delay-directory-restore'] : []) - .concat(['--use-compress-program', IS_WINDOWS ? '"zstd -d"' : 'unzstd']) + .concat(['--use-compress-program', '"zstd -d"']) .join(' '), undefined, { diff --git a/packages/cache/src/internal/cacheUtils.ts b/packages/cache/src/internal/cacheUtils.ts index 91bae9a8db..69874e61fa 100644 --- a/packages/cache/src/internal/cacheUtils.ts +++ b/packages/cache/src/internal/cacheUtils.ts @@ -102,10 +102,14 @@ export async function getCompressionMethod(): Promise { const version = semver.clean(versionOutput) core.debug(`zstd version: ${version}`) - if (versionOutput === '') { + if (version === null) { return CompressionMethod.Gzip - } else { + } else if (semver.lt(version, '1.3.2')) { return CompressionMethod.ZstdWithoutLong + } else if (semver.lt(version, '1.3.6')) { + return CompressionMethod.ZstdWithoutAdapt + } else { + return CompressionMethod.Zstd } } diff --git a/packages/cache/src/internal/constants.ts b/packages/cache/src/internal/constants.ts index 4dbff574a0..c4f8cd36c7 100644 --- a/packages/cache/src/internal/constants.ts +++ b/packages/cache/src/internal/constants.ts @@ -6,8 +6,11 @@ export enum CacheFilename { export enum CompressionMethod { Gzip = 'gzip', // Long range mode was added to zstd in v1.3.2. - // This enum is for earlier version of zstd that does not have --long support + // https://github.com/facebook/zstd/releases/tag/v1.3.2 ZstdWithoutLong = 'zstd-without-long', + // Adapt mode was added to zstd in v1.3.6. + // https://github.com/facebook/zstd/releases/tag/v1.3.6 + ZstdWithoutAdapt = 'zstd-without-adapt', Zstd = 'zstd' } diff --git a/packages/cache/src/internal/tar.ts b/packages/cache/src/internal/tar.ts index adf610694f..c3b9de45ee 100644 --- a/packages/cache/src/internal/tar.ts +++ b/packages/cache/src/internal/tar.ts @@ -172,7 +172,6 @@ async function getDecompressionProgram( archivePath: string ): Promise { // -d: Decompress. - // unzstd is equivalent to 'zstd -d' // --long=#: Enables long distance matching with # bits. Maximum is 30 (1GB) on 32-bit OS and 31 (2GB) on 64-bit. // Using 30 here because we also support 32-bit self-hosted runners. const BSD_TAR_ZSTD = @@ -187,10 +186,7 @@ async function getDecompressionProgram( TarFilename, archivePath.replace(new RegExp(`\\${path.sep}`, 'g'), '/') ] - : [ - '--use-compress-program', - IS_WINDOWS ? '"zstd -d --long=30"' : 'unzstd --long=30' - ] + : ['--use-compress-program', '"zstd -d --long=30"'] case CompressionMethod.ZstdWithoutLong: return BSD_TAR_ZSTD ? [ @@ -198,7 +194,7 @@ async function getDecompressionProgram( TarFilename, archivePath.replace(new RegExp(`\\${path.sep}`, 'g'), '/') ] - : ['--use-compress-program', IS_WINDOWS ? '"zstd -d"' : 'unzstd'] + : ['--use-compress-program', '"zstd -d"'] default: return ['-z'] } @@ -206,7 +202,7 @@ async function getDecompressionProgram( // Used for creating the archive // -T#: Compress using # working thread. If # is 0, attempt to detect and use the number of physical CPU cores. -// zstdmt is equivalent to 'zstd -T0' +// --adapt: Dynamically adapt compression level to I/O conditions. // --long=#: Enables long distance matching with # bits. Maximum is 30 (1GB) on 32-bit OS and 31 (2GB) on 64-bit. // Using 30 here because we also support 32-bit self-hosted runners. // Long range mode is added to zstd in v1.3.2 release, so we will not use --long in older version of zstd. @@ -223,14 +219,19 @@ async function getCompressionProgram( case CompressionMethod.Zstd: return BSD_TAR_ZSTD ? [ - 'zstd -T0 --long=30 --force -o', + 'zstd -T0 --adapt --long=30 --force -o', cacheFileName.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), TarFilename ] - : [ - '--use-compress-program', - IS_WINDOWS ? '"zstd -T0 --long=30"' : 'zstdmt --long=30' + : ['--use-compress-program', '"zstd -T0 --adapt --long=30"'] + case CompressionMethod.ZstdWithoutAdapt: + return BSD_TAR_ZSTD + ? [ + 'zstd -T0 --long=30 --force -o', + cacheFileName.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), + TarFilename ] + : ['--use-compress-program', '"zstd -T0 --long=30"'] case CompressionMethod.ZstdWithoutLong: return BSD_TAR_ZSTD ? [ @@ -238,7 +239,7 @@ async function getCompressionProgram( cacheFileName.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), TarFilename ] - : ['--use-compress-program', IS_WINDOWS ? '"zstd -T0"' : 'zstdmt'] + : ['--use-compress-program', '"zstd -T0"'] default: return ['-z'] }