From 08dcf70a394cd1cef74b9d2ddc5ba3179b2ff586 Mon Sep 17 00:00:00 2001 From: Sander Date: Tue, 7 May 2024 20:28:11 +0000 Subject: [PATCH 1/2] store-scan: improve error handling when store listing fails --- dist/main/push-paths.sh | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/dist/main/push-paths.sh b/dist/main/push-paths.sh index 16c08a74..1551da2b 100755 --- a/dist/main/push-paths.sh +++ b/dist/main/push-paths.sh @@ -12,10 +12,21 @@ filterPaths() { done | xargs } -pathsToPush=$(comm -13 <(sort /tmp/store-path-pre-build) <("$(dirname "$0")"/list-nix-store.sh)) +pathsToPush="" +preBuildPaths=$(sort /tmp/store-path-pre-build) +if [ $? -eq 0 ]; then + postBuildPaths=$("$(dirname "$0")"/list-nix-store.sh | sort) + if [ $? -eq 0 ]; then + pathsToPush=$(comm -13 <(echo "$preBuildPaths") <(echo "$postBuildPaths")) + else + echo "::error::Failed to list post-build store paths." + fi +else + echo "::error::Failed to find pre-build store paths." +fi if [[ -n $pushFilter ]]; then - pathsToPush=$(filterPaths $pushFilter "$pathsToPush") + pathsToPush=$(filterPaths $pushFilter "$pathsToPush") fi echo "$pathsToPush" | "$cachix" push $cachixArgs "$cache" From 662a8831beb5acada52cd71dc06ef391c85066e6 Mon Sep 17 00:00:00 2001 From: Sander Date: Tue, 7 May 2024 20:40:45 +0000 Subject: [PATCH 2/2] store-scan: use runner or os temp dirs --- dist/main/index.js | 9 ++++++--- dist/main/push-paths.sh | 6 +++--- src/main.ts | 10 +++++++--- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/dist/main/index.js b/dist/main/index.js index 38c02a16..fc064b01 100644 --- a/dist/main/index.js +++ b/dist/main/index.js @@ -7842,9 +7842,9 @@ async function setup() { } } core.saveState('pushMode', pushMode); + const tmpdir = process.env['RUNNER_TEMP'] ?? os.tmpdir(); switch (pushMode) { case PushMode.Daemon: { - const tmpdir = process.env['RUNNER_TEMP'] ?? os.tmpdir(); const daemonDir = await fs.mkdtemp(path.join(tmpdir, 'cachix-daemon-')); const daemonLog = (0, node_fs_1.openSync)(`${daemonDir}/daemon.log`, 'a'); const daemon = (0, node_child_process_1.spawn)(cachixBin, [ @@ -7877,7 +7877,9 @@ async function setup() { } case PushMode.StoreScan: { // Remember existing store paths - await exec.exec("sh", ["-c", `${__dirname}/list-nix-store.sh > /tmp/store-path-pre-build`]); + const preBuildPathsFile = `${tmpdir}/store-path-pre-build`; + core.saveState('preBuildPathsFile', preBuildPathsFile); + await exec.exec("sh", ["-c", `${__dirname}/list-nix-store.sh > ${preBuildPathsFile}`]); break; } default: @@ -7930,7 +7932,8 @@ async function upload() { break; } case PushMode.StoreScan: { - await exec.exec(`${__dirname}/push-paths.sh`, [cachixBin, cachixArgs, name, pushFilter]); + const preBuildPathsFile = core.getState('preBuildPathsFile'); + await exec.exec(`${__dirname}/push-paths.sh`, [cachixBin, cachixArgs, name, preBuildPathsFile, pushFilter]); break; } } diff --git a/dist/main/push-paths.sh b/dist/main/push-paths.sh index 1551da2b..933b2174 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 pushFilter=$4 +cachix=$1 cachixArgs=${2:--j8} cache=$3 preBuildPathsFile=$4 pushFilter=$5 filterPaths() { local regex=$1 @@ -13,7 +13,7 @@ filterPaths() { } pathsToPush="" -preBuildPaths=$(sort /tmp/store-path-pre-build) +preBuildPaths=$(sort "$preBuildPathsFile") if [ $? -eq 0 ]; then postBuildPaths=$("$(dirname "$0")"/list-nix-store.sh | sort) if [ $? -eq 0 ]; then @@ -22,7 +22,7 @@ if [ $? -eq 0 ]; then echo "::error::Failed to list post-build store paths." fi else - echo "::error::Failed to find pre-build store paths." + printf "::error::Failed to find pre-build store paths. Expected cached paths in %s\n" "$preBuildPathsFile" fi if [[ -n $pushFilter ]]; then diff --git a/src/main.ts b/src/main.ts index 3abd0de0..7ab2b827 100644 --- a/src/main.ts +++ b/src/main.ts @@ -130,9 +130,10 @@ async function setup() { core.saveState('pushMode', pushMode); + const tmpdir = process.env['RUNNER_TEMP'] ?? os.tmpdir(); + switch (pushMode) { case PushMode.Daemon: { - const tmpdir = process.env['RUNNER_TEMP'] ?? os.tmpdir(); const daemonDir = await fs.mkdtemp(path.join(tmpdir, 'cachix-daemon-')); const daemonLog = openSync(`${daemonDir}/daemon.log`, 'a'); @@ -176,7 +177,9 @@ async function setup() { case PushMode.StoreScan: { // Remember existing store paths - await exec.exec("sh", ["-c", `${__dirname}/list-nix-store.sh > /tmp/store-path-pre-build`]); + const preBuildPathsFile = `${tmpdir}/store-path-pre-build`; + core.saveState('preBuildPathsFile', preBuildPathsFile); + await exec.exec("sh", ["-c", `${__dirname}/list-nix-store.sh > ${preBuildPathsFile}`]); break; } @@ -244,7 +247,8 @@ async function upload() { } case PushMode.StoreScan: { - await exec.exec(`${__dirname}/push-paths.sh`, [cachixBin, cachixArgs, name, pushFilter]); + const preBuildPathsFile = core.getState('preBuildPathsFile'); + await exec.exec(`${__dirname}/push-paths.sh`, [cachixBin, cachixArgs, name, preBuildPathsFile, pushFilter]); break; } }