GitHub Labels/Issues をワンクリックで作成したい(GitHub Actions活用)
GitHub では テンプレートリポジトリ という特別なリポジトリを作成できます。 テンプレートリポジトリを使うと、新しいプロジェクトを始める際に、 ディレクトリ構造やブランチ、ファイルを同じ構成でコピーして利用できます。
ただし、引き継がれる要素には制限があります。 たとえば、Issueやラベル、GitHub Actionsのワークフロー履歴、 リポジトリ設定(ブランチ保護ルールやマージ設定など)は引き継がれません。
今回、テンプレートリポジトリを活用する機会があったのですが、 以下のようなニーズもありました。 (そして、これらはテンプレートリポジトリでは引き継がれない項目です)
- どのプロジェクトでも共通して利用するIssueもサクッと作成したい
 - どのプロジェクトでも汎用的に利用するラベルもサクッと作成したい
 
もともと gh コマンドによる手動実行を考えていましたが、 「GitHub Actions からワンクリックでセットアップできたら嬉しいかも」 と思いました。
本ブログにて、セットアップ用のワークフローファイルを作成してみます。
自動化したい内容
ラベルの一括作成
プロジェクト管理で使用できる汎用的なラベルを一括で作成します。 たとえば以下のような項目です。
| ラベル名 | 説明 | 
|---|---|
| 親課題 | 親課題用ラベル | 
| アプリ | フロントエンド/バックエンド関連 | 
| インフラ | AWSインフラ関連 | 
| 優先度:高 | 優先度:高 | 
| 優先度:低 | 優先度:低 | 
| 工数:大 | 工数目安:XXh以上 | 
| 工数:小 | 工数目安:XXh以内 | 
コマンドラインから実行する場合の ghコマンドは gh label create です。
gh label create "親課題" --color "7057ff" --description "親課題用ラベル"
gh label create "アプリ" --color "d876e3" --description "フロントエンド/バックエンド関連"
gh label create "インフラ" --color "fbca04" --description "AWSインフラ関連"
# ... 以下略
Issueの作成
どのプロジェクトでも共通して利用するようなIssueを作ります。 たとえば以下のような項目です。
| Issue タイトル | 説明 | ラベル | 
|---|---|---|
| 【親課題】コミュニケーション | 業務連絡やミーティング記録を管理する親課題 | 親課題 | 
| 【親課題】AWS環境セットアップ | AWS環境セットアップのための親課題 | 親課題 | 
| AWSアカウント発行 | AWSアカウントを発行する | インフラ | 
コマンドラインから実行する場合の ghコマンドは gh issue create です。
gh issue create \
  --title "【親課題】コミュニケーション" \
  --body "業務連絡やミーティング記録を管理する親課題" \
  --label "親課題"
gh issue create \
  --title "【親課題】AWS環境セットアップ" \
  --body "AWS環境セットアップのための親課題" \
  --label "親課題"
gh issue create \
  --title "AWSアカウント発行" \
  --body "AWSアカウントを発行する" \
  --label "インフラ"
# ... 以下略
親子関係の設定
作成したIssueに親子関係を作成して、Issueをグルーピングします。
親子関係の設定には、以下の2ステップが必要です。
- parent-issueとsub-issueのIDを取得( gh issue list もしくは gh issue view )
 - GraphQL APIで親子関係を設定( gh api graphql , addSubIssue )
 
# 1. parent-issueと sub-issueのIDを取得
PARENT_ID=$(gh issue list --state all --search "【親課題】AWS環境セットアップ in:title" \
  --json id,title --jq '.[] | select(.title == "【親課題】AWS環境セットアップ") | .id' )
SUB_ID=$(gh issue list --state all --search "AWSアカウント発行 in:title" \
  --json id,title --jq '.[] | select(.title == "AWSアカウント発行") | .id' )
# 2. GraphQL APIで親子関係を設定
gh api graphql -H "GraphQL-Features: sub_issues" -f query="
  mutation {
    addSubIssue(input: {
      issueId: \"${PARENT_ID}\",
      subIssueId: \"${SUB_ID}\"
    }) {
      issue { title number }
      subIssue { title number }
    }
  }"
ワークフローを作ってみた
最小構成版
まず、最小限の機能を持つワークフローを記載します。 3ステップ: Create labels , Create parent-issues, Create sub-issues and link to parent をシンプルに実行するワークフローです。
改善版
最小構成版から、以下に示す機能改善を施したもの作りました。
- TSVファイルから セットアップするLabel/Issueを連携する
 - すでに Label/Issue が存在する場合は処理をスキップする
 
TSVファイルの配置と内容は以下のとおりです。
.github/
└── github-initial-setup/
    ├── labels.tsv         # ラベル定義
    ├── parent-issues.tsv  # Parent Issue定義
    └── sub-issues.tsv     # Sub Issue定義
name    color   description
アプリ d876e3  フロントエンド/バックエンド関連
インフラ    fbca04  インフラ関連(AWS, Terraformなど)
優先度:高   b60205  優先度: 高
title    labels    body
000_コミュニケーション    親課題    業務連絡やミーティング記録
010_事前準備    親課題    プロジェクト開始前の各種準備
020_要件定義    親課題    アプリケーションの要件定義
parent_title    title    body    labels
000_コミュニケーション    業務連絡    日々の業務連絡を記録する    優先度:中,工数:小
000_コミュニケーション    ミーティング記録    定例会議などの記録を管理する    優先度:中,工数:小
010_事前準備    アカウント準備    各種アカウントの準備作業    優先度:高,工数:中,インフラ
ワークフローファイルがこちら。
実行してみる
ワークフローを手動実行( workflow_dispatch )で起動してみます。 GitHubリポジトリの [Actions] タブから該当のワークフローを選択し、 [Run workflow] をクリックします。

実行後、ラベルとIssueが自動的に作成されます。


参考: ジョブのログ
おわりに
GitHub Actionsを使ってリポジトリ初期設定を自動化する方法を紹介しました。 テンプレートリポジトリは活用しつつ、 引き継がれない項目は、本ブログで紹介したような自動化を活用すると、 便利だと思います。
以上、参考になれば幸いです。






