Skip to content

Commit b7aa15b

Browse files
authored
Add "reviewer roulette" workflow. (#841)
Add a label 'reviewer-roulette', which randomly assigns a new Firebase C++ SDK code reviewer. It won't assign the author of the PR as a reviewer, nor anyone already set as a reviewer, nor anyone who has previously reviewed the PR.
1 parent 5f700e4 commit b7aa15b

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
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

Comments
 (0)