diff --git a/README.md b/README.md index 36f0d09..8360061 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ steps: - uses: actions/checkout@v3 - uses: actions/setup-go@v3 with: - go-version: '1.14' + go-version: '1.17' check-latest: true cache: true - run: go run hello.go @@ -117,7 +117,7 @@ steps: - uses: actions/checkout@v3 - uses: actions/setup-go@v3 with: - go-version: '1.14' + go-version: '1.17' check-latest: true cache: true cache-dependency-path: subdir/go.sum diff --git a/__tests__/cache-utils.test.ts b/__tests__/cache-utils.test.ts index b9c8ff9..9210d4c 100644 --- a/__tests__/cache-utils.test.ts +++ b/__tests__/cache-utils.test.ts @@ -1,4 +1,6 @@ import * as exec from '@actions/exec'; +import * as cache from '@actions/cache'; +import * as core from '@actions/core'; import * as cacheUtils from '../src/cache-utils'; import {PackageManagerInfo} from '../src/package-managers'; @@ -104,3 +106,74 @@ describe('getCacheDirectoryPath', () => { }).rejects.toThrow(); }); }); + +describe('isCacheFeatureAvailable', () => { + //Arrange + let isFeatureAvailableSpy = jest.spyOn(cache, 'isFeatureAvailable'); + let warningSpy = jest.spyOn(core, 'warning'); + + it('should return true when cache feature is available', () => { + //Arrange + isFeatureAvailableSpy.mockImplementation(() => { + return true; + }); + + let functionResult; + + //Act + functionResult = cacheUtils.isCacheFeatureAvailable(); + + //Assert + expect(functionResult).toBeTruthy(); + }); + + it('should warn when cache feature is unavailable and GHES is not used ', () => { + //Arrange + isFeatureAvailableSpy.mockImplementation(() => { + return false; + }); + + process.env['GITHUB_SERVER_URL'] = 'https://github.com'; + + let warningMessage = + 'The runner was not able to contact the cache service. Caching will be skipped'; + + //Act + cacheUtils.isCacheFeatureAvailable(); + + //Assert + expect(warningSpy).toHaveBeenCalledWith(warningMessage); + }); + + it('should return false when cache feature is unavailable', () => { + //Arrange + isFeatureAvailableSpy.mockImplementation(() => { + return false; + }); + + process.env['GITHUB_SERVER_URL'] = 'https://github.com'; + + let functionResult; + + //Act + functionResult = cacheUtils.isCacheFeatureAvailable(); + + //Assert + expect(functionResult).toBeFalsy(); + }); + + it('should throw when cache feature is unavailable and GHES is used', () => { + //Arrange + isFeatureAvailableSpy.mockImplementation(() => { + return false; + }); + + process.env['GITHUB_SERVER_URL'] = 'https://nongithub.com'; + + let errorMessage = + 'Cache action is only supported on GHES version >= 3.5. If you are on version >=3.5 Please check with GHES admin if Actions cache service is enabled or not.'; + + //Act + Assert + expect(() => cacheUtils.isCacheFeatureAvailable()).toThrow(errorMessage); + }); +}); diff --git a/action.yml b/action.yml index 00f5a35..01fb7d5 100644 --- a/action.yml +++ b/action.yml @@ -12,11 +12,14 @@ inputs: default: ${{ github.token }} cache: description: Used to specify whether go-modules caching is needed. Set to true, if you'd like to enable caching. + default: false cache-dependency-path: description: 'Used to specify the path to a dependency file - go.sum' +outputs: + cache-hit: + description: 'A boolean value to indicate if a cache was hit' runs: using: 'node16' main: 'dist/setup/index.js' post: 'dist/cache-save/index.js' post-if: success() - diff --git a/dist/cache-save/index.js b/dist/cache-save/index.js index 210f0e3..047a62d 100644 --- a/dist/cache-save/index.js +++ b/dist/cache-save/index.js @@ -3924,7 +3924,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.getCacheDirectoryPath = exports.getPackageManagerInfo = exports.getCommandOutput = void 0; +exports.isCacheFeatureAvailable = exports.isGhes = exports.getCacheDirectoryPath = exports.getPackageManagerInfo = exports.getCommandOutput = void 0; +const cache = __importStar(__webpack_require__(692)); +const core = __importStar(__webpack_require__(470)); const exec = __importStar(__webpack_require__(986)); const package_managers_1 = __webpack_require__(813); exports.getCommandOutput = (toolCommand) => __awaiter(void 0, void 0, void 0, function* () { @@ -3951,6 +3953,24 @@ exports.getCacheDirectoryPath = (packageManagerInfo) => __awaiter(void 0, void 0 } return stdout; }); +function isGhes() { + const ghUrl = new URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com'); + return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; +} +exports.isGhes = isGhes; +function isCacheFeatureAvailable() { + if (!cache.isFeatureAvailable()) { + if (isGhes()) { + throw new Error('Cache action is only supported on GHES version >= 3.5. If you are on version >=3.5 Please check with GHES admin if Actions cache service is enabled or not.'); + } + else { + core.warning('The runner was not able to contact the cache service. Caching will be skipped'); + } + return false; + } + return true; +} +exports.isCacheFeatureAvailable = isCacheFeatureAvailable; /***/ }), @@ -46376,11 +46396,11 @@ function run() { } exports.run = run; const cachePackages = () => __awaiter(void 0, void 0, void 0, function* () { - const cacheInput = core.getInput('cache'); + const cacheInput = core.getBooleanInput('cache'); if (!cacheInput) { return; } - const packageManager = cacheInput.toUpperCase() === 'TRUE' ? 'default' : cacheInput; + const packageManager = 'default'; const state = core.getState(constants_1.State.CacheMatchedKey); const primaryKey = core.getState(constants_1.State.CachePrimaryKey); const packageManagerInfo = yield cache_utils_1.getPackageManagerInfo(packageManager); diff --git a/dist/setup/index.js b/dist/setup/index.js index 492d07f..83f9a0b 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -3689,9 +3689,9 @@ const installer = __importStar(__webpack_require__(923)); const semver = __importStar(__webpack_require__(280)); const path_1 = __importDefault(__webpack_require__(622)); const cache_restore_1 = __webpack_require__(409); +const cache_utils_1 = __webpack_require__(143); const child_process_1 = __importDefault(__webpack_require__(129)); const fs_1 = __importDefault(__webpack_require__(747)); -const url_1 = __webpack_require__(835); function run() { return __awaiter(this, void 0, void 0, function* () { try { @@ -3700,11 +3700,11 @@ function run() { // If not supplied then problem matchers will still be setup. Useful for self-hosted. // let versionSpec = core.getInput('go-version'); - const cache = core.getInput('cache'); + const cache = core.getBooleanInput('cache'); core.info(`Setup go version spec ${versionSpec}`); if (versionSpec) { let token = core.getInput('token'); - let auth = !token || isGhes() ? undefined : `token ${token}`; + let auth = !token || cache_utils_1.isGhes() ? undefined : `token ${token}`; const checkLatest = core.getBooleanInput('check-latest'); const installDir = yield installer.getGo(versionSpec, checkLatest, auth); core.addPath(path_1.default.join(installDir, 'bin')); @@ -3719,11 +3719,8 @@ function run() { core.debug(`add bin ${added}`); core.info(`Successfully setup go version ${versionSpec}`); } - if (cache) { - if (isGhes()) { - throw new Error('Caching is not supported on GHES'); - } - const packageManager = cache.toUpperCase() === 'TRUE' ? 'default' : cache; + if (cache && cache_utils_1.isCacheFeatureAvailable()) { + const packageManager = 'default'; const cacheDependencyPath = core.getInput('cache-dependency-path'); yield cache_restore_1.restoreCache(packageManager, cacheDependencyPath); } @@ -3775,10 +3772,6 @@ function addBinToPath() { }); } exports.addBinToPath = addBinToPath; -function isGhes() { - const ghUrl = new url_1.URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com'); - return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; -} /***/ }), @@ -4171,7 +4164,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.getCacheDirectoryPath = exports.getPackageManagerInfo = exports.getCommandOutput = void 0; +exports.isCacheFeatureAvailable = exports.isGhes = exports.getCacheDirectoryPath = exports.getPackageManagerInfo = exports.getCommandOutput = void 0; +const cache = __importStar(__webpack_require__(692)); +const core = __importStar(__webpack_require__(470)); const exec = __importStar(__webpack_require__(986)); const package_managers_1 = __webpack_require__(813); exports.getCommandOutput = (toolCommand) => __awaiter(void 0, void 0, void 0, function* () { @@ -4198,6 +4193,24 @@ exports.getCacheDirectoryPath = (packageManagerInfo) => __awaiter(void 0, void 0 } return stdout; }); +function isGhes() { + const ghUrl = new URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com'); + return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; +} +exports.isGhes = isGhes; +function isCacheFeatureAvailable() { + if (!cache.isFeatureAvailable()) { + if (isGhes()) { + throw new Error('Cache action is only supported on GHES version >= 3.5. If you are on version >=3.5 Please check with GHES admin if Actions cache service is enabled or not.'); + } + else { + core.warning('The runner was not able to contact the cache service. Caching will be skipped'); + } + return false; + } + return true; +} +exports.isCacheFeatureAvailable = isCacheFeatureAvailable; /***/ }), @@ -34244,6 +34257,7 @@ const cache_utils_1 = __webpack_require__(143); exports.restoreCache = (packageManager, cacheDependencyPath) => __awaiter(void 0, void 0, void 0, function* () { const packageManagerInfo = yield cache_utils_1.getPackageManagerInfo(packageManager); const platform = process.env.RUNNER_OS; + const versionSpec = core.getInput('go-version'); const cachePath = yield cache_utils_1.getCacheDirectoryPath(packageManagerInfo); const dependencyFilePath = cacheDependencyPath ? cacheDependencyPath @@ -34252,7 +34266,7 @@ exports.restoreCache = (packageManager, cacheDependencyPath) => __awaiter(void 0 if (!fileHash) { throw new Error('Some specified paths were not resolved, unable to cache dependencies.'); } - const primaryKey = `go-cache-${platform}-${fileHash}`; + const primaryKey = `${platform}-go${versionSpec}-${fileHash}`; core.debug(`primary key is ${primaryKey}`); core.saveState(constants_1.State.CachePrimaryKey, primaryKey); const cacheKey = yield cache.restoreCache([cachePath], primaryKey); diff --git a/package.json b/package.json index a3ba93c..345f3af 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "author": "GitHub", "license": "MIT", "dependencies": { - "@actions/cache": "^2.0.0", + "@actions/cache": "^2.0.2", "@actions/core": "^1.6.0", "@actions/exec": "^1.1.0", "@actions/glob": "^0.2.0", diff --git a/src/cache-restore.ts b/src/cache-restore.ts index 08438b5..b3769fa 100644 --- a/src/cache-restore.ts +++ b/src/cache-restore.ts @@ -14,6 +14,7 @@ export const restoreCache = async ( ) => { const packageManagerInfo = await getPackageManagerInfo(packageManager); const platform = process.env.RUNNER_OS; + const versionSpec = core.getInput('go-version'); const cachePath = await getCacheDirectoryPath(packageManagerInfo); @@ -28,7 +29,7 @@ export const restoreCache = async ( ); } - const primaryKey = `go-cache-${platform}-${fileHash}`; + const primaryKey = `${platform}-go${versionSpec}-${fileHash}`; core.debug(`primary key is ${primaryKey}`); core.saveState(State.CachePrimaryKey, primaryKey); diff --git a/src/cache-save.ts b/src/cache-save.ts index 4f2afae..7e3c5b2 100644 --- a/src/cache-save.ts +++ b/src/cache-save.ts @@ -21,13 +21,12 @@ export async function run() { } const cachePackages = async () => { - const cacheInput = core.getInput('cache'); + const cacheInput = core.getBooleanInput('cache'); if (!cacheInput) { return; } - const packageManager = - cacheInput.toUpperCase() === 'TRUE' ? 'default' : cacheInput; + const packageManager = 'default'; const state = core.getState(State.CacheMatchedKey); const primaryKey = core.getState(State.CachePrimaryKey); diff --git a/src/cache-utils.ts b/src/cache-utils.ts index 13324c3..c5fed4c 100644 --- a/src/cache-utils.ts +++ b/src/cache-utils.ts @@ -1,3 +1,5 @@ +import * as cache from '@actions/cache'; +import * as core from '@actions/core'; import * as exec from '@actions/exec'; import {supportedPackageManagers, PackageManagerInfo} from './package-managers'; @@ -42,3 +44,28 @@ export const getCacheDirectoryPath = async ( return stdout; }; + +export function isGhes(): boolean { + const ghUrl = new URL( + process.env['GITHUB_SERVER_URL'] || 'https://github.com' + ); + return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; +} + +export function isCacheFeatureAvailable(): boolean { + if (!cache.isFeatureAvailable()) { + if (isGhes()) { + throw new Error( + 'Cache action is only supported on GHES version >= 3.5. If you are on version >=3.5 Please check with GHES admin if Actions cache service is enabled or not.' + ); + } else { + core.warning( + 'The runner was not able to contact the cache service. Caching will be skipped' + ); + } + + return false; + } + + return true; +} diff --git a/src/main.ts b/src/main.ts index 21f8ef6..22bb7bc 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,9 +4,9 @@ import * as installer from './installer'; import * as semver from 'semver'; import path from 'path'; import {restoreCache} from './cache-restore'; +import {isGhes, isCacheFeatureAvailable} from './cache-utils'; import cp from 'child_process'; import fs from 'fs'; -import {URL} from 'url'; export async function run() { try { @@ -16,7 +16,7 @@ export async function run() { // let versionSpec = core.getInput('go-version'); - const cache = core.getInput('cache'); + const cache = core.getBooleanInput('cache'); core.info(`Setup go version spec ${versionSpec}`); if (versionSpec) { @@ -41,11 +41,8 @@ export async function run() { core.info(`Successfully setup go version ${versionSpec}`); } - if (cache) { - if (isGhes()) { - throw new Error('Caching is not supported on GHES'); - } - const packageManager = cache.toUpperCase() === 'TRUE' ? 'default' : cache; + if (cache && isCacheFeatureAvailable()) { + const packageManager = 'default'; const cacheDependencyPath = core.getInput('cache-dependency-path'); await restoreCache(packageManager, cacheDependencyPath); } @@ -98,10 +95,3 @@ export async function addBinToPath(): Promise { } return added; } - -function isGhes(): boolean { - const ghUrl = new URL( - process.env['GITHUB_SERVER_URL'] || 'https://github.com' - ); - return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; -}