第31章:CIで自動チェックして「壊してない自信」を毎回つける🤖✅
この章で作るのはコレ👇✨
Pull Request を出したら、自動で lint / test / typecheck が走って、落ちたら赤く知らせてくれる仕組みです🚦
(「自分のPCでは動いたのに…😇」を減らすやつ!)
1) まず“CIで回すコマンド”を1つにまとめる🧩✨
CIで複数コマンドを並べるより、ローカルと同じ“合格条件”を1コマンドにしておくのが超ラクです🙂👍
例:package.json に “CI用まとめコマンド” を作る(すでに第27章で作ってたらそのままでOK)🧠
{
"scripts": {
"lint": "eslint .",
"test": "vitest run",
"typecheck": "tsc -p tsconfig.json --noEmit",
"check": "npm run lint && npm run typecheck && npm run test"
}
}
ポイント💡
- CIは基本
npm ci(ロックファイル通りにクリーンインストール)で安定させるのが王道🧼 checkが通れば「最低限の品質ゲート突破🎉」が揃う
2) GitHub Actionsのワークフローを追加する📦⚙️
リポジトリにこのファイルを作ります👇
/.github/workflows/ci.yml
name: CI
on:
pull_request:
push:
branches: [ main ]
## まずは最小権限(読むだけ)🛡️
permissions:
contents: read
## 同じブランチで連打しても、古い実行を自動キャンセル🧹
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
jobs:
check:
runs-on: ubuntu-latest
steps:
- name: Checkout 🧾
uses: actions/checkout@v6
- name: Setup Node 🧰
uses: actions/setup-node@v6
with:
node-version: 24
cache: npm
- name: Install 📥
run: npm ci
- name: Check ✅
run: npm run check
これで、PRを作るだけで CI が動きます🎉
ubuntu-latestは現在 Ubuntu 24.04 が標準になっています🧊(CI環境の前提が揃いやすい)(GitHub)- Node は 24系が Active LTS なので、CIも 24 に揃えるのが安心です🔒(Node.js)
actions/checkout@v6は v6 系の最新版に追随する指定です🧷(v6 のリリースが出ています)(GitHub)actions/setup-nodeは npm/yarn/pnpm のキャッシュ機能を内蔵しています📦⚡(GitHub)
3) 速くするコツ:キャッシュは“迷わずON”⚡🧠
上の例だと cache: npm を入れてるので、依存インストールが速くなりやすいです🏎️💨(GitHub)
さらに補足💡
actions/setup-nodeはバージョンによって 自動キャッシュ挙動が変わることがあります(特にpackage.jsonのpackageManagerを使っている場合)🧷 もし変なハマり方をしたら、package-manager-cache: falseで一旦OFFにできます🧯(GitHub)
4) DBあり統合テストもCIで回したいとき🧱🧪(任意)
「DBコンテナ立てて統合テストもやりたい!」なら、ジョブを分けるのが分かりやすいです🙂✨ (ユニットテストは速い=毎回、統合テストは重い=必要なとき、にしやすい)
例:compose.test.yml を使って統合テストする(雰囲気サンプル)👇
integration:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 24
cache: npm
- run: npm ci
- name: Start deps (db etc.) 🐳
run: docker compose -f compose.test.yml up -d
- name: Run integration tests 🧪
run: npm run test:integration
- name: Shutdown 🧹
if: always()
run: docker compose -f compose.test.yml down -v
コツ💡
if: always()を付けると、落ちても後片付けが走ってログが見やすいです🧹✨- 統合テストは「1日1回/PRだけ」など、重さに合わせてトリガー設計してOK🙂
5) “落ちたらマージできない”を完成させる🔐🚧
ワークフローができたら、最後に ブランチ保護を入れると強いです💪 やることはシンプル👇
- リポジトリ設定 → Branch protection
Require status checksをONCI / check(やintegration)の成功を必須にする✅
これで「CIが赤いのにマージされる😇」が消えます🎉
ミニ課題🎒✨
- わざと
lintが落ちるコードを1行入れる(例:未使用変数)😈 - PRを作る
- CIが赤くなるのを確認
- 修正して緑に戻す✅🌿
→ この流れを一回体験すると「CI=味方」になります🙂🤝
よくある詰まりポイント集🧯😵💫
npm ciが失敗する →package-lock.jsonが無い/ズレてる可能性大。ローカルでnpm install→ lock をコミット🧩- ローカルはOKなのにCIで落ちる → Node バージョン差・OS差・環境変数差が多いです。まず CI の Node をローカルと揃える🔁
- キャッシュ周りで謎エラー → 一旦キャッシュOFF(または自動キャッシュOFF)で切り分けが最速🧯(GitHub)
AIで時短するプロンプト例🤖✨(そのままコピペOK)
例1:いまの scripts に合わせてCI作らせる🧠
package.json の scripts はこうです:
- lint: ...
- typecheck: ...
- test: ...
- check: ...
GitHub Actions の ci.yml を作って。
要件:
- PR と main への push で動く
- Node 24
- npm ci
- npm キャッシュ
- 失敗したら分かりやすい step 名
例2:統合テストも回す設計を相談する🧱
統合テストは DB が必要で docker compose で起動できます。
CIで「速いチェック」と「重い統合テスト」を分けたいです。
最小の構成案(yaml例つき)を提案して。
ちょい上級:CIの安全性を上げる🛡️🔒(興味あれば)
GITHUB_TOKENの権限は 最小権限が推奨です(まずcontents: read)🧰(GitHub Docs)- さらに厳密にするなら、ActionsをコミットSHA固定(サプライチェーン対策)も推奨されています🔐(The GitHub Blog)
次の章があるなら、流れ的におすすめは **「CIの結果を“見える化”(カバレッジ・テストレポート・失敗ログの読み方)📊👀」**か、 「リリース/デプロイの入口(ステージングだけ自動)🚀」 が気持ちよく繋がります🙂✨