はじめに
システムの移行に伴い、既存のコードを新しいシステムに合わせて書き直す作業が大量に発生しました。
チームを跨いで作業を進めるため、タスク管理には GitHub Issues を使いたいと考えました。
しかし、手動で何十個ものIssueを作るのは心が折れます……。
そこで、「タスク名」と「担当チームのラベル」を記載したCSVファイルから、シェルスクリプトを使って一撃でIssueを一括作成できる環境を整えました。
AIにわざわざ作らせるほどではない、ちょっとした「泥臭い自動化」ですが、同じような課題を抱えている方の参考になれば幸いです。
前提条件
このスクリプトでは GitHub CLI (gh) を使用します。事前にインストールと認証を済ませておいてください。
# Macの場合のインストール例
brew install gh
# ログイン認証
gh auth login
1. CSVファイルの準備
まずは、発行したいIssueのリストをCSVで用意します。1行目はヘッダー行として扱い、2行目以降に「タスク名」と「ラベル名」を記述します。
ラベル(team1 など)は、あらかじめGitHubリポジトリ側に作成しておいてください。
task_name,develop_team
task1,team1
task2,team2
2. シェルスクリプトの実装
CSVを読み込んで一括でIssueを作成するスクリプトです。Windows環境で作成されたCSVの改行コード(CRLF)や、カンマ前後のスペースにも対応できるように配慮しています。
#!/bin/sh
# Issueを作成する関数
create_issues() {
local task_name_arg="$1"
local develop_team_arg="$2"
# Issueの本文テンプレート(Markdown)
body=$(cat <<EOF
## 概要
- [ ] ここに概要を記述
## 作業チェックリスト
- [ ]
### 作業ドキュメント
- [ ]
EOF
)
# GitHub CLIを使ってIssueを作成
gh issue create \
--title "task: ${task_name_arg}" \
--body "${body}" \
--label "${develop_team_arg}"
}
# 読み込むCSVファイルのパス
FILE_NAME="${HOME}/情報ソース.csv"
if [ ! -f "${FILE_NAME}" ]; then
echo "Error: File ${FILE_NAME} not found." >&2
exit 1
fi
# CSVを1行ずつ読み込む(最終行に改行がない場合も考慮)
while IFS=, read -r name develop_team || [ -n "$name" ]; do
# Windowsの改行コード(\r)や余分なスペースを削除
task_name=$(echo "$name" | tr -d ' \r')
develop_team=$(echo "$develop_team" | tr -d ' \r')
# ヘッダー行をスキップ
[ "$task_name" = "task_name" ] && continue
# 空行をスキップ
[ -z "$task_name" ] && continue
echo "Creating issue: ${task_name} for ${develop_team}..."
create_issues "$task_name" "$develop_team"
# APIのレートリミット対策(負荷軽減のために0.5秒待つ)
sleep 0.5
done < "${FILE_NAME}"
スクリプトのポイント
-
改行コード・スペース対策:
tr -d ' \r'を使うことで、CSVファイル内に含まれる不要なスペースやWindows特有の改行コード(CRLF)を除去し、ghコマンドのエラーを防いでいます。 -
APIへの配慮: 大量のリクエストを短時間に送るとGitHub側で制限がかかる可能性があるため、
sleep 0.5を挟んで安全に実行しています。 -
最終行の読み込み:
|| [ -n "$name" ]を入れることで、CSVの最終行の末尾に改行がなくても正しく処理されるようにしています。
どんな場面で役立つか?
このスクリプトは、以下のようなシチュエーションで特に威力を発揮します。
- システムの移行・リプレイス: 既存のソースコードやコンポーネントを、新システムへ並列して移行していくとき
- パターンの決まった大量タスク: Issueのタイトルや本文のフォーマットがほぼ同じで、数だけが多いとき
- 複数チームへの一斉振り分け: 同じ内容のタスクを、異なる複数のチーム(ラベル)に一括で割り振りたいとき
- AI利用: AIが自走できるように、タスクの粒度を揃えてIssue化する
まとめ
ちょっとした自分用の簡易スクリプトですが、手動でポチポチ作っていたら数時間かかる作業が、ものの数秒で終わります。
この手のスクリプトは、作ってもどこに保管したか忘れるので記事にしました。
同じようなことを考えている方の参考になれば幸いです!