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 }}
@@ -102,6 +104,8 @@ jobs:
102104 exit 1
103105 fi
104106 echo "pr=$pr" >> "$GITHUB_OUTPUT"
107+ echo "base=$(jq -r '.base.sha' <<< "$pr")" >> "$GITHUB_OUTPUT"
108+ echo "base_ref=$(jq -r '.base.ref' <<< "$pr")" >> "$GITHUB_OUTPUT"
105109 echo "head=$(jq -r '.head.sha' <<< "$pr")" >> "$GITHUB_OUTPUT"
106110 echo "merge=$(jq -r '.merge_commit_sha' <<< "$pr")" >> "$GITHUB_OUTPUT"
107111 echo "author_id=$(jq -r '.user.id' <<< "$pr")" >> "$GITHUB_OUTPUT"
@@ -136,6 +140,7 @@ jobs:
136140 .github/actions
137141 flake.lock
138142 flake.nix
143+ generate_markdown_report.py
139144
140145 - name : setup nix
141146 uses : ./.github/actions/setup-nix
@@ -151,7 +156,7 @@ jobs:
151156
152157 - name : install packages
153158 run : |
154- pkgs=(coreutils nixpkgs-review jq gnused)
159+ pkgs=(coreutils moreutils nixpkgs-review jq gnused generate-markdown-report )
155160 if [[ ${{ inputs.push-to-cache && vars.ATTIC_SERVER != '' && vars.ATTIC_CACHE != '' }} = true ]]; then
156161 pkgs+=(attic-client)
157162 elif [[ ${{ inputs.push-to-cache && vars.CACHIX_CACHE != '' }} = true ]]; then
@@ -177,11 +182,38 @@ jobs:
177182 --build-args="-L" \
178183 --pr-json="$PR_JSON" \
179184 $EXTRA_ARGS
185+
186+ report_json=~/.cache/nixpkgs-review/pr-${PR_NUMBER}/report.json
187+ report_md=~/.cache/nixpkgs-review/pr-${PR_NUMBER}/report.md
188+ if failed=$(jq -er '.result[].failed[]' "$report_json"); then
189+ git fetch origin "$BASE" && git switch -d "$BASE"
190+ build=()
191+ paths=()
192+ for pkg in $failed; do
193+ [[ "$(nix eval --impure --expr "import ./. {} ? ${pkg}")" = "true" ]] || continue
194+ path=$(nix eval -f. "${pkg}.outPath" --raw) || continue
195+ build+=("$pkg")
196+ paths+=("$path")
197+ done
198+
199+ if [[ ${#build[@]} -ne 0 ]]; then
200+ nix build --keep-going -L -f. ${build[@]} || true
201+ fi
202+
203+ for i in ${!build[@]}; do
204+ ! nix store verify --no-contents --no-trust "${paths[i]}" || continue
205+ jq '.result[].failed -= [$pkg] | .result[].still_failing += [$pkg]' --arg pkg "${build[i]}" "$report_json" | sponge "$report_json"
206+ done
207+ fi
208+
209+ generate-markdown-report "$report_json" "$report_md" "$BASE_REF" | sponge "$report_md"
180210 working-directory : nixpkgs
181211 env :
182212 GITHUB_TOKEN : ${{ github.token }}
183213 EXTRA_ARGS : ${{ inputs.extra-args }}
184214 PR_JSON : ${{ needs.prepare.outputs.pr }}
215+ BASE : ${{ needs.prepare.outputs.base }}
216+ BASE_REF : ${{ needs.prepare.outputs.base_ref }}
185217
186218 - name : push results to cache
187219 if : ${{ inputs.push-to-cache && ((vars.ATTIC_SERVER != '' && vars.ATTIC_CACHE != '') || vars.CACHIX_CACHE != '') }}
@@ -313,7 +345,7 @@ jobs:
313345 done
314346
315347 cat report.md
316- echo success=$(jq -s 'all(.[].result[]; .failed==[])' report_*.json) >> "$GITHUB_OUTPUT"
348+ echo success=$(jq -s 'all(.[].result[]; ( .failed+.still_failing) ==[])' report_*.json) >> "$GITHUB_OUTPUT"
317349 sed '1s|$| for [#'"$PR_NUMBER"'](https://github.com/NixOS/nixpkgs/pull/'"$PR_NUMBER"')|' report.md >> $GITHUB_STEP_SUMMARY
318350 env :
319351 HEAD : ${{ needs.prepare.outputs.head }}
0 commit comments