Dev Study
← 解説「CIで品質を自動チェック — mainを守る門番を立てる」に戻る

サンプルコードで身につける: CIで品質を自動チェック — mainを守る門番を立てる

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1最小のGitHub Actionsワークフロー

リポジトリに.github/workflows/ci.ymlを置くだけで、pushのたびに検査が自動実行されます。まずはlintだけの最小構成から始めて、動くことを確認してからステップを足していくのが確実です。

# .github/workflows/ci.yml — まずは lint だけの最小構成
name: CI
on: [push, pull_request]   # push と PR のたびに実行

jobs:
  lint:
    runs-on: ubuntu-latest # GitHub が用意する Linux 上で実行
    steps:
      - uses: actions/checkout@v4    # リポジトリのコードを取得
      - uses: actions/setup-node@v4  # Node.js を用意
        with:
          node-version: 22
          cache: npm
      - run: npm ci                  # 依存のインストール
      - run: npm run lint            # 検査を実行

2CIで動くテストコマンドにする

ng testは既定では監視モードで起動し、終了しないためCIでは使えません。--watch=falseで一度だけ実行し、ヘッドレスブラウザを指定するのがCI用の定番の形です。npm scriptsに登録しておくと便利です。

# 手元用: 監視モードで起動し、変更のたびに再実行される(終了しない)
ng test

# CI 用: 一度だけ実行して終了する。画面のないブラウザを使う
ng test --watch=false --browsers=ChromeHeadless

# package.json に CI 用コマンドとして登録しておくと呼びやすい
#   "scripts": {
#     "test:ci": "ng test --watch=false --browsers=ChromeHeadless"
#   }

3npm ciを使う — CIでの依存インストール

CIではnpm installではなくnpm ciを使います。package-lock.jsonの内容をそのまま再現するので、実行のたびにバージョンがずれる事故がなく、全員と同じ依存で検査できます。

# npm install — 手元での開発用
#   package.json の範囲内で依存を解決し、lock ファイルを更新することもある
npm install

# npm ci — CI 用
#   ・package-lock.json の内容を完全に再現する
#   ・node_modules を一度削除してから入れ直す
#   ・lock ファイルと package.json が食い違っていたらエラーで止まる
npm ci

# => 「実行するたびに依存が微妙に違う」を防ぎ、検査結果が安定する

4lint・test・buildを揃えた実用形

最小構成が動いたら、テストとビルドのステップを足して門番を完成させます。ステップは上から順に実行され、途中で失敗するとその時点で赤いバツになります。並び順は速く終わるものを先にするのが定石です。

# .github/workflows/ci.yml — lint・test・build を揃えた実用形
name: CI
on: [push, pull_request]

jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: npm          # node_modules のキャッシュで2回目以降を高速化
      - run: npm ci
      - run: npm run lint     # 1. 速い検査を先に
      - run: npm run test:ci  # 2. テスト
      - run: npm run build    # 3. 最後にビルド確認
      # どこかで失敗すると以降は実行されず、PR に赤いバツが付く

5ブランチ保護 — 検査が通るまでマージさせない

CIを門番として機能させる仕上げが、GitHubのブランチ保護設定です。mainへの直接pushを禁止し、CIの成功をマージの必須条件にすると、壊れた変更は仕組みとして入らなくなります。

# GitHub のブランチ保護でよく使う設定(リポジトリの Settings → Branches)
#
#   ・Require a pull request before merging
#       → main への直接 push を禁止し、必ず PR を経由させる
#   ・Require status checks to pass
#       → CI(例: check ジョブ)の成功をマージの必須条件にする
#
# これで開発の流れはこうなる:
#   ブランチで作業 → push → CI が自動実行
#     → 緑のチェック + レビュー承認 → マージできる
#     → 赤いバツ → 直して push し直すまでマージできない
#   → main は「常にCIが通った状態」に保たれる