sinshutu_kibotuの日記

大体、大抵、大半、備忘録

GitHub Project(classicじゃない方)をactionsで自動整理する

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がアーカイブされたとき

Workflowの編集画面
Workflowの編集画面

自動で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に閉じる形で実装できるのはすごいなぁ