GitHub Actionsの「見えないコスト」を叩き潰せ:最強のCI/CD最適化戦略
GitHub Actionsは魔法の杖ではない。適当に書けば、月末に「クラウド破産」の請求書が届くただの課金マシンだ。
私はこれまで数々のプロジェクトを救ってきたが、「なぜかCI料金が天井知らずに跳ね上がっている」という相談を受けるたび、同じ絶望を何度も見てきた。今日は、GitHub Actionsを単なるツールから「利益を生み出す武器」に変えるための、現場の極限テクニックを伝授する。
—
1. 課金体系の「死角」を理解する
GitHub Actionsの課金は、主に「実行時間(分単位)」と「データ転送量」で決まる。特に無視できないのが以下の2点だ。
- OSによる倍率: `ubuntu-latest`は1分1ユニットだが、`macos-latest`は10分、`windows-latest`は2分として換算される。
- 無料枠の罠: パブリックリポジトリは無料だが、プライベートリポジトリはプランごとの分数が決まっている。CIが長引けば、その分だけ開発者の「待ち時間」と「金」が同時に溶ける。
—
2. ワークフロー最適化の「禁じ手」
「とりあえず全テストを毎回走らせる」のは素人のやることだ。プロは「差分」だけを狙い撃つ。
① `paths` トリガーによる無駄の排除
ドキュメントの修正で毎回全テストを走らせる必要はあるか? 答えはNoだ。
.github/workflows/ci.yml
on:
push:
branches: [main]
# 特定のディレクトリやファイルが変更された時だけ起動する
paths:
- ‘src/’
- ‘tests/’
- ‘go.mod’
② キャッシュの「神」になる
依存関係のインストール時間は、CIの最大の無駄だ。`actions/cache`を使い倒せ。
- name: Cache Go modules
uses: actions/cache@v3
with:
path: ~/go/pkg/mod
# keyをハッシュ化することで、変更時のみキャッシュを更新する
key: ${{ runner.os }}-go-${{ hashFiles(‘/go.sum’) }}
restore-keys: |
${{ runner.os }}-go-
—
3. 「セルフホストランナー」という究極の選択肢
もし君のチームが月額数百ドルのCI料金を払っているなら、セルフホストランナーへの移行を検討すべきだ。
- メリット: 無料。時間制限なし。GPUや高スペックなメモリを搭載したオンプレミスサーバーで、CIを爆速化できる。
- 注意点: セキュリティ。パブリックリポジトリでセルフホストを使うのは自殺行為だ。プライベート環境限定の秘策として扱え。
—
4. チーム開発を加速させる「作法」
隠れたキーボードショートカット
ブラウザ上でActionsを操作する時、マウスに触れるのは負けだ。
- `g` + `a` (GitHubのリポジトリ画面から): Actionsタブへ瞬時に遷移。
- `Shift` + `J` / `K`: ワークフロー一覧の上下移動。
必須の「神」GitHub App
- [GitHub Actions Status](https://github.com/marketplace/actions/actions-status): Slack通知設定をYAMLで汚すな。Appに任せて、通知のカスタマイズはGUIで完結させるのがモダン。
共有化ルール:Reusable Workflows
個々のリポジトリでYAMLをコピペしているなら、今すぐやめろ。「共通CIリポジトリ」を作成し、`workflow_call`で呼び出すのが鉄則だ。
呼び出し側 (caller)
jobs:
test:
uses: my-org/shared-workflows/.github/workflows/test.yml@main
—
5. 現場のテックリードが教える「限界コスト削減」YAML構成例
最後に、私が実務で導入している「最小コスト・最大効率」のテンプレートを共有する。
name: CI
on:
pull_request:
paths-ignore:
- ‘.md’ # ドキュメント修正ならCIをスキップ
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 10 # 暴走した処理を即座に殺すための絶対設定
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: ’20’
cache: ‘npm’ # アクション内蔵のキャッシュ機能を使うのが正解
- name: Install dependencies
run: npm ci –prefer-offline # ネットワーク時間を削減
- name: Run Tests
run: npm test
最後に:エンジニアへ告ぐ
CI/CDは単なる自動化ではない。「チームの思考のサイクルをどれだけ速く回せるか」という競技だ。
コストを意識することは、リソースの制約を知ることであり、それはすなわち「より洗練されたコード」を書くための視点を持つことに直結する。
今日から、ワークフローのYAMLファイルを開いて`timeout-minutes`を書き込むところから始めてくれ。君たちの開発体験が、劇的に改善することを約束する。