Compare commits

...

10 Commits

Author SHA1 Message Date
Sergey Dolin
5cfefff9bb
Merge efdf435b25 into 883490dfd0 2023-08-30 06:13:20 -07:00
Marko Zivic
883490dfd0
Merge pull request #417 from artemgavrilov/main
Improve documentation regarding dependencies caching
2023-08-30 09:35:35 +02:00
Artem Gavrilov
d45ebba0ce
Rephrase sentence
Co-authored-by: Ivan <98037481+IvanZosimov@users.noreply.github.com>
2023-08-29 15:43:02 +02:00
Artem Gavrilov
317c6617fa
Replace wildcards term with globs. 2023-08-28 12:47:43 +02:00
Artem Gavrilov
f90673ad64
Merge pull request #1 from artemgavrilov/caching-docs-improvement
Improve documentation regarding dependencies caching
2023-08-25 12:37:15 +02:00
Artem Gavrilov
8018234347
Improve documentation regarding dependencies cachin 2023-08-25 12:31:19 +02:00
Sergey Dolin
efdf435b25 Fix lint warning 2023-08-18 14:20:24 +02:00
Sergey Dolin
deaf43692d Add unit tests 2023-08-18 09:01:34 +02:00
Sergey Dolin
6f72b31c94 Update docs 2023-08-17 18:30:41 +02:00
Sergey Dolin
8b0dfa3b5d Set default cache input to false for self-hosted runners 2023-08-17 18:16:38 +02:00
10 changed files with 147 additions and 26 deletions

View File

@ -159,7 +159,7 @@ The `cache` input is optional, and caching is turned on by default.
The action defaults to search for the dependency file - go.sum in the repository root, and uses its hash as a part of
the cache key. Use `cache-dependency-path` input for cases when multiple dependency files are used, or they are located
in different subdirectories.
in different subdirectories. The input supports glob patterns.
If some problem that prevents success caching happens then the action issues the warning in the log and continues the execution of the pipeline.
@ -172,7 +172,11 @@ steps:
with:
go-version: '1.17'
check-latest: true
cache-dependency-path: subdir/go.sum
cache-dependency-path: |
subdir/go.sum
tools/go.sum
# cache-dependency-path: "**/*.sum"
- run: go run hello.go
```

View File

@ -3,6 +3,7 @@ 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';
import * as utils from '../src/utils';
describe('getCommandOutput', () => {
//Arrange
@ -209,3 +210,76 @@ describe('isCacheFeatureAvailable', () => {
expect(warningSpy).toHaveBeenCalledWith(warningMessage);
});
});
describe('Detect environment', () => {
it('"RUNNER_ENVIRONMENT" = "github-hosted" should be hosted environment', () => {
delete process.env['AGENT_ISSELFHOSTED'];
process.env['RUNNER_ENVIRONMENT'] = 'github-hosted';
expect(utils.isSelfHosted()).toBeFalsy();
});
it('"RUNNER_ENVIRONMENT" = "hosted" should be self-hosted environment', () => {
delete process.env['AGENT_ISSELFHOSTED'];
process.env['RUNNER_ENVIRONMENT'] = 'hosted';
expect(utils.isSelfHosted()).toBeTruthy();
});
it('"AGENT_ISSELFHOSTED" = "0" should be hosted environment', () => {
process.env['AGENT_ISSELFHOSTED'] = '0';
delete process.env['RUNNER_ENVIRONMENT'];
expect(utils.isSelfHosted()).toBeFalsy();
});
it('"AGENT_ISSELFHOSTED" = "0" should be self-hosted environment', () => {
process.env['AGENT_ISSELFHOSTED'] = '1';
delete process.env['RUNNER_ENVIRONMENT'];
expect(utils.isSelfHosted()).toBeTruthy();
});
it('unset "RUNNER_ENVIRONMENT" and "AGENT_ISSELFHOSTED" should be self-hosted environment', () => {
delete process.env['AGENT_ISSELFHOSTED'];
delete process.env['RUNNER_ENVIRONMENT'];
expect(utils.isSelfHosted()).toBeTruthy();
});
});
describe('Default cache values', () => {
const inputSpy = jest.spyOn(utils, 'isSelfHosted');
beforeEach(() => {
delete process.env['INPUT_CACHE'];
});
it('default cache should be false in self-hosted environment', () => {
inputSpy.mockReturnValueOnce(true);
expect(cacheUtils.getCacheInput()).toBeFalsy();
});
it('cache should be false if set to false in self-hosted environment', () => {
inputSpy.mockReturnValueOnce(true);
process.env['INPUT_CACHE'] = 'false';
expect(cacheUtils.getCacheInput()).toBeFalsy();
});
it('cache should be tue if set to true in self-hosted environment', () => {
inputSpy.mockReturnValueOnce(true);
process.env['INPUT_CACHE'] = 'true';
expect(cacheUtils.getCacheInput()).toBeTruthy();
});
it('default cache should be handled by action.yml default in hosted environment', () => {
inputSpy.mockReturnValueOnce(false);
expect(() => cacheUtils.getCacheInput()).toThrow();
});
it('cache should be false if set to false in hosted environment', () => {
inputSpy.mockReturnValueOnce(false);
process.env['INPUT_CACHE'] = 'true';
expect(cacheUtils.getCacheInput()).toBeTruthy();
});
it('cache should be tue if set to true in hosted environment', () => {
inputSpy.mockReturnValueOnce(false);
process.env['INPUT_CACHE'] = 'false';
expect(cacheUtils.getCacheInput()).toBeFalsy();
});
});

View File

@ -58521,10 +58521,8 @@ function run() {
}
exports.run = run;
const cachePackages = () => __awaiter(void 0, void 0, void 0, function* () {
const cacheInput = core.getBooleanInput('cache');
if (!cacheInput) {
if (!cache_utils_1.getCacheInput())
return;
}
const packageManager = 'default';
const state = core.getState(constants_1.State.CacheMatchedKey);
const primaryKey = core.getState(constants_1.State.CachePrimaryKey);
@ -58595,11 +58593,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
});
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.isCacheFeatureAvailable = exports.isGhes = exports.getCacheDirectoryPath = exports.getPackageManagerInfo = exports.getCommandOutput = void 0;
exports.getCacheInput = exports.isCacheFeatureAvailable = exports.isGhes = exports.getCacheDirectoryPath = exports.getPackageManagerInfo = exports.getCommandOutput = void 0;
const cache = __importStar(__nccwpck_require__(7799));
const core = __importStar(__nccwpck_require__(2186));
const exec = __importStar(__nccwpck_require__(1514));
const package_managers_1 = __nccwpck_require__(6663);
const utils_1 = __nccwpck_require__(1314);
const getCommandOutput = (toolCommand) => __awaiter(void 0, void 0, void 0, function* () {
let { stdout, stderr, exitCode } = yield exec.getExecOutput(toolCommand, undefined, { ignoreReturnCode: true });
if (exitCode) {
@ -58654,6 +58653,13 @@ function isCacheFeatureAvailable() {
return false;
}
exports.isCacheFeatureAvailable = isCacheFeatureAvailable;
const getCacheInput = () => {
// for self-hosted environment turn off cache by default
if (utils_1.isSelfHosted() && core.getInput('cache') === '')
return false;
return core.getBooleanInput('cache');
};
exports.getCacheInput = getCacheInput;
/***/ }),
@ -58693,6 +58699,25 @@ exports.supportedPackageManagers = {
};
/***/ }),
/***/ 1314:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.isSelfHosted = exports.StableReleaseAlias = void 0;
var StableReleaseAlias;
(function (StableReleaseAlias) {
StableReleaseAlias["Stable"] = "stable";
StableReleaseAlias["OldStable"] = "oldstable";
})(StableReleaseAlias = exports.StableReleaseAlias || (exports.StableReleaseAlias = {}));
const isSelfHosted = () => process.env['RUNNER_ENVIRONMENT'] !== 'github-hosted' &&
process.env['AGENT_ISSELFHOSTED'] !== '0';
exports.isSelfHosted = isSelfHosted;
/***/ }),
/***/ 2877:

20
dist/setup/index.js vendored
View File

@ -61265,11 +61265,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
});
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.isCacheFeatureAvailable = exports.isGhes = exports.getCacheDirectoryPath = exports.getPackageManagerInfo = exports.getCommandOutput = void 0;
exports.getCacheInput = exports.isCacheFeatureAvailable = exports.isGhes = exports.getCacheDirectoryPath = exports.getPackageManagerInfo = exports.getCommandOutput = void 0;
const cache = __importStar(__nccwpck_require__(7799));
const core = __importStar(__nccwpck_require__(2186));
const exec = __importStar(__nccwpck_require__(1514));
const package_managers_1 = __nccwpck_require__(6663);
const utils_1 = __nccwpck_require__(1314);
const getCommandOutput = (toolCommand) => __awaiter(void 0, void 0, void 0, function* () {
let { stdout, stderr, exitCode } = yield exec.getExecOutput(toolCommand, undefined, { ignoreReturnCode: true });
if (exitCode) {
@ -61324,6 +61325,13 @@ function isCacheFeatureAvailable() {
return false;
}
exports.isCacheFeatureAvailable = isCacheFeatureAvailable;
const getCacheInput = () => {
// for self-hosted environment turn off cache by default
if (utils_1.isSelfHosted() && core.getInput('cache') === '')
return false;
return core.getBooleanInput('cache');
};
exports.getCacheInput = getCacheInput;
/***/ }),
@ -61495,8 +61503,7 @@ function cacheWindowsDir(extPath, tool, version, arch) {
if (os_1.default.platform() !== 'win32')
return false;
// make sure the action runs in the hosted environment
if (process.env['RUNNER_ENVIRONMENT'] !== 'github-hosted' &&
process.env['AGENT_ISSELFHOSTED'] === '1')
if (utils_1.isSelfHosted())
return false;
const defaultToolCacheRoot = process.env['RUNNER_TOOL_CACHE'];
if (!defaultToolCacheRoot)
@ -61789,7 +61796,7 @@ function run() {
// If not supplied then problem matchers will still be setup. Useful for self-hosted.
//
const versionSpec = resolveVersionInput();
const cache = core.getBooleanInput('cache');
const cache = cache_utils_1.getCacheInput();
core.info(`Setup go version spec ${versionSpec}`);
let arch = core.getInput('architecture');
if (!arch) {
@ -61975,12 +61982,15 @@ exports.getArch = getArch;
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.StableReleaseAlias = void 0;
exports.isSelfHosted = exports.StableReleaseAlias = void 0;
var StableReleaseAlias;
(function (StableReleaseAlias) {
StableReleaseAlias["Stable"] = "stable";
StableReleaseAlias["OldStable"] = "oldstable";
})(StableReleaseAlias = exports.StableReleaseAlias || (exports.StableReleaseAlias = {}));
const isSelfHosted = () => process.env['RUNNER_ENVIRONMENT'] !== 'github-hosted' &&
process.env['AGENT_ISSELFHOSTED'] !== '0';
exports.isSelfHosted = isSelfHosted;
/***/ }),

View File

@ -17,8 +17,8 @@ We don't pursue the goal to provide wide customization of caching in scope of `a
# Decision
- Add `cache` input parameter to `actions/setup-go`. For now, input will accept the following values:
- `true` - enable caching for go dependencies
- `false`- disable caching for go dependencies. This value will be set as default value
- `true` - enable caching for go dependencies. This value will be set as default value for hosted runners.
- `false`- disable caching for go dependencies. This value will be set as default value for self-hosted runners.
- Cache feature will be disabled by default to make sure that we don't break existing customers. We will consider enabling cache by default in next major releases
- Action will try to search a go.sum files in the repository and throw error in the scenario that it was not found
- The hash of found file will be used as cache key (the same approach like [actions/cache](https://github.com/actions/cache/blob/main/examples.md#go---modules) recommends)

View File

@ -2,7 +2,11 @@ import * as core from '@actions/core';
import * as cache from '@actions/cache';
import fs from 'fs';
import {State} from './constants';
import {getCacheDirectoryPath, getPackageManagerInfo} from './cache-utils';
import {
getCacheDirectoryPath,
getPackageManagerInfo,
getCacheInput
} from './cache-utils';
// Catch and log any unhandled exceptions. These exceptions can leak out of the uploadChunk method in
// @actions/toolkit when a failed upload closes the file descriptor causing any in-process reads to
@ -28,10 +32,7 @@ export async function run() {
}
const cachePackages = async () => {
const cacheInput = core.getBooleanInput('cache');
if (!cacheInput) {
return;
}
if (!getCacheInput()) return;
const packageManager = 'default';

View File

@ -2,6 +2,7 @@ import * as cache from '@actions/cache';
import * as core from '@actions/core';
import * as exec from '@actions/exec';
import {supportedPackageManagers, PackageManagerInfo} from './package-managers';
import {isSelfHosted} from './utils';
export const getCommandOutput = async (toolCommand: string) => {
let {stdout, stderr, exitCode} = await exec.getExecOutput(
@ -83,3 +84,9 @@ export function isCacheFeatureAvailable(): boolean {
);
return false;
}
export const getCacheInput = (): boolean => {
// for self-hosted environment turn off cache by default
if (isSelfHosted() && core.getInput('cache') === '') return false;
return core.getBooleanInput('cache');
};

View File

@ -6,7 +6,7 @@ import * as httpm from '@actions/http-client';
import * as sys from './system';
import fs from 'fs';
import os from 'os';
import {StableReleaseAlias} from './utils';
import {isSelfHosted, StableReleaseAlias} from './utils';
type InstallationType = 'dist' | 'manifest';
@ -175,11 +175,7 @@ async function cacheWindowsDir(
if (os.platform() !== 'win32') return false;
// make sure the action runs in the hosted environment
if (
process.env['RUNNER_ENVIRONMENT'] !== 'github-hosted' &&
process.env['AGENT_ISSELFHOSTED'] === '1'
)
return false;
if (isSelfHosted()) return false;
const defaultToolCacheRoot = process.env['RUNNER_TOOL_CACHE'];
if (!defaultToolCacheRoot) return false;

View File

@ -4,7 +4,7 @@ import * as installer from './installer';
import * as semver from 'semver';
import path from 'path';
import {restoreCache} from './cache-restore';
import {isCacheFeatureAvailable} from './cache-utils';
import {isCacheFeatureAvailable, getCacheInput} from './cache-utils';
import cp from 'child_process';
import fs from 'fs';
import os from 'os';
@ -17,7 +17,7 @@ export async function run() {
//
const versionSpec = resolveVersionInput();
const cache = core.getBooleanInput('cache');
const cache = getCacheInput();
core.info(`Setup go version spec ${versionSpec}`);
let arch = core.getInput('architecture');

View File

@ -2,3 +2,7 @@ export enum StableReleaseAlias {
Stable = 'stable',
OldStable = 'oldstable'
}
export const isSelfHosted = (): boolean =>
process.env['RUNNER_ENVIRONMENT'] !== 'github-hosted' &&
process.env['AGENT_ISSELFHOSTED'] !== '0';