
この記事は、ニフティグループ Advent Calendar 2025 3日目の記事です。
はじめに
こんにちは!新卒1年目のパクパクです 👋
OJT中のタスクの中でGraphQLで処理していたIssue作成のプロセスを、GitHub CLI(ghコマンド)に処理する作業を行いました。
この過程で学んだghコマンドについてご紹介します。それでは Let’s go!
目標
ghコマンドを使い、メインIssueとサブIssueを作成してプロジェクトに追加する
1. プロジェクトデータの取得 (Get Project and Field IDs)
Issueを作成してプロジェクトボードで管理するには、まず必要となる各種IDを収集する必要があります。ghコマンドで情報を取得し、jqを使ってJSONデータを使います。
gh project view
gh project view [<number>] [flags]
プロジェクトの詳細情報を取得します。

- オプション [flags]
--owner: 個人またはOrganizationのアカウント--format: 出力フォーマット
例えば、Organizationがmy-orgである1番プロジェクトに関する詳細情報を取得したい場合は、以下のように入力します。
入力
|
1 |
$ gh project view 1 --owner my-org --format json |
出力
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
{ "closed": false, "fields": { "totalCount": 10 }, "id": "ABC_dkBO...", "items": { "totalCount": 50 }, "number": 1, "owner": { "login": "my-org", "type": "Organization" }, "public": false, "readme": "プロジェクト Readme...", "shortDescription": "プロジェクト 説明...", "title": "GitHub CLIでIssueを作成しよう", "url": "https://github.com/orgs/my-org/projects/1" } |
末尾の -q .id オプションで、プロジェクトIDの値だけ抽出しました。
|
1 |
PROJECT_ID=$(gh project view 1 --owner my-org --format json -q .id) |
gh project field-list
gh project field-list [<number>] [flags]
プロジェクトのフィールド情報を一覧表示します。

- オプション [flags]
--owner: 個人またはOrganizationのアカウント--format: 出力フォーマット
入力
|
1 |
gh project field-list 1 --owner my-org --format json |
出力
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
{ "fields": [ (...) { "id": "PVT_kw...", <span style="background-color: rgb(231, 243, 248);">"name": "Status"</span>, "options": [ { "id": "98234798...", "name": "In progress" } (...) ], "type": "ProjectType..." }, { "id": "abc123", <span style="background-color: rgb(231, 243, 248);">"name": "Sprint"</span>, "type": "ProjectV2Field" }, { "id": "def456", <span style="background-color: rgb(231, 243, 248);">"name": "Point"</span>, "type": "ProjectV2Field" }, { "id": "ghi789", <span style="background-color: rgb(231, 243, 248);">"name": "Priority"</span>, "type": "ProjectV2Field" }, (...) ], "totalCount": 5 } |
StatusフィールドのIDを取得するために、下記のコマンドを使いました。ghコマンドの結果をjqに直接渡してIDを抽出します。
|
1 |
STATUS_FIELD_ID=$(gh project field-list 1 --owner my-org --format json | jq -r '.fields[] | select(.name=="Status") | .id') |
gh project item-list
gh project item-list [<number>] [flags]
プロジェクトに追加されているアイテム(IssueやPRなど)を一覧表示します。

- オプション [flags]
--owner: 個人またはOrganizationのアカウント--format: 出力フォーマット
入力
|
1 |
gh project item-list 1 --owner my-org --format json |
出力
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
{ "items": [ { "assignees": [ "pakupaku" ], "content": { "body": "# 概要nサービスローンチに向けて...", "number": 1, "repository": "my-org/backend-api", "title": "ユーザー認証機能の実装", "type": "Issue", "url": "https://github.com/my-org/backend-api/issues/1" }, "due": "2025-12-15", "id": "PVID_abc123", "labels": [ "bug", "high-priority" ], "linked pull requests": [ "https://github.com/my-org/backend-api/pull/2", "https://github.com/my-org/backend-api/pull/3" ], "point": 1, "repository": "my-org/backend-api", "sprint": { "duration": 14, "iterationId": "abc12345", <span style="background-color: rgb(231, 243, 248);">"startDate": "2025-11-18"</span>, "title": "Sprint" }, "status": "In Progress", "title": "ユーザー認証機能の実装" }, (...) ], "totalCount": 3 } |
プロジェクトアイテムの中から現在のスプリント情報を特定するために、各sprintのstartDateを取得します。
2. Issueの作成 (メインIssueとサブIssue)
gh issue create
gh issue create [flags]
新しいIssueを作成します。

- オプション [flags]
R,-repo: Issueを作成するリポジトリを選択します。t,-title: Issueのタイトルを指定します。b,-body: Issueのボディ(内容)を指定します。l,-label: Issueのラベルを指定します。
このコマンドで、GitHub上でIssueが作成されます。
入力
|
1 2 3 4 |
gh issue create --repo "my-org/my-repository" --title "ログイン画面のUI実装" --body "Figmaのデザイン案に従って..." --label "feature" |
gh issue view
gh issue view {<number> | <url>} [flags]
Issueの詳細情報を表示します
入力
|
1 |
gh issue view "https://github.com/my-org/my-repository/issues/2" |
出力
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
title: ログイン画面のUI実装 state: OPEN author: pakupaku labels: feature comments: 2 assignees: developer123, reviewer456 projects: Development Board (In Progress) milestone: v1.0.0 number: 2 url: https://github.com/my-org/my-repository/issues/2 -- Figmaのデザイン案に従って、ログインフォームを実装します。 メールアドレス、パスワードの入力フィールドおよびバリデーション(Validation)を含めてください。 |
ここでも-q .id を使って、作成されたIssueのIDだけ取得できます。
入力
|
1 |
gh issue view "https://github.com/my-org/my-repository/issues/2" --json id -q .id |
3. Issueをプロジェクトに追加する
gh project item-add
gh project item-add [<number>] [flags]
プロジェクトにアイテム(IssueやPR)を追加します。

- オプション ([flags]
-owner: 個人またはOrganizationのアカウント-url: プロジェクトに追加したいIssueやPRのURL
入力
|
1 |
gh project item-add 1 --owner my-org --url "https://github.com/my-org/my-repository/issues/2" |
gh project item-edit
gh project item-edit [flags]
プロジェクト内のアイテム(IssueやPRなど)のフィールド値を変更します。

- オプション [flags]
-id: 編集したいアイテムのID-project-id: 対象のプロジェクトID-field-id: 値を設定したいフィールドのID-single-select-option-id: 単一選択フィールド(Single Select)で設定したいオプションのID-iteration-id: イテレーション(Iteration)フィールドで設定したい値のID-date: 日付フィールドに設定したい値(YYYY-MM-DD形式)-number: 数値フィールドに設定したい値
例えば、プロジェクトの日付を指定したりする場合に下記のコマンドを使います。
入力
|
1 |
gh project item-edit --id "PVTI_lA..." --project-id "PVT_kw..." --field-id "PVTF_lAD..." --date "2025-12-8" |
4. メインIssueとサブIssueを紐付ける
gh api
gh api <endpoint> [flags]
GitHub APIに対してHTTPリクエストを送信します。

Issueをメイン ↔ サブ関係で紐付ける機能は、ghコマンドではまだサポートされていません。そのため、gh apiコマンドを使ってGitHub APIを直接呼び出すことで対応します。
Request Bodyとして送信するデータはJSON形で渡します。
入力
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# サブIssueのIDを指定 SUB_ISSUE_ID="I_kwDO..." # Request BodyをJSON形式で作成 JSON_BODY=$(printf '{"sub_issue_id": "%s"}' "$SUB_ISSUE_ID") echo "$JSON_BODY" | gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" "/repos/${OWNER}/${REPO}/issues/${MAIN_ISSUE_NUMBER}/sub_issues" --input - |
このようにして、GitHub REST APIのエンドポイント(.../sub_issues)に対して直接POSTリクエストを送信し、Issueの親子関係を設定しました。
まとめ
これまではブラウザ上で操作するのが当たり前だと思っていましたが、今回、GitHub CLI(gh コマンド)を使ってみて、Issue作成から親子関係の紐付けまでできるということを学びました。 UIだけでなく、CLI環境でも色んな作業ができることを知り、これからもCLIツールを活用して、開発効率を上げていきたいと思います!
明日は、中井さんの「ファミコンのソフトを作る。Rust で」です。
お楽しみです 😊


