ghコマンドでIssueを一括作成する

July 20, 2025

大きめのプロジェクトやリファクタリングのタスクを進める際に、パターン化されたIssueを複数作成したくなることがある。

元々は spreadsheet で GAS を書いて Issue を一括作成していたのだが、Fine-grained PAT を利用していたので定期的に更新が必要だったり、漏洩リスクを考慮しないといけないなど運用面での課題があった。 そこで、gh extensionとして一括作成できるようにしてみた。

https://github.com/ntsk/gh-issue-bulk-create

個人的には一定の需要があると思うので公式でサポートして欲しいように思うが https://github.com/cli/cli/issues/4774#issuecomment-975633078 によると一度検討して見送られたようだった。

このIssueで紹介されている様に、シェルスクリプトでloopすればいいというのはあるのだが、微調整するうちにシェルスクリプトが辛くなってきたのと、汎用的にしたいモチベがあったのでextensionにした。

while read -r title; do gh issue create --title "$title" --body ""; done < myfile.txt

インストール

gh extension install ntsk/gh-issue-bulk-create

使い方

markdownテンプレートとcsvを組み合わせて、mustache構文でテンプレートにcsvの値を埋め込むことができる作りになっている。 この2つを用意したら下記のコマンドを実行することで、Issueを一括作成できる。
※ 事前に、gh auth login でログインしておくこと。

gh issue-bulk-create --template <template_file> --csv <csv_file> [--repo <owner/repo>] [--dry-run]

markdownテンプレート

GitHubのIssueテンプレート形式で、ファイルの先頭に front matter でメタデータを記述する。 これによって、既存のIssueテンプレートがある場合には流用できる。

---
title: "{{title}}"
labels: "{{label1}}, {{label2}}"
assignees: "{{assignee}}"
---

## Description
{{description}}

## Steps to Reproduce
{{steps}}

## Expected Behavior
{{expected}}

## Actual Behavior
{{actual}}

## Environment
- OS: {{os}}
- Browser: {{browser}}
- Version: {{version}}

テンプレート内では mustache構文 {{変数名}} の形式でcsvのフィールド値を埋め込むことができる。

csvファイル

csvファイルは次のように1行目に埋め込みたい変数のヘッダー、2行目以降にデータを用意する。

title,label1,label2,assignee,description,steps,expected,actual,os,browser,version
Login page error occurs,bug,frontend,ntsk,Error appears when clicking button on the login page,Click the login button,Login process should execute,Error message is displayed,macOS,Chrome,115.0
Search function not working,bug,backend,ntsk,Results don't appear when entering text in search box,"Enter ""test"" in search box and click search button",Search results should appear,Nothing is displayed,Windows,Firefox,120.0
Responsive design issue,bug,ui,ntsk,Layout breaks on mobile screens,Open page on mobile device,Correct layout should be displayed,Elements overlap each other,iOS,Safari,16.0

CSVの各行が1つのIssueとして作成される。フィールドにカンマや改行、ダブルクォートが含まれる場合は、RFC 4180の仕様に従って適切にエスケープする必要がある。

なんだかんだcsvを書くのは面倒なのだが、spreadsheetで書いて出力するなどすると良い。 spreadsheet

注意点

GitHub APIにはリクエスト制限があり、認証済みのアカウントからのリクエストは1時間あたり5000件までとなっている。 このextensionでもrate limitをチェックする実装にはなっているが、1度にあまりにも多い数のIssueを作るのは避けた方が良い。