概要
GitHub
でPull request
を作成する際、次のようにAssignees
を手動でPull request
を作成した人を設定していました。
Pull request
のAssignees
は結局Pull request
を作成した人なので、Pull request
を作成するたびにAssignees
にPull request
を作成した人を自動で設定したいと思いました。
今回のブログポストでは、GitHub Actions
を使ってPull request
のAssignees
にPull request
を作成した人を自動で設定する方法について説明します。
GitHub Actions 作成
それではPull request
のAssignees
にPull request
を作成した人を自動で設定するGitHub Actions
を作ってみましょう。.github/workflows/set_assignees.yml
ファイルを作成し、次のように修正します。
name: Set assigness
on:
pull_request:
types:
- opened
jobs:
set-assignees:
name: Set assignees
runs-on: ubuntu-latest
timeout-minutes: 1
steps:
- name: Set assignees
run: |
OWNER="$"
REPOSITORY="$"
TOKEN="$"
PULL_REQUEST_NUMBER="$"
ASSIGNEES=$(curl -s \
"https://api.github.com/repos/$OWNER/$REPOSITORY/issues/$PULL_REQUEST_NUMBER" | \
jq --raw-output '.assignees // [] | .[].login')
if [ -z "$ASSIGNEES" ]; then
ASSIGNEE=$
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: token $TOKEN" \
-d "{ \"assignees\": \"${ASSIGNEE}\" }" \
https://api.github.com/repos/$REPOSITORY/issues/$PULL_REQUEST_NUMBER/assignees
fi
GitHub
が提供するAPI
を使ってPull request
のAssignees
にPull request
を作成した人(github.actor
)を設定するようにしました。
- 公式ドキュメント: List assignees
- 公式ドキュメント: Add assignees to an issue
Dependabot 用 GitHub Actions
私は個人プロジェクトでDependabotを使ってます。Dependabot
が作ったPull request
にプロジェクトOwner
をAssignees
に設定したかったです。
このためにGitHub Actions
を次のように修正しました。
name: Set assigness
on:
pull_request:
types:
- opened
jobs:
set-assignees:
name: Set assignees
runs-on: ubuntu-latest
timeout-minutes: 1
steps:
- name: Set assignees
run: |
OWNER="$"
REPOSITORY="$"
TOKEN="$"
PULL_REQUEST_NUMBER="$"
ASSIGNEES=$(curl -s \
"https://api.github.com/repos/$OWNER/$REPOSITORY/issues/$PULL_REQUEST_NUMBER" | \
jq --raw-output '.assignees // [] | .[].login')
if [ -z "$ASSIGNEES" ]; then
ASSIGNEE=$
BRANCH_NAME=$
if [[ "${BRANCH_NAME}" == "dependabot/"* ]]; then
ASSIGNEE=$OWNER
fi
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: token $TOKEN" \
-d "{ \"assignees\": \"${ASSIGNEE}\" }" \
https://api.github.com/repos/$REPOSITORY/issues/$PULL_REQUEST_NUMBER/assignees
fi
追加した内容は次のようにbranch
名がdependabot/
で始まる場合、Assignees
にgithub.repository_owner
を設定するようにしました。
BRANCH_NAME=$
if [[ "${BRANCH_NAME}" == "dependabot/"* ]]; then
ASSIGNEE=$OWNER
fi
しかし、このGitHub Actions
はDependabot
のPull request
で正常に動作しませんでした。セキュリティーの理由で、Dependabot
のPull request
ではどのsercrets
も使用できないし、Readonly
の動作しかできないためエラーが発生しました。
これを修正するためにはon
にpull_request
ではなくpull_request_target
を使用するように修正する必要があります。
- 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
name: Set assigness
on:
pull_request_target:
types:
- opened
actions/github-script
GitHub
が提供するactions/github-script
を使うともっと読みやすいコードを作成することができます。
actions/github-script
を使うと次のように修正することができます。
name: 'Set assignees'
description: 'Set assignees automatically to the pull request.'
inputs:
token:
description: 'GitHub token'
required: true
runs:
using: 'composite'
steps:
- name: Set assignees
uses: actions/github-script@v6
with:
github-token: $
script: |
const { owner, repo } = context.repo;
const prNumber = context.payload.pull_request.number;
const response = await github.request(`GET /repos/${owner}/${repo}/issues/${prNumber}`);
const assignees = response.data.assignees.map(assignee => assignee.login);
if (assignees.length === 0) {
let assignee = context.actor;
const branchName = context.payload.pull_request.head.ref;
if (branchName.startsWith('dependabot/')) {
assignee = owner;
}
await github.rest.issues.addAssignees({
owner: owner,
repo: repo,
issue_number: prNumber,
assignees: [assignee]
});
}
完了
これでPull request
のAssignees
にPull request
を作成した人を自動で設定するGitHub Actions
を作成しました。Pull request
を作成するたびにAssignees
にPull request
を作成した人を手動で設定してる場合、このGitHub Actions
を使用して自動化してみてください。
私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!
アプリ広報
Deku
が開発したアプリを使ってみてください。Deku
が開発したアプリはFlutterで開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。