notebook

都内でWEB系エンジニアやってます。

GitHub Actionsで定期的にmilestoneを作成する

個人的にタスクの管理をGitHubのIssueで管理していて、週や月ごとにマイルストーンを作って管理しています

スクラムイベントみたいなことまでは行っていませんがおおよそどのくらい時間を掛けたかといった意味でポイントをつけています

ZenHubと組み合わせることでバーンダウンチャートやベロシティトラッキングなどのチャートが見れるので振り返るときのために上記の運用をしています

しばらく運用していたら毎週週の初めにマイルストーンを作るのが面倒に感じていたのでGitHub Actionsで自動化しました

shellscriptの作成

milestoneの作成

  • create-milestone.sh
#!/bin/bash

repository=$1
title=$2
due_time=$3

milestone=$(curl -XPOST \
  https://api.github.com/repos/${repository}/milestones \
  -H "Authorization: token ${GITHUB_TOKEN}" \
  -H "Content-Type: application/json" \
  -d @- <<EOS
{
  "title": "${title}",
  "state": "open",
  "description": "${title}",
  "due_on": "${due_time}"
}
EOS
)

echo ${milestone} | jq '.number'

必要な項目を受け取ってAPI経由でmilestoneを作成するshellscriptを用意します

最後にmilestoneのIDを返すようにしています

ZenHubのmilestone項目変更

ZenHubを使うとmilestoneにstart_dateを設定可能になります

バーンダウンチャートなどレポートで見れる項目が増えるのでこれもスクリプト化して自動化します

ZenHub APIでmilestoneに対してPOSTするスクリプトを書きます

#!/bin/bash

milestone_id=$1
start_date=$2

curl -XPOST \
  https://api.zenhub.io/p1/repositories/${ZENHUB_REPO_ID}/milestones/${milestone_id}/start_date \
  -H "X-Authentication-Token: ${ZENHUB_TOKEN}" \
  -H "Content-Type: application/json" \
  -d @- <<EOS
{ "start_date": "${start_date}" }
EOS

別途ZENHUB_REPO_IDZENHUB_TOKENはsecretsから設定します

workflowの設定

---
name: milestone
on:
  schedule:
    - cron: '0 0 * * WED'

jobs:
  create-milestone:
    runs-on: ubuntu-latest
    name: 'create milestone'
    steps:
      - uses: actions/checkout@master
      - name: install jq
        run: |
          sudo apt update
          sudo apt install -y jq
      - id: milestone
        name: create milestone
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          due_time=$(date -d"fri 7 days" +"%Y-%m-%dT23:59:59Z")
          title=$(date -d"mon" +"%Y-%m-%d週")
          milestone=`.github/workflows/bin/create-milestone.sh ${{ github.repository }} ${title} ${due_time}`
          echo "milestone_id=$milestone" >> $GITHUB_OUTPUT
      - name: set milestone starttime
        env:
          ZENHUB_TOKEN: ${{ secrets.ZENHUB_TOKEN }}
          ZENHUB_REPO_ID: ${{ secrets.ZENHUB_REPO_ID }}
        run: |
          start_date=$(date -d"mon" +"%Y-%m-%d")
          ./.github/workflows/bin/zenhub_milestone.sh ${{ steps.milestone.outputs.milestone_id }} ${start_date}

workflowの定期実行

on.schedule で定期実行します

毎週水曜日に実行し、次週のmilestoneを作成するよう設定しています

secretsの扱い

ymlの中でsecretsを参照したい場合は${{ secrets.GITHUB_TOKEN }}のように書けばよいです

shellscript上でsecretsを扱いたい場合はenvでキーを指定して明示的に実行環境へ渡してあげる必要があります

  • 一部抜粋
name: create milestone
env:
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

secretsを設定するだけでshellscriptからでも呼べるかと思ってたが勘違いでした

step間の値の受け渡し

stepにidを割り当ててそのstepの中でoutputを定義することで後続のstepで参照できます

  • 一部抜粋
- id: milestone
  name: create milestone
  run: |
  .....
  .....
  .....
  milestone=`.github/workflows/bin/create-milestone.sh ${{ github.repository }} ${title} ${due_time}`
  echo "milestone_id=$milestone" >> $GITHUB_OUTPUT
- name: set milestone starttime
  run: |
  .....
  .....
  .....
    ./.github/workflows/bin/zenhub_milestone.sh ${{ steps.milestone.outputs.milestone_id }} ${start_date}

echo "milestone_id=$milestone" >> $GITHUB_OUTPUT

でoutputsへ格納し

${{ steps.milestone.outputs.milestone_id }}

で参照します

  • 公式

GitHub Actionsの開発ツール - GitHub ヘルプ

help.github.com

はれて毎週milestoneをポチポチして作成する必要がなくなりました

まとめ

  • GitHub Actionsで反復作業を自動化した
  • APIへのアクセスやリポジトリへのpushなどGITHUB_TOKENだけで行えるので新たにpersonal tokenを生成する必要がないので便利
    • GitHubのAPI使って何かやるみたいなパターンの処理も基本はGITHUB_TOKENを使っておけばよい
    • GitHub Actionsのworkflowから別のworkflowを実行させるみたいなことはGITHUB_TOKENだと権限が足りず実行できないので新たにpersonal tokenの生成が必要
    • 参考
  • 今回はスクリプト用意したがmarketplaceでも提供されているActionがあるのでそれを使っても良いかも