Open4

Github ActionsでPRを後でやるワークフローを作成する

ピン留めされたアイテム
tmmfiretmmfire

やりたいこと

主にBotから送られてくるPRについて、すぐに対応できない場合はpending状態とマークしてIssueを起票する。

大まかな流れ

  1. PRに対してpendingをマークする
    • ラベルをつける
    • レビュワーになったメンバーを外す
    • できれば
      • PRをドラフトに戻す
  2. 1.をトリガーにIssueを作成する
    • IssueからPRへのリンクをつける(するとPRからIssueも捕捉できるようになる)
    • タイトルをPRのタイトルから引用する
    • トリガーを引いたメンバーをアサインする
    • ラベルをつける
  3. 2.のIssueをプロジェクトと紐付ける
    • できれば
      • StatusをTodoに
      • PriorityをP2に
tmmfiretmmfire

検証して実現が難しかったこと

CIでのプロジェクトに対する操作

主にパーミッションが足りなさそうだった。後ほど追記

CIでPRをドラフトに戻す

主にパーミッションが足りなさそうだった。後ほど追記

tmmfiretmmfire

パブリックリポジトリで検証した場合とエンタープライズのプライベートリポジトリで検証した場合のパーミッション設定

前提がいくつか違った。
プライベートリポジトリの場合、以下のpermissionsブロックに以下の設定が追加が必要だった。

Issue、PRを操作する場合に共通して

contentsread権限が必要。
例えば以下のようなエラーが発生。

GraphQL: Resource not accessible by integration (repository.defaultBranchRef)

Projectに所属するIssueと関連付けのあるPRに対する操作

contents: readの他
issues,repository-projectsread権限が必要。
(もしかしたらissues: readはいらないかも、個別に検証できていない)

例えば以下のようなエラーが発生。

GraphQL: Resource not accessible by integration (repository.pullRequest.projectCards.nodes)

tmmfiretmmfire

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。