GitHub Actionsでmilestoneが適用されていないPRを検知する

概要

  • PRオープン時にマイルストーンがついているか検知する
  • ついていなかったらCIを落とす

を実現したかったが方法に難があるのでメモを残す。

マイルストーンとは
https://docs.github.com/ja/issues/using-labels-and-milestones-to-track-work/about-milestones

前提

結論

下記のようにgithub-scriptを使ってAPIをたたき、マイルストーンをチェックする。

name: Check Milestone

on:
  pull_request:

jobs:
  check-milestone:
    runs-on: ubuntu-latest
    steps:
      - name: check milestone
        uses: actions/github-script@v5
        with:
          script: |
            const { data } = await github.request("GET /repos/{owner}/{repo}/pulls/{pr}", {
              owner: context.repo.owner,
              repo: context.repo.repo,
              pr: context.payload.pull_request.number
            });
            if (data.milestone) {
              core.info(`This pull request has a milestone set: ${data.milestone.title}`);
            } else {
              core.setFailed(`A maintainer needs to set the milestone for this pull request.`);
            }

課題

milestoneをつけ直したときのイベントを検知できないので、GUIからCIを再実行する必要がある。
https://docs.github.com/ja/actions/managing-workflow-runs/re-running-workflows-and-jobs
手動で再実行は面倒なので、CIを落とさずに、コメントを残したりすることで一次対応できそう。

labelは下記のように検知できるが、milestoneは2021年12月現在は対応していない。

on:
  pull_request:
    types: [labeled, unlabeled]

2021/12/21追記

下記のようにコメントを書いて促すようにした。

name: Check Milestone

on:
  pull_request:

jobs:
  check-milestone:
    runs-on: ubuntu-latest
    steps:
      - name: check milestone
        uses: actions/github-script@v5
        with:
          script: |
            const { data } = await github.request("GET /repos/{owner}/{repo}/pulls/{pr}", {
              owner: context.repo.owner,
              repo: context.repo.repo,
              pr: context.payload.pull_request.number
            });
            if (data.milestone) {
              core.info(`This pull request has a milestone set: ${data.milestone.title}`);
            } else {
              github.rest.issues.createComment({
                issue_number: context.issue.number,
                owner: context.repo.owner,
                repo: context.repo.repo,
                body: 'milestoneがついていません:warning:'
              })
            }