diff --git a/.github/workflows/codeowners-v2.yml b/.github/workflows/codeowners-v2.yml index 0a4f97b1395fb..ae95fd0de05fb 100644 --- a/.github/workflows/codeowners-v2.yml +++ b/.github/workflows/codeowners-v2.yml @@ -106,6 +106,6 @@ jobs: run: nix-build ci -A requestReviews - name: Request reviews - run: result/bin/request-reviews.sh ${{ github.repository }} ${{ github.event.number }} "$OWNERS_FILE" + run: result/bin/request-code-owner-reviews.sh ${{ github.repository }} ${{ github.event.number }} "$OWNERS_FILE" env: GH_TOKEN: ${{ steps.app-token.outputs.token }} diff --git a/.github/workflows/eval.yml b/.github/workflows/eval.yml index 2e99bb17b8bb8..72b2103b87207 100644 --- a/.github/workflows/eval.yml +++ b/.github/workflows/eval.yml @@ -254,7 +254,7 @@ jobs: - name: Build the requestReviews derivation run: nix-build base/ci -A requestReviews - - name: Tagging pull request + - name: Labelling pull request run: | # Get all currently set rebuild labels gh api \ @@ -283,18 +283,18 @@ jobs: -f "labels[]=$toAdd" done < <(comm -13 before after) + env: + GH_TOKEN: ${{ github.token }} + REPOSITORY: ${{ github.repository }} + NUMBER: ${{ github.event.number }} + + - name: Requesting maintainer reviews + run: | # maintainers.json contains GitHub IDs. Look up handles to request reviews from. # There appears to be no API to request reviews based on GitHub IDs jq -r 'keys[]' comparison/maintainers.json \ | while read -r id; do gh api /user/"$id" --jq .login; done \ - | GH_TOKEN=${{ steps.app-token.outputs.token }} result/bin/process-reviewers.sh "$REPOSITORY" "$NUMBER" "$AUTHOR" \ - > reviewers.json - - # Request reviewers from maintainers of changed output paths - GH_TOKEN=${{ steps.app-token.outputs.token }} gh api \ - --method POST \ - /repos/"$REPOSITORY"/pulls/"$NUMBER"/requested_reviewers \ - --input reviewers.json + | GH_TOKEN=${{ steps.app-token.outputs.token }} result/bin/request-reviewers.sh "$REPOSITORY" "$NUMBER" "$AUTHOR" env: GH_TOKEN: ${{ github.token }} diff --git a/ci/request-reviews/default.nix b/ci/request-reviews/default.nix index f5f8dc1deb004..b180d60be97c3 100644 --- a/ci/request-reviews/default.nix +++ b/ci/request-reviews/default.nix @@ -14,9 +14,9 @@ stdenvNoCC.mkDerivation { src = lib.fileset.toSource { root = ./.; fileset = lib.fileset.unions [ - ./get-reviewers.sh - ./process-reviewers.sh - ./request-reviews.sh + ./get-code-owners.sh + ./request-reviewers.sh + ./request-code-owner-reviews.sh ./verify-base-branch.sh ./dev-branches.txt ]; diff --git a/ci/request-reviews/get-reviewers.sh b/ci/request-reviews/get-code-owners.sh similarity index 100% rename from ci/request-reviews/get-reviewers.sh rename to ci/request-reviews/get-code-owners.sh diff --git a/ci/request-reviews/request-reviews.sh b/ci/request-reviews/request-code-owner-reviews.sh similarity index 79% rename from ci/request-reviews/request-reviews.sh rename to ci/request-reviews/request-code-owner-reviews.sh index 986f3684b42a2..fefc8c3be3fa2 100755 --- a/ci/request-reviews/request-reviews.sh +++ b/ci/request-reviews/request-code-owner-reviews.sh @@ -77,20 +77,6 @@ if ! "$SCRIPT_DIR"/verify-base-branch.sh "$tmp/nixpkgs.git" "$headRef" "$baseRep exit 1 fi -log "Getting code owners to request reviews from" -"$SCRIPT_DIR"/get-reviewers.sh "$tmp/nixpkgs.git" "$ownersFile" "$baseBranch" "$headRef" | \ - "$SCRIPT_DIR"/process-reviewers.sh "$baseRepo" "$prNumber" "$prAuthor" > "$tmp/reviewers.json" - -log "Requesting reviews from: $(<"$tmp/reviewers.json")" - -if ! response=$(effect gh api \ - --method POST \ - -H "Accept: application/vnd.github+json" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - "/repos/$baseRepo/pulls/$prNumber/requested_reviewers" \ - --input "$tmp/reviewers.json"); then - log "Failed to request reviews: $response" - exit 1 -fi - -log "Successfully requested reviews" +log "Requesting reviews from code owners" +"$SCRIPT_DIR"/get-code-owners.sh "$tmp/nixpkgs.git" "$ownersFile" "$baseBranch" "$headRef" | \ + "$SCRIPT_DIR"/request-reviewers.sh "$baseRepo" "$prNumber" "$prAuthor" diff --git a/ci/request-reviews/process-reviewers.sh b/ci/request-reviews/request-reviewers.sh similarity index 62% rename from ci/request-reviews/process-reviewers.sh rename to ci/request-reviews/request-reviewers.sh index de969c5c9e4f0..7bb4d110fe1bd 100755 --- a/ci/request-reviews/process-reviewers.sh +++ b/ci/request-reviews/request-reviewers.sh @@ -1,15 +1,26 @@ #!/usr/bin/env bash -# Process reviewers for a PR, reading line-separated usernames on stdin, -# returning a JSON suitable to be consumed by the API endpoint to request reviews: +# Request reviewers for a PR, reading line-separated usernames on stdin, +# filtering for valid reviewers before using the API endpoint to request reviews: # https://docs.github.com/en/rest/pulls/review-requests?apiVersion=2022-11-28#request-reviewers-for-a-pull-request set -euo pipefail +tmp=$(mktemp -d) +trap 'rm -rf "$tmp"' exit + log() { echo "$@" >&2 } +effect() { + if [[ -n "${DRY_MODE:-}" ]]; then + log "Skipping in dry mode:" "${@@Q}" + else + "$@" + fi +} + if (( "$#" < 3 )); then log "Usage: $0 BASE_REPO PR_NUMBER PR_AUTHOR" exit 1 @@ -42,7 +53,7 @@ gh api \ # And we don't want to rerequest reviews from people who already reviewed while read -r user; do if [[ -v users[${user,,}] ]]; then - log "User $user is a code owner but has already left a review, ignoring" + log "User $user is a potential reviewer, but has already left a review, ignoring" unset 'users[${user,,}]' fi done < "$tmp/already-reviewed-by" @@ -57,9 +68,16 @@ for user in "${!users[@]}"; do fi done -# Turn it into a JSON for the GitHub API call to request PR reviewers -jq -n \ - --arg users "${!users[*]}" \ - '{ - reviewers: $users | split(" "), - }' +for user in "${!users[@]}"; do + log "Requesting review from: $user" + + if ! response=$(jq -n --arg user "$user" '{ reviewers: [ $user ] }' | \ + effect gh api \ + --method POST \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "/repos/$baseRepo/pulls/$prNumber/requested_reviewers" \ + --input -); then + log "Failed to request review from $user: $response" + fi +done