From 8ed48d272fe7911d7fdf68e910836597738fd61a Mon Sep 17 00:00:00 2001 From: Sander Date: Thu, 25 Apr 2024 15:30:05 +0000 Subject: [PATCH 1/6] Skip prep steps if using `pathsToPush` --- dist/main/index.js | 13 +++++++++++-- dist/main/push-paths.sh | 10 ++++------ src/main.ts | 15 +++++++++++++-- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/dist/main/index.js b/dist/main/index.js index 652f280b..66aa2977 100644 --- a/dist/main/index.js +++ b/dist/main/index.js @@ -7754,6 +7754,8 @@ var PushMode; (function (PushMode) { // Disable pushing entirely. PushMode["None"] = "None"; + // Push paths provided via the `pathsToPush` input. + PushMode["PushPaths"] = "PushPaths"; // Scans the entire store during the pre- and post-hooks and uploads the difference. // This is a very simple method and is likely to work in any environment. // There are two downsides: @@ -7821,7 +7823,10 @@ async function setup() { // Determine the push mode to use let pushMode = PushMode.None; if (hasPushTokens && !skipPush) { - if (useDaemon) { + if (pathsToPush) { + pushMode = PushMode.PushPaths; + } + else if (useDaemon) { let supportsDaemonInterface = (cachixVersion) ? semver_1.default.gte(cachixVersion, '1.7.0') : false; let supportsPostBuildHook = await isTrustedUser(); if (!supportsDaemonInterface) { @@ -7895,6 +7900,10 @@ async function upload() { } break; } + case PushMode.PushPaths: { + await exec.exec(cachixBin, ["push", cachixArgs, name, pathsToPush]); + break; + } case PushMode.Daemon: { const daemonDir = process.env[ENV_CACHIX_DAEMON_DIR]; if (!daemonDir) { @@ -7921,7 +7930,7 @@ async function upload() { break; } case PushMode.StoreScan: { - await exec.exec(`${__dirname}/push-paths.sh`, [cachixBin, cachixArgs, name, pathsToPush, pushFilter]); + await exec.exec(`${__dirname}/push-paths.sh`, [cachixBin, cachixArgs, name, pushFilter]); break; } } diff --git a/dist/main/push-paths.sh b/dist/main/push-paths.sh index 5a565fba..16c08a74 100755 --- a/dist/main/push-paths.sh +++ b/dist/main/push-paths.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail -cachix=$1 cachixArgs=${2:--j8} cache=$3 pathsToPush=$4 pushFilter=$5 +cachix=$1 cachixArgs=${2:--j8} cache=$3 pushFilter=$4 filterPaths() { local regex=$1 @@ -12,12 +12,10 @@ filterPaths() { done | xargs } -if [[ -z $pathsToPush ]]; then - pathsToPush=$(comm -13 <(sort /tmp/store-path-pre-build) <("$(dirname "$0")"/list-nix-store.sh)) +pathsToPush=$(comm -13 <(sort /tmp/store-path-pre-build) <("$(dirname "$0")"/list-nix-store.sh)) - if [[ -n $pushFilter ]]; then - pathsToPush=$(filterPaths $pushFilter "$pathsToPush") - fi +if [[ -n $pushFilter ]]; then + pathsToPush=$(filterPaths $pushFilter "$pathsToPush") fi echo "$pathsToPush" | "$cachix" push $cachixArgs "$cache" diff --git a/src/main.ts b/src/main.ts index 82598840..de6f5d00 100644 --- a/src/main.ts +++ b/src/main.ts @@ -30,6 +30,8 @@ const ENV_CACHIX_DAEMON_DIR = 'CACHIX_DAEMON_DIR'; enum PushMode { // Disable pushing entirely. None = 'None', + // Push paths provided via the `pathsToPush` input. + PushPaths = 'PushPaths', // Scans the entire store during the pre- and post-hooks and uploads the difference. // This is a very simple method and is likely to work in any environment. // There are two downsides: @@ -107,7 +109,9 @@ async function setup() { let pushMode = PushMode.None; if (hasPushTokens && !skipPush) { - if (useDaemon) { + if (pathsToPush) { + pushMode = PushMode.PushPaths; + } else if (useDaemon) { let supportsDaemonInterface = (cachixVersion) ? semver.gte(cachixVersion, '1.7.0') : false; let supportsPostBuildHook = await isTrustedUser(); @@ -169,6 +173,7 @@ async function setup() { break; } + case PushMode.StoreScan: { // Remember existing store paths await exec.exec("sh", ["-c", `${__dirname}/list-nix-store.sh > /tmp/store-path-pre-build`]); @@ -200,6 +205,12 @@ async function upload() { break; } + + case PushMode.PushPaths: { + await exec.exec(cachixBin, ["push", cachixArgs, name, pathsToPush]); + break; + } + case PushMode.Daemon: { const daemonDir = process.env[ENV_CACHIX_DAEMON_DIR]; @@ -233,7 +244,7 @@ async function upload() { } case PushMode.StoreScan: { - await exec.exec(`${__dirname}/push-paths.sh`, [cachixBin, cachixArgs, name, pathsToPush, pushFilter]); + await exec.exec(`${__dirname}/push-paths.sh`, [cachixBin, cachixArgs, name, pushFilter]); break; } } From 2b948d93f70059d277a12b4a6e6abfbf784f8c84 Mon Sep 17 00:00:00 2001 From: Sander Date: Mon, 6 May 2024 13:22:47 +0000 Subject: [PATCH 2/6] ci: add a test for pushPaths --- .github/workflows/test.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f7fdc23f..9f01062c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -69,6 +69,28 @@ jobs: useDaemon: ${{ matrix.useDaemon }} - run: nix-build test.nix + push-paths: + strategy: + matrix: + os: [ubuntu-latest, macos-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - run: yarn install --frozen-lockfile + - run: yarn build + - uses: cachix/install-nix-action@v26 + - id: paths + run: | + paths=$(nix-instantiate test.nix --help | tr '\n' ' ') + echo "OUT_PATHS=$paths" >> $GITHUB_OUTPUT + - name: Test pushPaths + uses: ./ + with: + name: cachix-action-private + signingKey: '${{ secrets.CACHIX_SIGNING_KEY_PRIVATE }}' + authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + pathsToPush: '${{ steps.paths.outputs.OUT_PATHS }}' + installCommand: strategy: matrix: From 5445758ba15ed0b0130d336b13df859fff586d65 Mon Sep 17 00:00:00 2001 From: sander Date: Tue, 7 May 2024 03:54:56 +0400 Subject: [PATCH 3/6] Update test.yml --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9f01062c..e2c69e5d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -81,12 +81,12 @@ jobs: - uses: cachix/install-nix-action@v26 - id: paths run: | - paths=$(nix-instantiate test.nix --help | tr '\n' ' ') + paths=$(nix-instantiate test.nix | tr '\n' ' ') echo "OUT_PATHS=$paths" >> $GITHUB_OUTPUT - name: Test pushPaths uses: ./ with: - name: cachix-action-private + name: cachix-action signingKey: '${{ secrets.CACHIX_SIGNING_KEY_PRIVATE }}' authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' pathsToPush: '${{ steps.paths.outputs.OUT_PATHS }}' From 234850493f2dd0aa804b30997f9b930a128b17df Mon Sep 17 00:00:00 2001 From: Sander Date: Tue, 7 May 2024 19:35:56 +0000 Subject: [PATCH 4/6] fix --- dist/main/index.js | 2 +- src/main.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/main/index.js b/dist/main/index.js index 66aa2977..89b773f8 100644 --- a/dist/main/index.js +++ b/dist/main/index.js @@ -7901,7 +7901,7 @@ async function upload() { break; } case PushMode.PushPaths: { - await exec.exec(cachixBin, ["push", cachixArgs, name, pathsToPush]); + await exec.exec(cachixBin, ["push", ...cachixArgs.split(' '), name, ...pathsToPush.split(' ')]); break; } case PushMode.Daemon: { diff --git a/src/main.ts b/src/main.ts index de6f5d00..566b0752 100644 --- a/src/main.ts +++ b/src/main.ts @@ -207,7 +207,7 @@ async function upload() { } case PushMode.PushPaths: { - await exec.exec(cachixBin, ["push", cachixArgs, name, pathsToPush]); + await exec.exec(cachixBin, ["push", ...cachixArgs.split(' '), name, ...pathsToPush.split(' ')]); break; } From 791af9e3fee11e26c65caca4b398a64ed0fa8aa5 Mon Sep 17 00:00:00 2001 From: Sander Date: Tue, 7 May 2024 19:41:21 +0000 Subject: [PATCH 5/6] fix --- dist/main/index.js | 7 +++++-- src/main.ts | 8 ++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/dist/main/index.js b/dist/main/index.js index 89b773f8..38c02a16 100644 --- a/dist/main/index.js +++ b/dist/main/index.js @@ -7851,7 +7851,7 @@ async function setup() { 'daemon', 'run', '--socket', `${daemonDir}/daemon.sock`, name, - ...cachixArgs.split(' ').filter((arg) => arg !== ''), + ...splitArgs(cachixArgs), ], { stdio: ['ignore', daemonLog, daemonLog], detached: true, @@ -7901,7 +7901,7 @@ async function upload() { break; } case PushMode.PushPaths: { - await exec.exec(cachixBin, ["push", ...cachixArgs.split(' '), name, ...pathsToPush.split(' ')]); + await exec.exec(cachixBin, ["push", ...splitArgs(cachixArgs), name, ...splitArgs(pathsToPush)]); break; } case PushMode.Daemon: { @@ -8083,6 +8083,9 @@ function partitionUsersAndGroups(mixedUsers) { }); return [users, groups]; } +function splitArgs(args) { + return args.split(' ').filter((arg) => arg !== ''); +} const isPost = !!core.getState('isPost'); // Main try { diff --git a/src/main.ts b/src/main.ts index 566b0752..3abd0de0 100644 --- a/src/main.ts +++ b/src/main.ts @@ -142,7 +142,7 @@ async function setup() { 'daemon', 'run', '--socket', `${daemonDir}/daemon.sock`, name, - ...cachixArgs.split(' ').filter((arg) => arg !== ''), + ...splitArgs(cachixArgs), ], { stdio: ['ignore', daemonLog, daemonLog], @@ -207,7 +207,7 @@ async function upload() { } case PushMode.PushPaths: { - await exec.exec(cachixBin, ["push", ...cachixArgs.split(' '), name, ...pathsToPush.split(' ')]); + await exec.exec(cachixBin, ["push", ...splitArgs(cachixArgs), name, ...splitArgs(pathsToPush)]); break; } @@ -425,6 +425,10 @@ function partitionUsersAndGroups(mixedUsers: string[]): [string[], string[]] { return [users, groups]; } +function splitArgs(args: string): string[] { + return args.split(' ').filter((arg) => arg !== ''); +} + const isPost = !!core.getState('isPost'); // Main From b1cd57ec5d1f79692a3b3e1a301cad06dd39e3ec Mon Sep 17 00:00:00 2001 From: Sander Date: Tue, 7 May 2024 19:45:05 +0000 Subject: [PATCH 6/6] fix --- .github/workflows/test.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e2c69e5d..6a263cac 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -87,8 +87,7 @@ jobs: uses: ./ with: name: cachix-action - signingKey: '${{ secrets.CACHIX_SIGNING_KEY_PRIVATE }}' - authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}' pathsToPush: '${{ steps.paths.outputs.OUT_PATHS }}' installCommand: