7878 runs-on : ubuntu-latest
7979 outputs :
8080 pr : ${{ steps.pr.outputs.pr }}
81+ base : ${{ steps.pr.outputs.base }}
82+ base_ref : ${{ steps.pr.outputs.base_ref }}
8183 head : ${{ steps.pr.outputs.head }}
8284 merge : ${{ steps.pr.outputs.merge }}
8385 author_id : ${{ steps.pr.outputs.author_id }}
98100 exit 1
99101 fi
100102 echo "pr=$pr" >> "$GITHUB_OUTPUT"
103+ echo "base=$(jq -r '.base.sha' <<< "$pr")" >> "$GITHUB_OUTPUT"
104+ echo "base_ref=$(jq -r '.base.ref' <<< "$pr")" >> "$GITHUB_OUTPUT"
101105 echo "head=$(jq -r '.head.sha' <<< "$pr")" >> "$GITHUB_OUTPUT"
102106 echo "merge=$(jq -r '.merge_commit_sha' <<< "$pr")" >> "$GITHUB_OUTPUT"
103107 echo "author_id=$(jq -r '.user.id' <<< "$pr")" >> "$GITHUB_OUTPUT"
@@ -132,6 +136,7 @@ jobs:
132136 .github/actions
133137 flake.lock
134138 flake.nix
139+ generate_markdown_report.py
135140
136141 - name : setup nix
137142 uses : ./.github/actions/setup-nix
@@ -147,7 +152,7 @@ jobs:
147152
148153 - name : install packages
149154 run : |
150- pkgs=(coreutils nixpkgs-review jq gnused)
155+ pkgs=(coreutils moreutils nixpkgs-review jq gnused generate-markdown-report )
151156 if [[ ${{ inputs.push-to-cache && vars.ATTIC_SERVER != '' && vars.ATTIC_CACHE != '' }} = true ]]; then
152157 pkgs+=(attic-client)
153158 elif [[ ${{ inputs.push-to-cache && vars.CACHIX_CACHE != '' }} = true ]]; then
@@ -173,11 +178,38 @@ jobs:
173178 --build-args="-L" \
174179 --pr-json="$PR_JSON" \
175180 $EXTRA_ARGS
181+
182+ report_json=~/.cache/nixpkgs-review/pr-${PR_NUMBER}/report.json
183+ report_md=~/.cache/nixpkgs-review/pr-${PR_NUMBER}/report.md
184+ if failed=$(jq -er '.result[].failed[]' "$report_json"); then
185+ git fetch origin "$BASE" && git switch -d "$BASE"
186+ build=()
187+ paths=()
188+ for pkg in $failed; do
189+ [[ "$(nix eval --impure --expr "import ./. {} ? ${pkg}")" = "true" ]] || continue
190+ path=$(nix eval -f. "${pkg}.outPath" --raw) || continue
191+ build+=("$pkg")
192+ paths+=("$path")
193+ done
194+
195+ if [[ ${#build[@]} -ne 0 ]]; then
196+ nix build --keep-going -L -f. ${build[@]} || true
197+ fi
198+
199+ for i in ${!build[@]}; do
200+ ! nix store verify --no-contents --no-trust "${paths[i]}" || continue
201+ jq '.result[].failed -= [$pkg] | .result[].still_failing += [$pkg]' --arg pkg "${build[i]}" "$report_json" | sponge "$report_json"
202+ done
203+ fi
204+
205+ generate-markdown-report "$report_json" "$report_md" "$BASE_REF" | sponge "$report_md"
176206 working-directory : nixpkgs
177207 env :
178208 GITHUB_TOKEN : ${{ github.token }}
179209 EXTRA_ARGS : ${{ inputs.extra-args }}
180210 PR_JSON : ${{ needs.prepare.outputs.pr }}
211+ BASE : ${{ needs.prepare.outputs.base }}
212+ BASE_REF : ${{ needs.prepare.outputs.base_ref }}
181213
182214 - name : push results to cache
183215 if : ${{ inputs.push-to-cache && ((vars.ATTIC_SERVER != '' && vars.ATTIC_CACHE != '') || vars.CACHIX_CACHE != '') }}
@@ -309,7 +341,7 @@ jobs:
309341 done
310342
311343 cat report.md
312- echo success=$(jq -s 'all(.[].result[]; .failed==[])' report_*.json) >> "$GITHUB_OUTPUT"
344+ echo success=$(jq -s 'all(.[].result[]; ( .failed+.still_failing) ==[])' report_*.json) >> "$GITHUB_OUTPUT"
313345 sed '1s|$| for [#'"$PR_NUMBER"'](https://github.com/NixOS/nixpkgs/pull/'"$PR_NUMBER"')|' report.md >> $GITHUB_STEP_SUMMARY
314346 env :
315347 HEAD : ${{ needs.prepare.outputs.head }}
0 commit comments