JA Deployment CI CD - fumihumi/phantom GitHub Wiki

CI/CDパイプライン

English | 日本語

このドキュメントでは、GitHub Actionsを使用したPhantomの継続的インテグレーションとデプロイメントのセットアップについて説明します。

概要

PhantomはGitHub Actionsを以下に使用します:

  • すべてのプッシュでの自動テスト
  • プルリクエストの検証
  • npmパッケージのリリース
  • クロスプラットフォーム互換性テスト

GitHub Actionsワークフロー

ソース: .github/workflows/(標準的なプラクティスから推測)

ワークフロー構造

name: CI

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

jobs:
  test:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        node: [22, 24]

CIパイプラインステージ

1. 環境セットアップ

steps:
  - name: Checkout code
    uses: actions/checkout@v4

  - name: Setup Node.js
    uses: actions/setup-node@v4
    with:
      node-version: ${{ matrix.node }}

  - name: Setup pnpm
    uses: pnpm/action-setup@v2
    with:
      version: 10.8.1

2. 依存関係のインストール

  - name: Get pnpm store directory
    id: pnpm-cache
    shell: bash
    run: |
      echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT

  - name: Setup pnpm cache
    uses: actions/cache@v3
    with:
      path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
      key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
      restore-keys: |
        ${{ runner.os }}-pnpm-store-

  - name: Install dependencies
    run: pnpm install --frozen-lockfile

3. 品質チェック

  - name: Run linter
    run: pnpm lint

  - name: Run type check
    run: pnpm typecheck

  - name: Run tests
    run: pnpm test

4. ビルド検証

  - name: Build project
    run: pnpm build

  - name: Verify build output
    run: |
      test -f dist/phantom.js
      ./dist/phantom.js --version

テストマトリックス

オペレーティングシステム

プラットフォーム間でのテストにより互換性を確保:

OS バージョン 目的
Ubuntu latest Linux互換性
macOS latest 開発者マシン
Windows latest クロスプラットフォームサポート

Node.jsバージョン

ソース: package.json#L36

バージョン ステータス 備考
22.x 必須 最小サポート
24.x 最新 将来の互換性

プルリクエストチェック

必須チェック

すべてのPRは以下を合格する必要があります:

  1. リンティング - コードスタイルの遵守
  2. 型チェック - TypeScriptの検証
  3. ユニットテスト - すべてのテストが合格
  4. ビルド - 成功したコンパイル
  5. 全プラットフォーム - Linux/macOS/Windowsで動作

PRワークフロー

name: PR Validation

on:
  pull_request:
    types: [opened, synchronize, reopened]

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Check commit messages
        uses: wagoid/commitlint-github-action@v5
        
      - name: Run all checks
        run: pnpm ready

リリースプロセス

バージョン管理

npmバージョンコマンドを使用:

# パッチリリース (0.0.x)
npm version patch

# マイナーリリース (0.x.0)
npm version minor

# メジャーリリース (x.0.0)
npm version major

リリースワークフロー

name: Release

on:
  push:
    tags:
      - 'v*'

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 22
          registry-url: 'https://registry.npmjs.org'
      
      - name: Install dependencies
        run: pnpm install --frozen-lockfile
      
      - name: Build
        run: pnpm build
      
      - name: Publish to npm
        run: npm publish
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

GitHubリリースの作成

      - name: Create GitHub Release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref }}
          release_name: Release ${{ github.ref }}
          body: |
            詳細は[CHANGELOG.md]を参照してください
          draft: false
          prerelease: false

npm公開

公開設定

ソース: package.json#L7-L8

{
  "name": "@aku11i/phantom",
  "publishConfig": {
    "access": "public",
    "registry": "https://registry.npmjs.org"
  }
}

公開前スクリプト

ソース: package.json#L20

{
  "scripts": {
    "prepublishOnly": "pnpm run build"
  }
}

これにより以下が保証されます:

  • 公開前に常にビルド
  • 公開されたパッケージには最新の変更が含まれる
  • 手動のビルドステップが不要

含まれるファイル

ソース: package.json#L51-L56

{
  "files": [
    "dist",
    "README.md",
    "LICENSE"
  ]
}

必要なファイルのみが公開されます:

  • dist/ - ビルドされた実行可能ファイル
  • README.md - ドキュメント
  • LICENSE - 法的要件

セキュリティ

シークレット管理

GitHubで必要なシークレット:

シークレット 目的 セットアップ
NPM_TOKEN npm公開 npmアクセストークン
GITHUB_TOKEN GitHubリリース 自動

依存関係のセキュリティ

  - name: Audit dependencies
    run: pnpm audit

  - name: Check for known vulnerabilities
    uses: actions/dependency-review-action@v3

監視と通知

ビルドステータスバッジ

![CI](https://github.com/aku11i/phantom/workflows/CI/badge.svg)

失敗通知

GitHub Actionsは自動的に:

  • 失敗時にメール送信
  • PRにステータスを表示
  • コミットステータスを更新

パフォーマンス最適化

キャッシング戦略

  1. pnpmストアキャッシュ

    • ダウンロードされたパッケージをキャッシュ
    • ロックファイルのハッシュでキー設定
    • インストールを高速化
  2. ビルドキャッシュ

    - name: Cache build outputs
      uses: actions/cache@v3
      with:
        path: dist
        key: build-${{ hashFiles('src/**') }}
    

並列実行

テストは以下で並列実行されます:

  • 複数のOSバージョン
  • 複数のNodeバージョン
  • 合計マトリックス: 6ジョブ

ローカルCIシミュレーション

CIをローカルで実行

CI環境をシミュレート:

# すべてのCIチェックを実行
pnpm ready

# 異なるNodeバージョンをシミュレート
nvm use 22 && pnpm test
nvm use 24 && pnpm test

# 異なるプラットフォームでテスト
# OSテストにはDockerまたはVMを使用

ローカルGitHub Actions用のact

# actをインストール
brew install act  # macOS
# またはhttps://github.com/nektos/actからダウンロード

# ワークフローをローカルで実行
act push
act pull_request

CI失敗のデバッグ

よくある問題

  1. プラットフォーム固有の失敗

    - name: Debug info
      run: |
        echo "OS: ${{ runner.os }}"
        echo "Node: $(node --version)"
        echo "pnpm: $(pnpm --version)"
    
  2. テストのタイムアウト

    - name: Run tests with timeout
      run: pnpm test
      timeout-minutes: 10
    
  3. ビルドの失敗

    - name: Upload build artifacts
      if: failure()
      uses: actions/upload-artifact@v3
      with:
        name: build-logs
        path: |
          dist/
          *.log
    

SSHデバッグ

インタラクティブデバッグ用:

- name: Setup tmate session
  if: ${{ failure() }}
  uses: mxschmitt/action-tmate@v3
  timeout-minutes: 15

ベストプラクティス

1. 高速フィードバック

  • 最初にクイックチェックを実行(lint、types)
  • エラーで早期失敗
  • 並列テスト実行

2. 再現可能なビルド

  • 依存関係のロックファイル
  • 特定のツールバージョン
  • 各実行でクリーンな環境

3. 包括的なテスト

  • 複数のOSプラットフォーム
  • 複数のNodeバージョン
  • 実世界のシナリオ

4. セキュリティファースト

  • 最小限の権限
  • 安全なシークレット
  • 定期的な依存関係の更新

将来の拡張

計画された改善

  1. パフォーマンステスト

    - name: Benchmark
      run: |
        time ./dist/phantom.js create test
        time ./dist/phantom.js list
    
  2. カバレッジレポート

    - name: Upload coverage
      uses: codecov/codecov-action@v3
      with:
        file: ./coverage.lcov
    
  3. リリース自動化

    • 自動バージョンバンプ
    • 変更ログ生成
    • コミットからのリリースノート

高度なワークフロー

  1. ナイトリービルド

    on:
      schedule:
        - cron: '0 0 * * *'
    
  2. 依存関係の更新

    - uses: dependabot/dependabot-core@v1
      with:
        package-manager: "npm"
    

まとめ

PhantomのCI/CDパイプラインは以下を保証します:

  1. 品質 - すべてのコードが基準を満たす
  2. 互換性 - プラットフォーム間で動作
  3. 信頼性 - 自動テストが問題を検出
  4. セキュリティ - 依存関係が安全
  5. 効率性 - 高速なフィードバックとリリース

自動化されたパイプラインにより、高い品質基準を維持しながら、自信を持って迅速な開発が可能になります。