Alternative Architecture DOJO

オルターブースのクラウドネイティブ特化型ブログです。

GitHubのMilestonesを使って毎日のタスクを管理する

こんにちは!オルターブースのエンジニア はっしーです!
オルターブース アドベントカレンダー2024 3日目を担当します!

adventar.org

概要

この記事ではGitHub Milestonesを使用して、毎日のタスクを管理できないか試してみたので紹介したいと思います。

GitHubのMilestones

Milestonesはリポジトリ中のIssueやプルリクエストをグループ化し、進捗の追跡などに使用できる機能です。 docs.github.com

主な特徴として以下の点が挙げられます。

  • Issueやプルリクエストをグループ化できる
  • マイルストーンの期限日が設定できる
  • マイルストーンの完了状況がパーセンテージで表示される
  • マイルストーン内のIssueとプルリクエストをドラッグ&ドロップで優先順位付けできる

タスク管理におけるMilestonesのいいところ

  • 並び替えが容易なので差し込みタスクが来た際にも優先順位の整理が簡単に行える
  • マイルストーンの完了状況が一目でわかるので進捗が分かりやすい
  • 完了状況が100%になったときの達成感が心地いい

試したこと

一日の初めに当日用のMilestoneを作成することにしました。

Milestoneは自動で作成されるようにGitHub Actionsのワークフローを作成します。

name: Create Milestone

on:
  workflow_dispatch:
  schedule:
    - cron: '0 23 * * 0-4'  # 平日の8時にトリガー(日本時間)

jobs:
  create-milestone:
    runs-on: ubuntu-latest
    steps:
      - name: Get current date in JST
        id: date
        run: |
          date=$(TZ=Asia/Tokyo date +'%Y-%m-%d')
          echo "date=$date" >> $GITHUB_ENV
          datetime=$(TZ=Asia/Tokyo date --iso-8601=seconds)
          echo "datetime=$datetime" >> $GITHUB_ENV

      - name: Create milestone
        uses: actions/github-script@v6
        with:
          script: |
            const date = process.env.date;
            const datetime = process.env.datetime;
            const response = await github.rest.issues.createMilestone({
              owner: context.repo.owner,
              repo: context.repo.repo,
              title: date,
              due_on: datetime
            });
            console.log(response.data);

毎日、Milestoneが作成されるようになったので始業してすぐタスクの登録を行い、タスク管理を試してみました。

結果

タスクの登録が面倒臭すぎる!!!
Milestoneの「New Issue」からIssueを作成するとMilestoneを自動で登録し作成してくれるのですが、毎日10個ほどのIssueを作成するのは面倒で続かなかったですw
使わなくなりました。

改良する

Convert Issue機能を使う

「New Issue」から作ると面倒なので、Convert Issue機能を使用するようにしました。

Convert Issue機能はIssue内でIssueを作成する機能です。

- [ ] タスクのようにマークダウン形式でIssueに記載し保存すると、Convert Issueボタンが表示され、Issueを作成することができます。

これだとタスクを書きだしてConvert Issueすると連続で作成できるのでとても楽です。

ただ1つ問題があります。 マイルストーンが紐づかないので自動で登録されません。

Milestoneの割り当てを行うActionsのワークフローを追加

Issueが作成されたとき自動的に最新のマイルストーンに登録するGitHub Actionsのワークフローを作成します。

name: Assign Latest Milestone to New Issues

on:
  issues:
    types: [opened]

jobs:
  assign-milestone:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout repository
      uses: actions/checkout@v2

    - name: Get latest milestone
      id: get_milestone
      uses: actions/github-script@v6
      with:
        script: |
          const milestones = await github.rest.issues.listMilestones({
            owner: context.repo.owner,
            repo: context.repo.repo,
            state: 'open',
            sort: 'created',
            direction: 'desc'
          });
          const latestMilestone = milestones.data[0];
          core.setOutput('latest_milestone', latestMilestone.number);

    - name: Set milestone number
      run: echo "latest_milestone=${{ steps.get_milestone.outputs.latest_milestone }}" >> $GITHUB_ENV

    - name: Assign milestone to issue
      uses: actions/github-script@v6
      with:
        script: |
          const milestone_number = process.env.latest_milestone;
          await github.rest.issues.update({
            owner: context.repo.owner,
            repo: context.repo.repo,
            issue_number: context.issue.number,
            milestone: milestone_number
          });

このワークフローにより、Milestoneが登録されるようになりました。

Milestone作成ワークフローの修正

Convert Issueを使うためには、マークダウン形式でタスクを記述するIssueが必要なので、こちらもあらかじめ作るようにMilestone作成ワークフローを修正します。

name: Create Milestone and Issue

on:
  workflow_dispatch:
  schedule:
    - cron: '0 23 * * 0-4'  # 平日の8時にトリガー(日本時間)

jobs:
  create-milestone-and-issue:
    runs-on: ubuntu-latest
    steps:
      - name: Get current date in JST
        id: date
        run: |
          date=$(TZ=Asia/Tokyo date +'%Y-%m-%d')
          echo "date=$date" >> $GITHUB_ENV
          datetime=$(TZ=Asia/Tokyo date --iso-8601=seconds)
          echo "datetime=$datetime" >> $GITHUB_ENV

      - name: Create milestone
        id: create_milestone
        uses: actions/github-script@v6
        with:
          script: |
            const date = process.env.date;
            const datetime = process.env.datetime;
            const response = await github.rest.issues.createMilestone({
              owner: context.repo.owner,
              repo: context.repo.repo,
              title: date,
              due_on: datetime
            });
            console.log(response.data);
            core.setOutput('milestone_number', response.data.number);

      - name: Set milestone number
        run: echo "milestone_number=${{ steps.create_milestone.outputs.milestone_number }}" >> $GITHUB_ENV

      - name: Create issue and assign milestone
        uses: actions/github-script@v6
        with:
          script: |
            const milestone_number = process.env.milestone_number;
            const response = await github.rest.issues.create({
              owner: context.repo.owner,
              repo: context.repo.repo,
              title: '本日のタスクを登録する',
              body: '本日のタスクをここに記入してください。',
              milestone: milestone_number
            });
            console.log(response.data);

修正した結果

毎日以下のようなタスク管理用のMilestoneが作成されるようになりました。

タスク登録用のIssueでConvert Issueを使用してタスクを追加します。

Milestoneにも登録され一覧で確認することができます。

まとめ

ひとまずはこちらで使ってみて都度改良していきたいと思います。 また良い使い方が見つかれば共有していきたいと思います。

最後まで読んでいただきありがとうございました。


サービス一覧 www.alterbooth.com www.alterbooth.com www.alterbooth.com