Skip to content

Commit

Permalink
WIP: save cache on post
Browse files Browse the repository at this point in the history
Instead of trying to do everything in the action, push the cache at the
end. This allows to run other actions in between.
  • Loading branch information
zimbatm committed Apr 17, 2020
1 parent 8580a77 commit b8b745f
Show file tree
Hide file tree
Showing 7 changed files with 73 additions and 140 deletions.
14 changes: 1 addition & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
13 changes: 0 additions & 13 deletions __tests__/main.test.ts

This file was deleted.

11 changes: 3 additions & 8 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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'
90 changes: 35 additions & 55 deletions dist/main/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
exports.IsPost = !!process.env['STATE_isPost'];
// inputs
const name = core.getInput('name', { required: true });
const signingKey = core.getInput('signingKey');
const authToken = core.getInput('authToken');
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 {
// 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";
core.startGroup('Cachix: installing');
yield exec.exec('nix-env', ['--quiet', '-iA', 'cachix', '-f', 'https://cachix.org/api/v1/install']);
core.endGroup();
Expand All @@ -997,31 +995,23 @@ function run() {
core.endGroup();
if (signingKey !== "") {
core.exportVariable('CACHIX_SIGNING_KEY', signingKey);
// Remember existing store paths
yield exec.exec("sh", ["-c", `nix path-info --all | grep -v '\.drv$' > /tmp/store-path-pre-build`]);
}
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);
}
catch (error) {
core.setFailed(`Action failed with error: ${error}`);
throw (error);
}
});
}
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();
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();
}
}
}
catch (error) {
Expand All @@ -1030,7 +1020,17 @@ function run() {
}
});
}
run();
// 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();
}


/***/ }),
Expand Down Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
75 changes: 33 additions & 42 deletions src/main.ts
Original file line number Diff line number Diff line change
@@ -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";
// inputs
const name = core.getInput('name', { required: true });
const signingKey = core.getInput('signingKey');
const authToken = core.getInput('authToken')
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()
Expand All @@ -31,41 +28,35 @@ async function run() {

if (signingKey !== "") {
core.exportVariable('CACHIX_SIGNING_KEY', signingKey);
// Remember existing store paths
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}`);
throw (error);
}
}

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();
}
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);
}
}

run();
// 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()
}
8 changes: 0 additions & 8 deletions src/strings.ts

This file was deleted.

0 comments on commit b8b745f

Please sign in to comment.