mirror of
https://github.com/actions/cache.git
synced 2025-06-25 03:41:10 +02:00
Compare commits
8 Commits
v2.0.0
...
dhadka/exi
Author | SHA1 | Date | |
---|---|---|---|
aa08592228 | |||
0b0791e3bf | |||
eed9cfe64d | |||
b773382817 | |||
984ce638f0 | |||
ff937cc950 | |||
d60d2bef10 | |||
e561127c3e |
33
.github/workflows/codeql.yml
vendored
33
.github/workflows/codeql.yml
vendored
@ -1,24 +1,30 @@
|
|||||||
name: "Code Scanning - Action"
|
name: "Code scanning - action"
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
pull_request:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 0 * * 0'
|
- cron: '0 19 * * 0'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
CodeQL-Build:
|
CodeQL-Build:
|
||||||
|
|
||||||
strategy:
|
# CodeQL runs on ubuntu-latest and windows-latest
|
||||||
fail-fast: false
|
|
||||||
|
|
||||||
|
|
||||||
# CodeQL runs on ubuntu-latest, windows-latest, and macos-latest
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
# We must fetch at least the immediate parents so that if this is
|
||||||
|
# a pull request then we can checkout the head.
|
||||||
|
fetch-depth: 2
|
||||||
|
|
||||||
|
# If this run was triggered by a pull request event, then checkout
|
||||||
|
# the head of the pull request instead of the merge commit.
|
||||||
|
- run: git checkout HEAD^2
|
||||||
|
if: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v1
|
uses: github/codeql-action/init@v1
|
||||||
@ -27,9 +33,20 @@ jobs:
|
|||||||
# languages: go, javascript, csharp, python, cpp, java
|
# languages: go, javascript, csharp, python, cpp, java
|
||||||
|
|
||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||||
# If this step fails, then you should remove it and run the build manually (see below).
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@v1
|
uses: github/codeql-action/autobuild@v1
|
||||||
|
|
||||||
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
|
# 📚 https://git.io/JvXDl
|
||||||
|
|
||||||
|
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||||
|
# and modify them (or add more) to build your code if your project
|
||||||
|
# uses a compiled language
|
||||||
|
|
||||||
|
#- run: |
|
||||||
|
# make bootstrap
|
||||||
|
# make release
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v1
|
uses: github/codeql-action/analyze@v1
|
||||||
|
@ -2,9 +2,16 @@ import * as core from "@actions/core";
|
|||||||
|
|
||||||
import { Events, Outputs, RefKey, State } from "../src/constants";
|
import { Events, Outputs, RefKey, State } from "../src/constants";
|
||||||
import * as actionUtils from "../src/utils/actionUtils";
|
import * as actionUtils from "../src/utils/actionUtils";
|
||||||
|
import * as testUtils from "../src/utils/testUtils";
|
||||||
|
|
||||||
jest.mock("@actions/core");
|
jest.mock("@actions/core");
|
||||||
|
|
||||||
|
beforeAll(() => {
|
||||||
|
jest.spyOn(core, "getInput").mockImplementation((name, options) => {
|
||||||
|
return jest.requireActual("@actions/core").getInput(name, options);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
delete process.env[Events.Key];
|
delete process.env[Events.Key];
|
||||||
delete process.env[RefKey];
|
delete process.env[RefKey];
|
||||||
@ -157,3 +164,33 @@ test("isValidEvent returns true for event that has a ref", () => {
|
|||||||
|
|
||||||
expect(isValidEvent).toBe(true);
|
expect(isValidEvent).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("getInputAsArray returns empty array if not required and missing", () => {
|
||||||
|
expect(actionUtils.getInputAsArray("foo")).toEqual([]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("getInputAsArray throws error if required and missing", () => {
|
||||||
|
expect(() =>
|
||||||
|
actionUtils.getInputAsArray("foo", { required: true })
|
||||||
|
).toThrowError();
|
||||||
|
});
|
||||||
|
|
||||||
|
test("getInputAsArray handles single line correctly", () => {
|
||||||
|
testUtils.setInput("foo", "bar");
|
||||||
|
expect(actionUtils.getInputAsArray("foo")).toEqual(["bar"]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("getInputAsArray handles multiple lines correctly", () => {
|
||||||
|
testUtils.setInput("foo", "bar\nbaz");
|
||||||
|
expect(actionUtils.getInputAsArray("foo")).toEqual(["bar", "baz"]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("getInputAsArray handles different new lines correctly", () => {
|
||||||
|
testUtils.setInput("foo", "bar\r\nbaz");
|
||||||
|
expect(actionUtils.getInputAsArray("foo")).toEqual(["bar", "baz"]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("getInputAsArray handles empty lines correctly", () => {
|
||||||
|
testUtils.setInput("foo", "\n\nbar\n\nbaz\n\n");
|
||||||
|
expect(actionUtils.getInputAsArray("foo")).toEqual(["bar", "baz"]);
|
||||||
|
});
|
||||||
|
@ -20,6 +20,13 @@ beforeAll(() => {
|
|||||||
const actualUtils = jest.requireActual("../src/utils/actionUtils");
|
const actualUtils = jest.requireActual("../src/utils/actionUtils");
|
||||||
return actualUtils.isValidEvent();
|
return actualUtils.isValidEvent();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
jest.spyOn(actionUtils, "getInputAsArray").mockImplementation(
|
||||||
|
(name, options) => {
|
||||||
|
const actualUtils = jest.requireActual("../src/utils/actionUtils");
|
||||||
|
return actualUtils.getInputAsArray(name, options);
|
||||||
|
}
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
@ -19,6 +19,14 @@ beforeAll(() => {
|
|||||||
return jest.requireActual("../src/utils/actionUtils").getCacheState();
|
return jest.requireActual("../src/utils/actionUtils").getCacheState();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
jest.spyOn(actionUtils, "getInputAsArray").mockImplementation(
|
||||||
|
(name, options) => {
|
||||||
|
return jest
|
||||||
|
.requireActual("../src/utils/actionUtils")
|
||||||
|
.getInputAsArray(name, options);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
jest.spyOn(actionUtils, "isExactKeyMatch").mockImplementation(
|
jest.spyOn(actionUtils, "isExactKeyMatch").mockImplementation(
|
||||||
(key, cacheResult) => {
|
(key, cacheResult) => {
|
||||||
return jest
|
return jest
|
||||||
|
24
dist/restore/index.js
vendored
24
dist/restore/index.js
vendored
@ -5306,7 +5306,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.isValidEvent = exports.logWarning = exports.getCacheState = exports.setOutputAndState = exports.setCacheHitOutput = exports.setCacheState = exports.isExactKeyMatch = void 0;
|
exports.getInputAsArray = exports.isValidEvent = exports.logWarning = exports.getCacheState = exports.setOutputAndState = exports.setCacheHitOutput = exports.setCacheState = exports.isExactKeyMatch = void 0;
|
||||||
const core = __importStar(__webpack_require__(470));
|
const core = __importStar(__webpack_require__(470));
|
||||||
const constants_1 = __webpack_require__(694);
|
const constants_1 = __webpack_require__(694);
|
||||||
function isExactKeyMatch(key, cacheKey) {
|
function isExactKeyMatch(key, cacheKey) {
|
||||||
@ -5350,6 +5350,14 @@ function isValidEvent() {
|
|||||||
return constants_1.RefKey in process.env && Boolean(process.env[constants_1.RefKey]);
|
return constants_1.RefKey in process.env && Boolean(process.env[constants_1.RefKey]);
|
||||||
}
|
}
|
||||||
exports.isValidEvent = isValidEvent;
|
exports.isValidEvent = isValidEvent;
|
||||||
|
function getInputAsArray(name, options) {
|
||||||
|
return core
|
||||||
|
.getInput(name, options)
|
||||||
|
.split("\n")
|
||||||
|
.map(s => s.trim())
|
||||||
|
.filter(x => x !== "");
|
||||||
|
}
|
||||||
|
exports.getInputAsArray = getInputAsArray;
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
@ -6835,14 +6843,10 @@ function run() {
|
|||||||
}
|
}
|
||||||
const primaryKey = core.getInput(constants_1.Inputs.Key, { required: true });
|
const primaryKey = core.getInput(constants_1.Inputs.Key, { required: true });
|
||||||
core.saveState(constants_1.State.CachePrimaryKey, primaryKey);
|
core.saveState(constants_1.State.CachePrimaryKey, primaryKey);
|
||||||
const restoreKeys = core
|
const restoreKeys = utils.getInputAsArray(constants_1.Inputs.RestoreKeys);
|
||||||
.getInput(constants_1.Inputs.RestoreKeys)
|
const cachePaths = utils.getInputAsArray(constants_1.Inputs.Path, {
|
||||||
.split("\n")
|
required: true
|
||||||
.filter(x => x !== "");
|
});
|
||||||
const cachePaths = core
|
|
||||||
.getInput(constants_1.Inputs.Path, { required: true })
|
|
||||||
.split("\n")
|
|
||||||
.filter(x => x !== "");
|
|
||||||
try {
|
try {
|
||||||
const cacheKey = yield cache.restoreCache(cachePaths, primaryKey, restoreKeys);
|
const cacheKey = yield cache.restoreCache(cachePaths, primaryKey, restoreKeys);
|
||||||
if (!cacheKey) {
|
if (!cacheKey) {
|
||||||
@ -6873,7 +6877,7 @@ function run() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
run();
|
run().then(() => process.exit());
|
||||||
exports.default = run;
|
exports.default = run;
|
||||||
|
|
||||||
|
|
||||||
|
19
dist/save/index.js
vendored
19
dist/save/index.js
vendored
@ -5306,7 +5306,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.isValidEvent = exports.logWarning = exports.getCacheState = exports.setOutputAndState = exports.setCacheHitOutput = exports.setCacheState = exports.isExactKeyMatch = void 0;
|
exports.getInputAsArray = exports.isValidEvent = exports.logWarning = exports.getCacheState = exports.setOutputAndState = exports.setCacheHitOutput = exports.setCacheState = exports.isExactKeyMatch = void 0;
|
||||||
const core = __importStar(__webpack_require__(470));
|
const core = __importStar(__webpack_require__(470));
|
||||||
const constants_1 = __webpack_require__(694);
|
const constants_1 = __webpack_require__(694);
|
||||||
function isExactKeyMatch(key, cacheKey) {
|
function isExactKeyMatch(key, cacheKey) {
|
||||||
@ -5350,6 +5350,14 @@ function isValidEvent() {
|
|||||||
return constants_1.RefKey in process.env && Boolean(process.env[constants_1.RefKey]);
|
return constants_1.RefKey in process.env && Boolean(process.env[constants_1.RefKey]);
|
||||||
}
|
}
|
||||||
exports.isValidEvent = isValidEvent;
|
exports.isValidEvent = isValidEvent;
|
||||||
|
function getInputAsArray(name, options) {
|
||||||
|
return core
|
||||||
|
.getInput(name, options)
|
||||||
|
.split("\n")
|
||||||
|
.map(s => s.trim())
|
||||||
|
.filter(x => x !== "");
|
||||||
|
}
|
||||||
|
exports.getInputAsArray = getInputAsArray;
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
@ -6600,10 +6608,9 @@ function run() {
|
|||||||
core.info(`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`);
|
core.info(`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const cachePaths = core
|
const cachePaths = utils.getInputAsArray(constants_1.Inputs.Path, {
|
||||||
.getInput(constants_1.Inputs.Path, { required: true })
|
required: true
|
||||||
.split("\n")
|
});
|
||||||
.filter(x => x !== "");
|
|
||||||
try {
|
try {
|
||||||
yield cache.saveCache(cachePaths, primaryKey);
|
yield cache.saveCache(cachePaths, primaryKey);
|
||||||
}
|
}
|
||||||
@ -6624,7 +6631,7 @@ function run() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
run();
|
run().then(() => process.exit());
|
||||||
exports.default = run;
|
exports.default = run;
|
||||||
|
|
||||||
|
|
||||||
|
@ -120,8 +120,8 @@ steps:
|
|||||||
We cache the elements of the Cabal store separately, as the entirety of `~/.cabal` can grow very large for projects with many dependencies.
|
We cache the elements of the Cabal store separately, as the entirety of `~/.cabal` can grow very large for projects with many dependencies.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- uses: actions/cache@v2
|
- name: Cache ~/.cabal/packages, ~/.cabal/store and dist-newstyle
|
||||||
name: Cache ~/.cabal/packages, ~/.cabal/store and dist-newstyle
|
uses: actions/cache@v2
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
~/.cabal/packages
|
~/.cabal/packages
|
||||||
@ -144,7 +144,8 @@ We cache the elements of the Cabal store separately, as the entirety of `~/.caba
|
|||||||
## Java - Maven
|
## Java - Maven
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- uses: actions/cache@v2
|
- name: Cache local Maven repository
|
||||||
|
uses: actions/cache@v2
|
||||||
with:
|
with:
|
||||||
path: ~/.m2/repository
|
path: ~/.m2/repository
|
||||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||||
@ -156,6 +157,8 @@ We cache the elements of the Cabal store separately, as the entirety of `~/.caba
|
|||||||
|
|
||||||
For npm, cache files are stored in `~/.npm` on Posix, or `%AppData%/npm-cache` on Windows. See https://docs.npmjs.com/cli/cache#cache
|
For npm, cache files are stored in `~/.npm` on Posix, or `%AppData%/npm-cache` on Windows. See https://docs.npmjs.com/cli/cache#cache
|
||||||
|
|
||||||
|
If using `npm config` to retrieve the cache directory, ensure you run [actions/setup-node](https://github.com/actions/setup-node) first to ensure your `npm` version is correct.
|
||||||
|
|
||||||
>Note: It is not recommended to cache `node_modules`, as it can break across Node versions and won't work with `npm ci`
|
>Note: It is not recommended to cache `node_modules`, as it can break across Node versions and won't work with `npm ci`
|
||||||
|
|
||||||
### macOS and Ubuntu
|
### macOS and Ubuntu
|
||||||
|
@ -19,15 +19,10 @@ async function run(): Promise<void> {
|
|||||||
const primaryKey = core.getInput(Inputs.Key, { required: true });
|
const primaryKey = core.getInput(Inputs.Key, { required: true });
|
||||||
core.saveState(State.CachePrimaryKey, primaryKey);
|
core.saveState(State.CachePrimaryKey, primaryKey);
|
||||||
|
|
||||||
const restoreKeys = core
|
const restoreKeys = utils.getInputAsArray(Inputs.RestoreKeys);
|
||||||
.getInput(Inputs.RestoreKeys)
|
const cachePaths = utils.getInputAsArray(Inputs.Path, {
|
||||||
.split("\n")
|
required: true
|
||||||
.filter(x => x !== "");
|
});
|
||||||
|
|
||||||
const cachePaths = core
|
|
||||||
.getInput(Inputs.Path, { required: true })
|
|
||||||
.split("\n")
|
|
||||||
.filter(x => x !== "");
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const cacheKey = await cache.restoreCache(
|
const cacheKey = await cache.restoreCache(
|
||||||
@ -65,6 +60,6 @@ async function run(): Promise<void> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
run();
|
run().then(() => process.exit());
|
||||||
|
|
||||||
export default run;
|
export default run;
|
||||||
|
@ -31,10 +31,9 @@ async function run(): Promise<void> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const cachePaths = core
|
const cachePaths = utils.getInputAsArray(Inputs.Path, {
|
||||||
.getInput(Inputs.Path, { required: true })
|
required: true
|
||||||
.split("\n")
|
});
|
||||||
.filter(x => x !== "");
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await cache.saveCache(cachePaths, primaryKey);
|
await cache.saveCache(cachePaths, primaryKey);
|
||||||
@ -52,6 +51,6 @@ async function run(): Promise<void> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
run();
|
run().then(() => process.exit());
|
||||||
|
|
||||||
export default run;
|
export default run;
|
||||||
|
@ -45,3 +45,14 @@ export function logWarning(message: string): void {
|
|||||||
export function isValidEvent(): boolean {
|
export function isValidEvent(): boolean {
|
||||||
return RefKey in process.env && Boolean(process.env[RefKey]);
|
return RefKey in process.env && Boolean(process.env[RefKey]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getInputAsArray(
|
||||||
|
name: string,
|
||||||
|
options?: core.InputOptions
|
||||||
|
): string[] {
|
||||||
|
return core
|
||||||
|
.getInput(name, options)
|
||||||
|
.split("\n")
|
||||||
|
.map(s => s.trim())
|
||||||
|
.filter(x => x !== "");
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user