|
| 1 | +name: Reviewer Roulette |
| 2 | + |
| 3 | +on: |
| 4 | + pull_request: |
| 5 | + types: [ labeled ] |
| 6 | + |
| 7 | +env: |
| 8 | + reviewerList: "jonsimantov a-maurice DellaBitta cynthiajoan chkuang-g AlmostMatt" |
| 9 | + |
| 10 | +jobs: |
| 11 | + assign_random_reviewer: |
| 12 | + if: github.event.action == 'labeled' && github.event.label.name == 'reviewer-roulette' |
| 13 | + runs-on: ubuntu-latest |
| 14 | + steps: |
| 15 | + - name: Unset label |
| 16 | + uses: buildsville/add-remove-label@v1 |
| 17 | + with: |
| 18 | + token: ${{ github.token }} |
| 19 | + label: "${{ github.event.label.name }}" |
| 20 | + type: remove |
| 21 | + |
| 22 | + - name: Get PR reviews |
| 23 | + # Put the JSON string for all the PR's completed reviews into env.PR_REVIEWS |
| 24 | + run: | |
| 25 | + url="${{ github.event.pull_request.url }}/reviews" |
| 26 | + echo "${url}" |
| 27 | + response=$(curl -s -X GET \ |
| 28 | + -H 'Accept: application/vnd.github.v3+json' \ |
| 29 | + -H 'Authorization: token ${{ github.token }}' \ |
| 30 | + "${url}?per_page=100") |
| 31 | + echo "${response}" |
| 32 | + echo "PR_REVIEWS<<EOF" >> $GITHUB_ENV |
| 33 | + echo "${response}" >> $GITHUB_ENV |
| 34 | + echo "EOF" >> $GITHUB_ENV |
| 35 | +
|
| 36 | + - name: Create reviewer list |
| 37 | + id: get-reviewers |
| 38 | + run: | |
| 39 | + # Get the current reviewers and the author of the PR, to exclude them from the list. |
| 40 | + # Duplicates don't matter, so get the list of requested reviewers *and* the list of |
| 41 | + # completed reviews. |
| 42 | + requested_reviewers='${{ join(github.event.pull_request.requested_reviewers.*.login, ' ') }} ' |
| 43 | + completed_reviewers='${{ join(fromJSON(env.PR_REVIEWS).*.user.login, ' ') }} ' |
| 44 | + author='${{ github.event.pull_request.user.login }}' |
| 45 | + echo "Requested reviewers: ${requested_reviewers}" |
| 46 | + echo "Completed reviewers: ${completed_reviewers}" |
| 47 | + echo "Author: ${author}" |
| 48 | + exclude_list="${author} ${requested_reviewers} ${completed_reviewers}" |
| 49 | +
|
| 50 | + # Build a JSON list of reviewers to choose from. |
| 51 | + reviewer_list='[' |
| 52 | + first=1 |
| 53 | + for r in ${{ env.reviewerList }}; do |
| 54 | + # Don't include this reviewer if they are already reviewing the PR, or authored it. |
| 55 | + if [[ " ${exclude_list} " != *" $r "* ]]; then |
| 56 | + if [[ ${first} -eq 1 ]]; then |
| 57 | + first=0 |
| 58 | + else |
| 59 | + reviewer_list+=', ' |
| 60 | + fi |
| 61 | + reviewer_list+="\"$r\"" |
| 62 | + fi |
| 63 | + done |
| 64 | + reviewer_list+=']' |
| 65 | + echo "Reviewer list: ${reviewer_list}" |
| 66 | + echo "::set-output name=reviewer_list::${reviewer_list}" |
| 67 | + # If the list is empty, print a warning. The following steps won't run. |
| 68 | + if [[ "${reviewer_list}" == "[]" ]]; then |
| 69 | + echo "::warning ::No reviewers available" |
| 70 | + fi |
| 71 | +
|
| 72 | + - name: Choose random reviewer |
| 73 | + if: ${{ steps.get-reviewers.outputs.reviewer_list != '[]' }} |
| 74 | + id: choose-random |
| 75 | + uses: KhannaAbhinav/random-selector-action@v1 |
| 76 | + with: |
| 77 | + data: ${{ steps.get-reviewers.outputs.reviewer_list }} |
| 78 | + |
| 79 | + - name: Assign Reviewers to PR |
| 80 | + if: ${{ steps.get-reviewers.outputs.reviewer_list != '[]' }} |
| 81 | + uses: itsOliverBott/assign-pr-reviewers@release |
| 82 | + with: |
| 83 | + token: ${{ github.token }} |
| 84 | + users: ${{ fromJSON(steps.choose-random.outputs.selectedValuesList)[0] }} |
0 commit comments