Open4
Github ActionsでPRを後でやるワークフローを作成する
ピン留めされたアイテム
やりたいこと
主にBotから送られてくるPRについて、すぐに対応できない場合はpending状態とマークしてIssueを起票する。
大まかな流れ
- PRに対してpendingをマークする
- ラベルをつける
- レビュワーになったメンバーを外す
- できれば
- PRをドラフトに戻す
- 1.をトリガーにIssueを作成する
- IssueからPRへのリンクをつける(するとPRからIssueも捕捉できるようになる)
- タイトルをPRのタイトルから引用する
- トリガーを引いたメンバーをアサインする
- ラベルをつける
- 2.のIssueをプロジェクトと紐付ける
- できれば
- StatusをTodoに
- PriorityをP2に
- できれば
検証して実現が難しかったこと
CIでのプロジェクトに対する操作
主にパーミッションが足りなさそうだった。後ほど追記
CIでPRをドラフトに戻す
主にパーミッションが足りなさそうだった。後ほど追記
パブリックリポジトリで検証した場合とエンタープライズのプライベートリポジトリで検証した場合のパーミッション設定
前提がいくつか違った。
プライベートリポジトリの場合、以下のpermissionsブロックに以下の設定が追加が必要だった。
Issue、PRを操作する場合に共通して
contents
のread
権限が必要。
例えば以下のようなエラーが発生。
GraphQL: Resource not accessible by integration (repository.defaultBranchRef)
Projectに所属するIssueと関連付けのあるPRに対する操作
contents: read
の他
issues
,repository-projects
のread
権限が必要。
(もしかしたらissues: read
はいらないかも、個別に検証できていない)
例えば以下のようなエラーが発生。
GraphQL: Resource not accessible by integration (repository.pullRequest.projectCards.nodes)
CLIで発生するパーミッションエラーもREST API経由だとエラーにならない?
github-scriptを使う。Github関連の更新の内部処理にはoctokitが使われている。
例えばレビュワーの更新をghコマンドで実行しようとしたところ
'error fetching organization teams: GraphQL: Resource not accessible by integration (organization.teams)'
が発生したが、octokitでの更新はエラーにならなかった。
パーミッション設定などは同じ。
ghコマンドを利用した例
gh pr edit xxxx --repo xxxxxx --remove-reviewer xxxxx
error fetching organization teams: GraphQL: Resource not accessible by integration (organization.teams)
github-scriptでoctokitを使った例
const reviewers = context.payload.pull_request.requested_reviewers.map(reviewer => reviewer.login);
const team_reviewers = context.payload.pull_request.requested_teams.map(team => team.slug);
await github.rest.pulls.removeRequestedReviewers({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.payload.pull_request.number,
reviewers: reviewers,
team_reviewers: team_reviewers
});
これでOK。