概要
GitHub
でPull request
を生成すると、次のようにReviewers
に手動でレビュアーを設定していました。
今回のブログポストではGitHub Actions
を使ってPull request
のReiewers
にレビュアーを自動で設定する方法について説明します。
GitHub Actions
Pull request
のReviewers
にレビュアーを自動で設定するためには、.github/workflows/set_reviewers.yml
ファイルを生成して次のように修正します。
name: Set reviewers
on:
pull_request:
jobs:
set-reviewers:
name: Set reviewers
runs-on: ubuntu-latest
timeout-minutes: 1
steps:
- name: Set reviewers
run: |
actor="$"
reviewers=("USER_1" "USER_2" "USER_3")
reviewers=($(printf "%s\n" "${reviewers[@]}" | grep -v "$actor" | shuf -n 2))
reviewers=$(printf '%s\n' "${reviewers[@]}" | jq -R . | jq -s .)
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: token $" \
-d "{ \"reviewers\": $reviewers }" \
"https://api.github.com/repos/$/pulls/$/requested_reviewers"
このGitHub Actions
はUSER_1
、USER_2
、USER_3
の中からPull request
を生成した人を除外してランダムに 2 人をReviewers
に設定するように作りました。
actor="$"
reviewers=("USER_1" "USER_2" "USER_3")
reviewers=($(printf "%s\n" "${reviewers[@]}" | grep -v "$actor" | shuf -n 2))
Pull request
のReviewers
には基本的にPull request
を生成した人は設定できません。
このGitHub Actions
を使うとPull request
を生成するたびにランダムにレビュアーを設定してレビュアーを選ぶ時間を短縮することができます。
Dependabot 用 GitHub Actions
先ほど作成したGitHub Actions
はDependabot
が作ったPull request
では動かないです。このGitHub Actions
をDependabot
でも動作するようにするためにはpull_request
部分をpull_request_target
に修正する必要があります。.github/workflows/set_reviewers.yml
ファイルを開いて次のように修正します。
name: Set reviewers
on:
pull_request_target:
jobs:
set-reviewers:
name: Set reviewers
runs-on: ubuntu-latest
timeout-minutes: 1
steps:
- name: Set reviewers
run: |
actor="$"
reviewers=("USER_1" "USER_2" "USER_3")
reviewers=($(printf "%s\n" "${reviewers[@]}" | grep -v "$actor" | shuf -n 2))
reviewers=$(printf '%s\n' "${reviewers[@]}" | jq -R . | jq -s .)
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: token $" \
-d "{ \"reviewers\": $reviewers }" \
"https://api.github.com/repos/$/pulls/$/requested_reviewers"
Dependabot
が作ったPull request
ではセキュリティ上の理由でどのようなsercrets
も使うことができず、Readonly
動作のみが可能なためエラーが発生します。
- GitHub Actions: Workflows triggered by Dependabot PRs will run with read-only permissions
- Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests
これを修正するためにはon
の部分をpull_request
からpull_request_target
に修正する必要があります。
actions/github-script
GitHub
が提供しているactions/github-script
を使うともっと読みやすいコードを書くことができます。
actions/github-script
を使うと次のように修正することができます。
name: Set reviewers
on:
pull_request_target:
jobs:
set-reviewers:
name: Set reviewers
runs-on: ubuntu-latest
timeout-minutes: 1
steps:
- name: Set reviewers
uses: actions/github-script@v5
with:
github-token: $
script: |
const reviewers = ["USER_1", "USER_2", "USER_3"];
const actor = context.payload.pull_request.user.login;
const { owner, repo } = context.repo;
const prNumber = context.payload.pull_request.number;
const { data: assignedReviewers } = await github.rest.pulls.listRequestedReviewers({
owner,
repo,
pull_number: prNumber,
});
if (assignedReviewers.length === 0) {
const filteredReviewers = reviewers.filter(reviewer => reviewer !== actor);
const selectedReviewers = filteredReviewers.sort(() => Math.random() - 0.5).slice(0, 2);
const prNumber = context.payload.pull_request.number;
await github.rest.pulls.requestReviewers({
owner,
repo,
pull_number: prNumber,
reviewers: selectedReviewers
});
}
完了
これでPull request
のReviewers
を自動で設定するGitHub Actions
を作成することができました。このGitHub Actions
を使うとPull request
にReviewers
を設定する時間を減らすことができるし、特定のユーザーにレビューリクエストが集中させることを防ぐことができます。
私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!
アプリ広報
Deku
が開発したアプリを使ってみてください。Deku
が開発したアプリはFlutterで開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。