mirror of
https://codeberg.org/icewind/attic-action.git
synced 2026-06-03 17:44:07 +02:00
WIP: save cache on post
Instead of trying to do everything in the action, push the cache at the end. This allows to run other actions in between.
This commit is contained in:
parent
8580a77df6
commit
b8b745f3a7
7 changed files with 73 additions and 140 deletions
14
README.md
14
README.md
|
|
@ -51,19 +51,7 @@ jobs:
|
|||
signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
|
||||
# Only needed for private caches
|
||||
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
|
||||
```
|
||||
|
||||
Alternatively, you can use this action to only configure cachix for substitution:
|
||||
|
||||
```yaml
|
||||
...
|
||||
- uses: cachix/cachix-action@v5
|
||||
with:
|
||||
name: mycache
|
||||
skipNixBuild: true
|
||||
# Only needed for private caches
|
||||
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
|
||||
...
|
||||
- run: nix-build
|
||||
```
|
||||
|
||||
See [action.yml](action.yml) for all options.
|
||||
|
|
|
|||
|
|
@ -1,13 +0,0 @@
|
|||
import {prependEach, nonEmptySplit} from '../src/strings'
|
||||
|
||||
test('prependEach', async() => {
|
||||
expect(prependEach('-A', ["foo", "bar"])).toEqual(["-A", "foo", "-A", "bar"]);
|
||||
expect(prependEach('-A', [])).toEqual([]);
|
||||
});
|
||||
|
||||
test('nonEmptySplit', async() => {
|
||||
expect(nonEmptySplit("", /\s+/)).toEqual([]);
|
||||
expect(nonEmptySplit("foo bar", /\s+/)).toEqual(["foo", "bar"]);
|
||||
})
|
||||
|
||||
// TODO: hopefully github actions will support integration tests
|
||||
11
action.yml
11
action.yml
|
|
@ -9,17 +9,12 @@ inputs:
|
|||
description: 'Authentication token for Cachix, needed only for private cache access'
|
||||
signingKey:
|
||||
description: 'Signing key secret retrieved after creating binary cache on https://cachix.org'
|
||||
skipNixBuild:
|
||||
description: 'Set to true to not invoke nix-build after setup.'
|
||||
file:
|
||||
description: 'Nix file to build. Defaults to default.nix'
|
||||
attributes:
|
||||
description: 'Nix attributes to nix-build. By default, all attributes are built.'
|
||||
nixBuildArgs:
|
||||
description: 'Additional arguments for nix-build.'
|
||||
skipPush:
|
||||
description: 'Set to true to disable pushing build results to the cache'
|
||||
branding:
|
||||
color: 'blue'
|
||||
icon: 'database'
|
||||
runs:
|
||||
using: 'node12'
|
||||
main: 'dist/main/index.js'
|
||||
post: 'dist/main/index.js'
|
||||
|
|
|
|||
88
dist/main/index.js
vendored
88
dist/main/index.js
vendored
|
|
@ -971,20 +971,18 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const core = __importStar(__webpack_require__(470));
|
||||
const coreCommand = __importStar(__webpack_require__(431));
|
||||
const exec = __importStar(__webpack_require__(986));
|
||||
const strings_1 = __webpack_require__(443);
|
||||
function run() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
try {
|
||||
exports.IsPost = !!process.env['STATE_isPost'];
|
||||
// inputs
|
||||
const name = core.getInput('name', { required: true });
|
||||
const file = core.getInput('file');
|
||||
const skipNixBuild = core.getInput('skipNixBuild');
|
||||
const attributes = core.getInput('attributes');
|
||||
const nixBuildArgs = core.getInput('nixBuildArgs');
|
||||
const signingKey = core.getInput('signingKey');
|
||||
const authToken = core.getInput('authToken');
|
||||
const cachixExecutable = "/nix/var/nix/profiles/per-user/runner/profile/bin/cachix";
|
||||
const skipPush = core.getInput('skipPush');
|
||||
const cachixExecutable = '/nix/var/nix/profiles/per-user/runner/profile/bin/cachix';
|
||||
function setup() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
try {
|
||||
core.startGroup('Cachix: installing');
|
||||
yield exec.exec('nix-env', ['--quiet', '-iA', 'cachix', '-f', 'https://cachix.org/api/v1/install']);
|
||||
core.endGroup();
|
||||
|
|
@ -997,31 +995,8 @@ function run() {
|
|||
core.endGroup();
|
||||
if (signingKey !== "") {
|
||||
core.exportVariable('CACHIX_SIGNING_KEY', signingKey);
|
||||
}
|
||||
if (skipNixBuild !== 'true') {
|
||||
const args = strings_1.prependEach('-A', strings_1.nonEmptySplit(attributes, /\s+/)).concat([file || "default.nix"]);
|
||||
const additionalArgs = strings_1.nonEmptySplit(nixBuildArgs, /\s+/);
|
||||
const allArgs = additionalArgs.concat(args);
|
||||
core.startGroup(`nix-build ${allArgs.join(' ')}`);
|
||||
if (signingKey !== "") {
|
||||
// Remember existing store paths
|
||||
yield exec.exec("sh", ["-c", `nix path-info --all | grep -v '\.drv$' > store-path-pre-build`]);
|
||||
}
|
||||
let paths = '';
|
||||
const options = {
|
||||
listeners: {
|
||||
stdout: (data) => {
|
||||
paths += data.toString();
|
||||
},
|
||||
}
|
||||
};
|
||||
yield exec.exec('nix-build', allArgs, options);
|
||||
core.endGroup();
|
||||
if (signingKey !== "") {
|
||||
core.startGroup('Cachix: pushing paths');
|
||||
yield exec.exec("sh", ["-c", `nix path-info --all | grep -v '\.drv$' | cat - store-path-pre-build | sort | uniq -u | ${cachixExecutable} push ${name}`]);
|
||||
core.endGroup();
|
||||
}
|
||||
yield exec.exec("sh", ["-c", `nix path-info --all | grep -v '\.drv$' > /tmp/store-path-pre-build`]);
|
||||
}
|
||||
}
|
||||
catch (error) {
|
||||
|
|
@ -1030,7 +1005,32 @@ function run() {
|
|||
}
|
||||
});
|
||||
}
|
||||
run();
|
||||
function upload() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
try {
|
||||
if (signingKey !== "" && skipPush !== 'true') {
|
||||
core.startGroup('Cachix: pushing paths');
|
||||
yield exec.exec("sh", ["-c", `nix path-info --all | grep -v '\.drv$' | cat - /tmp/store-path-pre-build | sort | uniq -u | ${cachixExecutable} push ${name}`]);
|
||||
core.endGroup();
|
||||
}
|
||||
}
|
||||
catch (error) {
|
||||
core.setFailed(`Action failed with error: ${error}`);
|
||||
throw (error);
|
||||
}
|
||||
});
|
||||
}
|
||||
// Main
|
||||
if (!exports.IsPost) {
|
||||
// Publish a variable so that when the POST action runs, it can determine it should run the cleanup logic.
|
||||
// This is necessary since we don't have a separate entry point.
|
||||
coreCommand.issueCommand('save-state', { name: 'isPost' }, 'true');
|
||||
setup();
|
||||
}
|
||||
else {
|
||||
// Post
|
||||
upload();
|
||||
}
|
||||
|
||||
|
||||
/***/ }),
|
||||
|
|
@ -1125,26 +1125,6 @@ function escapeProperty(s) {
|
|||
}
|
||||
//# sourceMappingURL=command.js.map
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ 443:
|
||||
/***/ (function(__unusedmodule, exports) {
|
||||
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
function prependEach(elem, array) {
|
||||
const init = [];
|
||||
return array.reduce((r, a) => r.concat(elem, a), init);
|
||||
}
|
||||
exports.prependEach = prependEach;
|
||||
;
|
||||
function nonEmptySplit(str, separator) {
|
||||
return str.split(separator).filter(word => word != "");
|
||||
}
|
||||
exports.nonEmptySplit = nonEmptySplit;
|
||||
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ 470:
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
"main": "dist/main/index.js",
|
||||
"scripts": {
|
||||
"build": "tsc && ncc build -o dist/main src/main.ts",
|
||||
"test": "jest"
|
||||
"test": "echo NO TEST"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
|
|
|||
69
src/main.ts
69
src/main.ts
|
|
@ -1,21 +1,18 @@
|
|||
import * as core from '@actions/core';
|
||||
import * as coreCommand from '@actions/core/lib/command'
|
||||
import * as exec from '@actions/exec';
|
||||
import { prependEach, nonEmptySplit } from './strings';
|
||||
import { exit } from 'process';
|
||||
|
||||
export const IsPost = !!process.env['STATE_isPost']
|
||||
|
||||
async function run() {
|
||||
try {
|
||||
// inputs
|
||||
const name = core.getInput('name', { required: true });
|
||||
const file = core.getInput('file');
|
||||
const skipNixBuild = core.getInput('skipNixBuild');
|
||||
const attributes = core.getInput('attributes');
|
||||
const nixBuildArgs = core.getInput('nixBuildArgs');
|
||||
const signingKey = core.getInput('signingKey');
|
||||
const authToken = core.getInput('authToken')
|
||||
const cachixExecutable = "/nix/var/nix/profiles/per-user/runner/profile/bin/cachix";
|
||||
const skipPush = core.getInput('skipPush');
|
||||
const cachixExecutable = '/nix/var/nix/profiles/per-user/runner/profile/bin/cachix';
|
||||
|
||||
async function setup() {
|
||||
try {
|
||||
core.startGroup('Cachix: installing')
|
||||
await exec.exec('nix-env', ['--quiet', '-iA', 'cachix', '-f', 'https://cachix.org/api/v1/install']);
|
||||
core.endGroup()
|
||||
|
|
@ -31,36 +28,8 @@ async function run() {
|
|||
|
||||
if (signingKey !== "") {
|
||||
core.exportVariable('CACHIX_SIGNING_KEY', signingKey);
|
||||
}
|
||||
|
||||
if (skipNixBuild !== 'true') {
|
||||
const args = prependEach('-A', nonEmptySplit(attributes, /\s+/)).concat([file || "default.nix"]);
|
||||
const additionalArgs = nonEmptySplit(nixBuildArgs, /\s+/);
|
||||
const allArgs = additionalArgs.concat(args);
|
||||
|
||||
core.startGroup(`nix-build ${allArgs.join(' ')}`);
|
||||
|
||||
if (signingKey !== "") {
|
||||
// Remember existing store paths
|
||||
await exec.exec("sh", ["-c", `nix path-info --all | grep -v '\.drv$' > store-path-pre-build`]);
|
||||
}
|
||||
|
||||
let paths = '';
|
||||
const options = {
|
||||
listeners: {
|
||||
stdout: (data: Buffer) => {
|
||||
paths += data.toString();
|
||||
},
|
||||
}
|
||||
};
|
||||
await exec.exec('nix-build', allArgs, options);
|
||||
core.endGroup()
|
||||
|
||||
if (signingKey !== "") {
|
||||
core.startGroup('Cachix: pushing paths');
|
||||
await exec.exec("sh", ["-c", `nix path-info --all | grep -v '\.drv$' | cat - store-path-pre-build | sort | uniq -u | ${cachixExecutable} push ${name}`]);
|
||||
core.endGroup();
|
||||
}
|
||||
await exec.exec("sh", ["-c", `nix path-info --all | grep -v '\.drv$' > /tmp/store-path-pre-build`]);
|
||||
}
|
||||
} catch (error) {
|
||||
core.setFailed(`Action failed with error: ${error}`);
|
||||
|
|
@ -68,4 +37,26 @@ async function run() {
|
|||
}
|
||||
}
|
||||
|
||||
run();
|
||||
async function upload() {
|
||||
try {
|
||||
if (signingKey !== "" && skipPush !== 'true') {
|
||||
core.startGroup('Cachix: pushing paths');
|
||||
await exec.exec("sh", ["-c", `nix path-info --all | grep -v '\.drv$' | cat - /tmp/store-path-pre-build | sort | uniq -u | ${cachixExecutable} push ${name}`]);
|
||||
core.endGroup();
|
||||
}
|
||||
} catch (error) {
|
||||
core.setFailed(`Action failed with error: ${error}`);
|
||||
throw (error);
|
||||
}
|
||||
}
|
||||
|
||||
// Main
|
||||
if (!IsPost) {
|
||||
// Publish a variable so that when the POST action runs, it can determine it should run the cleanup logic.
|
||||
// This is necessary since we don't have a separate entry point.
|
||||
coreCommand.issueCommand('save-state', {name: 'isPost'}, 'true')
|
||||
setup()
|
||||
} else {
|
||||
// Post
|
||||
upload()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +0,0 @@
|
|||
export function prependEach (elem: string, array: string[]): string[] {
|
||||
const init: string[] = [];
|
||||
return array.reduce((r, a) => r.concat(elem, a), init)
|
||||
};
|
||||
|
||||
export function nonEmptySplit (str: string, separator): string[] {
|
||||
return str.split(separator).filter(word => word != "")
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue