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)"
echo "base=$base" >> "$GITHUB_ENV"
- uses: cachix/install-nix-action@7ac1ec25491415c381d9b62f0657c7a028df52a7 # v24
- name: Fetching the tool
run: pkgs/test/nixpkgs-check-by-name/scripts/fetch-pinned-tool.sh result
- name: Fetching the pinned tool
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
run: |
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)
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
# 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,
# especially since this is used in CI
# The only dependency is `jq`, which in CI is implicitly available
@ -22,7 +26,7 @@ output=$1
trace "Reading $pin_file.. "
rev=$(jq -r .rev "$SCRIPT_DIR"/pinned-tool.json)
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 -n "Fetching the prebuilt version of nixpkgs-check-by-name.. "

View file

@ -1,4 +1,4 @@
{
"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/merged" ]] && git worktree remove --force "$tmp/merged"
[[ -e "$tmp/tool-nixpkgs" ]] && git worktree remove --force "$tmp/tool-nixpkgs"
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"
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.."
"$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 )
# Determined by `runs-on: ubuntu-latest` in .github/workflows/check-by-name.yml
CI_SYSTEM=x86_64-linux
channel=nixos-unstable
pin_file=$SCRIPT_DIR/pinned-tool.json
@ -19,13 +22,19 @@ trace "$nixpkgs"
rev=$(<"$nixpkgs/.git-revision")
trace -e "Git revision of channel $channel is \e[34m$rev\e[0m"
trace -n "Fetching the prebuilt version of nixpkgs-check-by-name.. "
path=$(nix-build --no-out-link "$nixpkgs" -A tests.nixpkgs-check-by-name -j 0 | tee /dev/stderr)
trace -n "Fetching the prebuilt version of nixpkgs-check-by-name for $CI_SYSTEM.. "
# This is the architecture used by CI, we want to prefetch the exact path to avoid having to evaluate Nixpkgs
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"
jq -n \
--arg rev "$rev" \
--arg path "$path" \
--arg ci-path "$ci_path" \
'$ARGS.named' \
> "$pin_file"