個人的にタスクの管理を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_IDとZENHUB_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 ヘルプ
はれて毎週milestoneをポチポチして作成する必要がなくなりました
まとめ
- GitHub Actionsで反復作業を自動化した
- APIへのアクセスやリポジトリへのpushなど
GITHUB_TOKENだけで行えるので新たにpersonal tokenを生成する必要がないので便利- GitHubのAPI使って何かやるみたいなパターンの処理も基本は
GITHUB_TOKENを使っておけばよい - GitHub Actionsのworkflowから別のworkflowを実行させるみたいなことは
GITHUB_TOKENだと権限が足りず実行できないので新たにpersonal tokenの生成が必要 - 参考
- GitHubのAPI使って何かやるみたいなパターンの処理も基本は
- 今回はスクリプト用意したがmarketplaceでも提供されているActionがあるのでそれを使っても良いかも