【実務・中級編】GitHub ActionsのAPIを叩いてワークフローを制御!GitHub CLI (gh) を使った高度な自動化術 – バージョン管理・CI/CD活用バイブル

ブラウザを閉じろ。GitHub CLI (`gh`) でCI/CDパイプラインを完全掌握する高度自動化術

開発チームの生産性を測る最も分かりやすい指標の一つに、「エンジニアがマウスに手を伸ばす頻度」がある。

PRを作成するためにブラウザを開き、CIのビルドがコケた理由を知るためにGitHubのUIを彷徨い、失敗したジョブをポチポチと再実行する――。この数秒のコンテキストスイッチの積み重ねが、フロー状態にあるエンジニアの脳を容赦なく破壊する。

もし君がチームのテックリードであるなら、今すぐそのマウスを捨てさせろ。そして、ターミナルから一歩も出ずにGitHub Actionsのすべてを支配するGitHub CLI (`gh`) の真の力を叩き込め。

今回は、単なるコマンドの紹介にとどまらない。APIの裏側までハックし、シェルスクリプトやcronと組み合わせて「社内のCI運用を完全に自動化・最適化する」ための実践的な知見を共有する。

—

1. 現場のスピードを劇的に上げる `gh` 隠しコマンドとキーボードショートカット

まずは、日常の開発フローにおいて「ブラウザを開く理由をゼロにする」ための基本と、プロが使っている高速化のテクニックだ。

インストールと初期認証の極意

言わずもがなだが、最新の `gh` CLIを入れろ。パッケージマネージャー(Homebrewなど)で入れるのが定石だ。

macOSの場合
brew install gh

認証(トークン権限は workflow を必ず含めること)
gh auth login -h github.com -p ssh –scopes “repo,workflow,read:packages”

1秒でCIの生死を判定する `gh run` の神エイリアス

CIが落ちたとき、君はログを見るために何クリックしている? `gh run` を使えば、ターミナル上で完結する。

直近のワークフロー実行状況を一覧で確認(インタラクティブ)
gh run list –limit 10

【神コマンド】直近で失敗したワークフローを即座に再実行する
gh run rerun –failed

これを `.zshrc` や `.bashrc` に以下のエイリアスとして登録しておけ。チーム全員に強制しろ。世界が変わる。

失敗したCIの再実行
alias ghrf=”gh run rerun –failed”
実行中のCIをリアルタイムでウォッチ
alias ghw=”gh run watch”

—

2. 絶対に入れるべき神拡張機能(Extensions)

`gh` CLIの真骨頂は、公式機能だけではない。コミュニティ製(あるいはGitHub公式開発)の拡張機能(Extensions)にこそ、真の魔術が隠されている。

以下の2つは、CI/CDを扱う上でインフラレベルの必須ツールだ。

① `ghwf` (Workflow管理の拡張)

ワークフローファイルのバリデーションや、ローカルでのテスト実行を補助する。

gh extension install yusukebe/gh-wf

② `gh-dash` (ターミナル版GitHubダッシュボード)

これを入れた瞬間から、君のターミナルはNASAのコントロールルームになる。PR、Issue、そしてGitHub Actionsの実行ステータスがリアルタイムでマトリクス表示される。

gh extension install dlvhdr/gh-dash

設定ファイル (`~/.config/gh-dash/config.yml`) をチューニングし、自分のアサインされているPRと関連するCIのステータスを常時監視できるようにしておこう。ブラウザのタブはもう2度と開く必要がない。

—

3. 実践:APIを直接叩き、CIを制御・ハックするシェルスクリプト

ここからが本題だ。GitHub Actionsの標準機能だけでは実現できない「痒い所に手が届く自動化」を、`gh api` とシェルスクリプトを組み合わせて実装する。

ケーススタディ:夜間バッチの「孤児ラン(Orphan Runs)」を全抹消するスクリプト

開発が活発なリポジトリでは、PRの乱立によってキャンセルし忘れた古いワークフローや、テスト用のゴミランがストレージとAPIレートリミットを圧迫する。
これをcronで毎晩自動クリーンアップするスクリプトを記述する。

!/usr/bin/env bash
==============================================================================
clean-stale-runs.sh
実行中の古いワークフローや、キューに溜まったままのジョブを強制キャンセル・削除する
==============================================================================

set -euo pipefail

REPO=”your-org/your-mission-critical-repo”
WORKFLOW_NAME=”CI/CD Pipeline”

echo “==> Fetching queued or in_progress runs for ${REPO}…”

1. gh api を使って、JSON形式でターゲットのrun IDを取得する
状態が ‘queued’ または ‘in_progress’ のものをフィルタリング
RUNS_JSON=$(gh api \
-X GET \
“repos/${REPO}/actions/runs?status=in_progress&per_page=50” \
–jq ‘.workflow_runs[] | select(.name == “‘”${WORKFLOW_NAME}”‘”) | .id’)

if [ -z “$RUNS_JSON” ]; then
echo “==> No active runs found for ‘${WORKFLOW_NAME}’.”
exit 0
fi

2. 取得したIDに対してキャンセルリクエストを送信する
for RUN_ID in $RUNS_JSON; do
echo “Cancelling run ID: ${RUN_ID}…”
gh api \
-X POST \
“repos/${REPO}/actions/runs/${RUN_ID}/cancel” \
–silent

echo “Successfully cancelled run ${RUN_ID}.”
done

echo “==> Cleanup completed successfully.”

これをサーバの `crontab` に登録しておけば、野良CIの暴走によるリソース枯渇とは永遠にオサラバだ。

—

4. チーム開発における設定の共有化ルールと自動化パイプライン

個人がCLIを使いこなすだけでは、組織の生産性は頭打ちになる。チーム全体で「CLIファースト」な開発文化をスケールさせるためのルール作りを伝授する。

1. `gh` を前提とした Makefile の共通化

プロジェクトのルートに `Makefile` を配置し、複雑なCI操作やローカル検証コマンドを抽象化する。これにより、メンバーはコマンドを覚える必要すらなくなる。

==============================================================================
Makefile for CI/CD Operations via GitHub CLI
==============================================================================

.PHONY: ci-status ci-logs ci-retry

直近のCIステータスを確認
ci-status:
@gh run list –limit 5

直近の失敗したCIのログをターミナルに直接吐き出す(トラブルシューティング用)
ci-logs:
@FAILED_RUN_ID=$$(gh run list –status failure –limit 1 –json databaseId –jq ‘.[0].databaseId’); \
if [ -z “$$FAILED_RUN_ID” ]; then \
echo “No failed runs found.”; \
else \
echo “Fetching logs for failed run: $$FAILED_RUN_ID”; \
gh run view “$$FAILED_RUN_ID” –log-failed; \
fi

失敗したCIをピンポイントで再実行
ci-retry:
@gh run rerun –failed
@echo “Retriggered failed jobs. Watching status…”
@gh run watch

開発者は `make ci-logs` と叩くだけで、ブラウザを開いてログの折り畳みを展開する苦行から解放される。

2. ワークフロー定義のベストプラクティス(YAML構成例)

CLIからの制御性を高めるためには、GitHub Actions側のYAML設計もそれに最適化されている必要がある。特に `concurrency` の設定は、CLIから手動実行(`gh workflow run`)する際の二重実行を防ぐために不可欠だ。

.github/workflows/deploy.yml
name: Production Deployment

on:
workflow_dispatch:
inputs:
environment:
description: ‘Target environment to deploy’
required: true
default: ‘staging’
type: choice
options:

  • staging
  • production

force_migrate:
description: ‘Force DB migration’
required: false
type: boolean
default: false

【重要】CLIからの手動実行も含め、同一ブランチ/環境での競合を防ぐ
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.environment }}
cancel-in-progress: true

jobs:
deploy:
runs-on: ubuntu-latest
steps:

  • name: Checkout Code

uses: actions/checkout@v4

  • name: Execute Deployment

run: |
echo “Deploying to ${{ inputs.environment }}…”
echo “Force Migrate: ${{ inputs.force_migrate }}”
# デプロイ処理の実態…

このワークフローに対し、CLIから以下のようにパラメータ付きでキックできる。

gh workflow run “Production Deployment” \
-f environment=production \
-f force_migrate=true

もはや、GitHubのWeb UIにある「Run workflow」のボタンをクリックするためにブラウザに切り替える理由は1ミリも存在しない。

—

5. 終わりに:ツールを使い倒す者だけが、開発の主導権を握る

CI/CDツールに振り回されるな。ツールを使い倒せ。

今回紹介した `gh` CLIを用いたワークフロー制御は、単なる「効率化のテクニック」ではない。開発のフィードバックループを極限まで圧縮し、エンジニアリングの集中力を保つための防衛策である。

明日からチームの定例でこう宣言しろ。
「これより我がチームのCI/CD操作は、すべてターミナル経由に移行する」と。

その瞬間から、君たちの開発スピードはネクストステージへと突入するはずだ。

タイトルとURLをコピーしました