---
title: CI
description: Lint・ビルドなどのチェックを PR ごとに自動で実行する CI（継続的インテグレーション）の運用ルール
---

CI（Continuous Integration）では、PR ごとに Lint やビルドを自動で実行し、問題のある変更がマージされるのを防ぎます。

## 実行する項目

### 必須項目

- **Lint**: プロジェクトで採用しているツールでコードを検査する（vite-starter は Biome と markuplint、astro-starter と wp-env-starter は Prettier・Stylelint・ESLint）
- **ビルド**: ビルドが正常に完了するかを確認する

### プロジェクトにある場合は必須

- **型チェック**: TypeScript を導入していて、`type-check` スクリプトがある場合
- **テスト**: `test` スクリプトがある場合

### 推奨項目

- **パフォーマンス計測**: Lighthouse CI など
- **依存関係の脆弱性チェック**: `pnpm audit` の実行。あわせて Dependabot を有効にする（[GitHub 権限・セキュリティ](/git/security#依存関係の脆弱性管理)を参照）

## 実行タイミング

- **PR の作成・更新時**: すべてのチェックを実行
- **`develop` / `main` へのマージ時**: すべてのチェックを実行

:::warning[CI が失敗した PR はマージしない]
ブランチ保護ルールで、CI の成功をマージの必須条件に設定してください（[ブランチ保護](/git/branch#ブランチ保護)を参照）。
:::

## ワークフロー例

```yaml .github/workflows/ci.yml
name: CI

on:
  pull_request:
    branches: [develop, main]
  push:
    branches: [develop, main]

jobs:
  check:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v7

      # setup-node の cache: pnpm より前に pnpm を用意する
      # バージョンは package.json の packageManager を参照する
      - uses: pnpm/action-setup@v6

      - uses: actions/setup-node@v7
        with:
          node-version-file: ".nvmrc"
          cache: "pnpm"

      - run: pnpm install --frozen-lockfile
      - run: pnpm run lint
      # スクリプトがないプロジェクトでは何もせずに成功する
      - run: pnpm run --if-present type-check
      - run: pnpm run --if-present test
      - run: pnpm run build
```

:::note
`.nvmrc` がない場合は `node-version: "24"` のように直接指定してください。
:::

:::warning[自動修正するスクリプトを CI で使わない]
`lint` スクリプトが `--write` などで自動修正する設定の場合、CI では問題が修正されたうえで成功扱いになり、検出できません。
CI では検出だけを行うコマンドを使ってください（例: Biome は `biome ci .`、markuplint は `markuplint "src/**/*.html"`）。
:::

## 実行時間の短縮

CI の実行時間が長いと、PR のレビューとマージが遅れます。次の方法を検討してください。

### キャッシュ

依存関係は `actions/setup-node` の `cache` オプションでキャッシュします（[ワークフロー例](#ワークフロー例)を参照）。
ロックファイルを自動で検出するため、追加の設定は不要です。

ビルド時間が長い場合は、`actions/cache` でビルドのキャッシュも保存します。

```yaml
- name: Cache build
  uses: actions/cache@v6
  with:
    path: |
      node_modules/.vite # Vite の場合
    key: ${{ runner.os }}-build-${{ hashFiles('pnpm-lock.yaml') }}
    restore-keys: |
      ${{ runner.os }}-build-
```

:::warning
`node_modules` そのものはキャッシュしないでください。
Node.js のバージョン違いなどで壊れた依存関係が復元される原因になります。
:::

### 並列実行

互いに依存しないチェックは、ジョブを分けて並列で実行します。

```yaml 並列実行の例
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      # ... Lint の実行

  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      # ... ビルドの実行
```

### 条件付き実行

ドキュメントだけの変更などで CI を省略したい場合は、`paths-ignore` で対象外のファイルを指定します。

```yaml
on:
  pull_request:
    branches: [develop, main]
    paths-ignore:
      - "**.md"
```

:::warning
CI の成功をマージの必須条件にしている場合、`paths-ignore` で CI が実行されなかった PR はマージできなくなります。
必須条件にしているブランチでは使わないでください。
:::
