100年ぶりにブログを更新します。最近は花粉がすごくてすごいですね。
わけあってGitHub ProjectのカードのStatusを特定の条件で自動更新するということをしました。 GitHub Projectまわりのアップデートが多かったのでそのあたりの紹介とやったことの備忘録になります。
要約
- GitHub Projectのワークフロー すごい、大体これで行ける
- できない操作もActionsから操作可能。しかし、MarketplaceからActionsを探すときは、Project(classic)とProject(現行)のやつが混ざっているので注意
- Project(現行)は project-beta-automations を使えばActionsで操作できる
やりたかったこと
- PRが作られたら自動的にProjectに紐づける
- PRがクローズされたらラベルに応じてStatusを更新する
Projectのワークフローの紹介
これの話 docs.github.com
Workflowでは以下の条件に応じてItemのStatusを更新することができます
- Itemがプロジェクトに追加されたとき
- Itemがreopenしたとき
- Itemがcloseしたとき
- PRに変更を要求するレビューが発生したとき
- PRが承認されたとき
- PRがマージされたとき
- Itemがアーカイブされたとき
自動でIssue/PRをプロジェクトに紐づけるには、「Auto-add to project」の項目から設定ができます。
Issue/PRの検索で利用できる is:pr is:open
などのクエリが指定可能です。
workflowを利用することで「PRが作られたら自動的にProjectに紐づける」は実現できました。
PRがマージされたらラベルに応じてStatusを更新する
これはworkflowの機能だけでは実現できずActionsを利用する形になりました。
Marketplaceから既存のactionsを探しましたが、Project(classic)が混ざっており、更新されていないactionだとProjectとしか書かれていないため、ぱっとはわからない状態でつらいです。 実装を読んで見分ける方法としては、以下になりそうです。
- Project(Classic)にはrest apiとgraphqlの両方のAPIが実装されているが、Project(現行)はgraphqlの実装しかないのでrest apiだけで実装されているのは対応していない可能性が高い
- Project(現行)のgrahpqlのオブジェクト名はProjectV2なのでProjectV2の記述がある
結果として、 project-beta-automations が使えることが分かったのでこれを利用した実装が以下になります。
name: Sample on: pull_request: types: [ closed ] env: GITHUB_PROJECT_ID: 1 jobs: move-to-project-column: if: > github.event.pull_request.merged == true && ( contains(github.event.pull_request.labels.*.name, 'Case-A') || contains(github.event.pull_request.labels.*.name, 'Case-B') ) runs-on: ubuntu-latest steps: - name: Select Column id: select_column run: | if [ ${{ contains(github.event.pull_request.labels.*.name, 'Case-A') }} == true ]; then echo "column_name=Case-A" >> $GITHUB_OUTPUT else echo "column_name=Case-B" >> $GITHUB_OUTPUT fi - name: Move to Project Column uses: leonsteinhaeuser/project-beta-automations@v2.2.1 with: gh_token: ${{ secrets.GITHUB_PAT }} user: sinshutu # organization: sample-org project_id: ${{ env.GITHUB_PROJECT_ID }} resource_node_id: ${{ github.event.pull_request.node_id }} status_value: ${{ steps.select_column.outputs.column_name }}
おわりに
久しぶりにactions書くと特有の記法とか、github.eventにはどんなデータが入ってくるんだとかわからなくなりますね。 とはいえ、今までGASとかをがっつり書かないとできなかったことがgithubに閉じる形で実装できるのはすごいなぁ