check-by-name/run-local.sh: Make it usable for non-CI platforms

Since https://github.com/NixOS/nixpkgs/pull/281374, the
nixpkgs-check-by-name tooling is pinned to a specific /nix/store path to
avoid having to evaluate Nixpkgs in CI.

The same path is used for local runs, but that doesn't actually work
when you're trying to run it on a platform different from CI.

This commit makes it work by being clearer about platforms and making
local runs check out the correct Nixpkgs to evaluate the tool from.
This commit is contained in:
Silvan Mosberger 2024-01-16 23:04:26 +01:00
parent ac1638d014
commit 9da57b5bd3
6 changed files with 40 additions and 18 deletions

View File

@ -91,8 +91,12 @@ jobs:
git worktree add "$base" "$(git rev-parse HEAD^1)" git worktree add "$base" "$(git rev-parse HEAD^1)"
echo "base=$base" >> "$GITHUB_ENV" echo "base=$base" >> "$GITHUB_ENV"
- uses: cachix/install-nix-action@7ac1ec25491415c381d9b62f0657c7a028df52a7 # v24 - uses: cachix/install-nix-action@7ac1ec25491415c381d9b62f0657c7a028df52a7 # v24
- name: Fetching the tool - name: Fetching the pinned tool
run: pkgs/test/nixpkgs-check-by-name/scripts/fetch-pinned-tool.sh result run: |
# Get the direct /nix/store path from the pin to avoid having to evaluate Nixpkgs
toolPath=$(jq -r .ci-path pkgs/test/nixpkgs-check-by-name/scripts/pinned-tool.json)
# This asks the substituter for the path, which should be there because Hydra will have pre-built and pushed it
nix-store --realise "$toolPath" --add-root result
- name: Running nixpkgs-check-by-name - name: Running nixpkgs-check-by-name
run: | run: |
if result/bin/nixpkgs-check-by-name --base "$base" .; then if result/bin/nixpkgs-check-by-name --base "$base" .; then

View File

@ -22,12 +22,3 @@ Updates the pinned CI tool in [`./pinned-tool.json`](./pinned-tool.json) to the
[latest version from the `nixos-unstable` channel](https://hydra.nixos.org/job/nixos/trunk-combined/nixpkgs.tests.nixpkgs-check-by-name.x86_64-linux) [latest version from the `nixos-unstable` channel](https://hydra.nixos.org/job/nixos/trunk-combined/nixpkgs.tests.nixpkgs-check-by-name.x86_64-linux)
This script is called manually once the CI tooling needs to be updated. This script is called manually once the CI tooling needs to be updated.
## `./fetch-pinned-tool.sh OUTPUT_PATH`
Fetches the pinned tooling specified in [`./pinned-tool.json`](./pinned-tool.json).
This script is used both by [`./run-local.sh`](#run-local-sh-base-branch-repository) and CI.
Arguments:
- `OUTPUT_PATH`: The output symlink path for the tool

View File

@ -1,4 +1,8 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Legacy script, can be removed once the PR removing its use is merged.
# It's not used anymore because CI and local runs both use pinned-tool.json as their source of truth now,
# though in different ways since local runs need to support arbitrary platforms
# Try to not use nix-shell here to avoid fetching Nixpkgs, # Try to not use nix-shell here to avoid fetching Nixpkgs,
# especially since this is used in CI # especially since this is used in CI
# The only dependency is `jq`, which in CI is implicitly available # The only dependency is `jq`, which in CI is implicitly available
@ -22,7 +26,7 @@ output=$1
trace "Reading $pin_file.. " trace "Reading $pin_file.. "
rev=$(jq -r .rev "$SCRIPT_DIR"/pinned-tool.json) rev=$(jq -r .rev "$SCRIPT_DIR"/pinned-tool.json)
trace -e "Git revision is \e[34m$rev\e[0m" trace -e "Git revision is \e[34m$rev\e[0m"
path=$(jq -r .path "$SCRIPT_DIR"/pinned-tool.json) path=$(jq -r '."ci-path"' "$SCRIPT_DIR"/pinned-tool.json)
trace "Tooling path is $path" trace "Tooling path is $path"
trace -n "Fetching the prebuilt version of nixpkgs-check-by-name.. " trace -n "Fetching the prebuilt version of nixpkgs-check-by-name.. "

View File

@ -1,4 +1,4 @@
{ {
"rev": "9b19f5e77dd906cb52dade0b7bd280339d2a1f3d", "rev": "9b19f5e77dd906cb52dade0b7bd280339d2a1f3d",
"path": "/nix/store/qlls5ca8q88qpyygg9ddi60gl1nmvpij-nixpkgs-check-by-name" "ci-path": "/nix/store/qlls5ca8q88qpyygg9ddi60gl1nmvpij-nixpkgs-check-by-name"
} }

View File

@ -14,6 +14,7 @@ cleanup() {
[[ -e "$tmp/base" ]] && git worktree remove --force "$tmp/base" [[ -e "$tmp/base" ]] && git worktree remove --force "$tmp/base"
[[ -e "$tmp/merged" ]] && git worktree remove --force "$tmp/merged" [[ -e "$tmp/merged" ]] && git worktree remove --force "$tmp/merged"
[[ -e "$tmp/tool-nixpkgs" ]] && git worktree remove --force "$tmp/tool-nixpkgs"
rm -rf "$tmp" rm -rf "$tmp"
@ -62,7 +63,20 @@ trace -n "Merging base branch into the HEAD commit in $tmp/merged.. "
git -C "$tmp/merged" merge -q --no-edit "$baseSha" git -C "$tmp/merged" merge -q --no-edit "$baseSha"
trace -e "\e[34m$(git -C "$tmp/merged" rev-parse HEAD)\e[0m" trace -e "\e[34m$(git -C "$tmp/merged" rev-parse HEAD)\e[0m"
"$tmp/merged/pkgs/test/nixpkgs-check-by-name/scripts/fetch-pinned-tool.sh" "$tmp/tool" trace -n "Reading pinned nixpkgs-check-by-name revision from pinned-tool.json.. "
toolSha=$(jq -r .rev "$tmp/merged/pkgs/test/nixpkgs-check-by-name/scripts/pinned-tool.json")
trace -e "\e[34m$toolSha\e[0m"
trace -n "Creating Git worktree for the nixpkgs-check-by-name revision in $tmp/tool-nixpkgs.. "
git worktree add -q "$tmp/tool-nixpkgs" "$toolSha"
trace "Done"
trace "Building/fetching nixpkgs-check-by-name.."
nix-build -o "$tmp/tool" "$tmp/tool-nixpkgs" \
-A tests.nixpkgs-check-by-name \
--arg config '{}' \
--arg overlays '[]' \
-j 0
trace "Running nixpkgs-check-by-name.." trace "Running nixpkgs-check-by-name.."
"$tmp/tool/bin/nixpkgs-check-by-name" --base "$tmp/base" "$tmp/merged" "$tmp/tool/bin/nixpkgs-check-by-name" --base "$tmp/base" "$tmp/merged"

View File

@ -7,6 +7,9 @@ trace() { echo >&2 "$@"; }
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
# Determined by `runs-on: ubuntu-latest` in .github/workflows/check-by-name.yml
CI_SYSTEM=x86_64-linux
channel=nixos-unstable channel=nixos-unstable
pin_file=$SCRIPT_DIR/pinned-tool.json pin_file=$SCRIPT_DIR/pinned-tool.json
@ -19,13 +22,19 @@ trace "$nixpkgs"
rev=$(<"$nixpkgs/.git-revision") rev=$(<"$nixpkgs/.git-revision")
trace -e "Git revision of channel $channel is \e[34m$rev\e[0m" trace -e "Git revision of channel $channel is \e[34m$rev\e[0m"
trace -n "Fetching the prebuilt version of nixpkgs-check-by-name for $CI_SYSTEM.. "
trace -n "Fetching the prebuilt version of nixpkgs-check-by-name.. " # This is the architecture used by CI, we want to prefetch the exact path to avoid having to evaluate Nixpkgs
path=$(nix-build --no-out-link "$nixpkgs" -A tests.nixpkgs-check-by-name -j 0 | tee /dev/stderr) ci_path=$(nix-build --no-out-link "$nixpkgs" \
-A tests.nixpkgs-check-by-name \
--arg config '{}' \
--argstr system "$CI_SYSTEM" \
--arg overlays '[]' \
-j 0 \
| tee /dev/stderr)
trace "Updating $pin_file" trace "Updating $pin_file"
jq -n \ jq -n \
--arg rev "$rev" \ --arg rev "$rev" \
--arg path "$path" \ --arg ci-path "$ci_path" \
'$ARGS.named' \ '$ARGS.named' \
> "$pin_file" > "$pin_file"