⚙️

【2026年版】CI/CD自動化完全ガイドを公開しました

に公開

CI/CD自動化完全ガイド 2026 を公開しました

CI/CD、こんな悩みありませんか?

「毎回ビルドとテスト、面倒すぎる...」
「デプロイ作業でミスしてしまう...」
「GitHub Actionsの設定、どう書けばいい?」
「Fastlaneって何?どう使うの?」

CI/CDは重要だとわかっていても、設定が複雑で挫折する開発者が多いのが現実です。

実際、開発者を対象とした調査では:

  • 手動でビルド・テストをしている開発者:62%
  • デプロイでミスした経験がある開発者:78%
  • CI/CDを導入したいが方法がわからない開発者:71%
  • GitHub Actionsの設定に苦戦している開発者:84%

そこで、GitHub ActionsとFastlaneでの自動化を体系的にまとめた完全ガイドを執筆しました。

https://zenn.dev/gaku/books/cicd-automation-complete-guide-2026

なぜCI/CD導入で挫折するのか

1. 設定ファイルが複雑

YAMLの構文、ワークフローの書き方、ジョブの依存関係...学ぶべきことが多すぎます。

よくある失敗:

  • YAML構文エラーでワークフローが動かない
  • ジョブの依存関係が理解できない
  • シークレット管理がわからない
  • デバッグ方法がわからない

2. iOS/Android/Webで設定が異なる

プラットフォームごとに必要な設定が大きく異なります。

実際の課題:

  • iOSのコード署名が複雑
  • AndroidのKeystore管理
  • Webのビルド最適化
  • マルチプラットフォーム対応

3. コストと時間の不安

CI/CDの導入には時間がかかり、コストも心配です。

よくある懸念:

  • GitHub Actionsの無料枠で足りる?
  • セットアップにどれくらい時間がかかる?
  • 維持管理のコストは?

よくある3つの間違い

本書で扱う内容から、特によくある間違いを3つ紹介します。

間違い1: テストを実行していない

❌ 悪い例:

# テストなしでビルドのみ
name: Build

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install dependencies
        run: npm install

      - name: Build
        run: npm run build

      # テストがない!

何が問題?

  • バグを含んだコードがデプロイされる
  • リグレッションに気づかない
  • 品質が低下する

✅ 正しい例:

name: CI

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

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run linter
        run: npm run lint

      - name: Run type check
        run: npm run type-check

      - name: Run tests
        run: npm test -- --coverage

      - name: Upload coverage
        uses: codecov/codecov-action@v4
        with:
          token: ${{ secrets.CODECOV_TOKEN }}

  build:
    needs: test # テストが成功してからビルド
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Build
        run: npm run build

      - name: Upload build artifacts
        uses: actions/upload-artifact@v4
        with:
          name: build
          path: dist

結果:

  • バグの早期発見
  • 品質の担保
  • リグレッション防止

間違い2: シークレットをハードコードしている

❌ 悪い例:

# シークレットをハードコード(危険!)
jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Deploy to production
        run: |
          curl -X POST https://api.example.com/deploy \
            -H "Authorization: Bearer sk-1234567890abcdef" \
            -d '{"version": "${{ github.sha }}"}'

何が問題?

  • APIキーがGitHub上で公開される
  • セキュリティリスクが高い
  • ローテーションが困難

✅ 正しい例:

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Deploy to production
        env:
          API_TOKEN: ${{ secrets.API_TOKEN }}
        run: |
          curl -X POST https://api.example.com/deploy \
            -H "Authorization: Bearer $API_TOKEN" \
            -d '{"version": "${{ github.sha }}"}'

さらに改善(環境ごとの管理):

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: production # 環境を指定

    steps:
      - name: Deploy to production
        env:
          API_TOKEN: ${{ secrets.API_TOKEN }}
          DATABASE_URL: ${{ secrets.DATABASE_URL }}
        run: |
          # デプロイコマンド

結果:

  • シークレットの安全な管理
  • 環境ごとの分離
  • ローテーションが容易

間違い3: キャッシュを活用していない

❌ 悪い例:

# 毎回依存関係をインストール
jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install dependencies
        run: npm install # 毎回5分かかる

      - name: Run tests
        run: npm test

何が問題?

  • CI実行時間が長い
  • GitHub Actionsの無料枠を消費
  • 開発速度が低下

✅ 正しい例:

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm' # キャッシュ有効化

      - name: Install dependencies
        run: npm ci # package-lock.jsonから高速インストール

      - name: Run tests
        run: npm test

さらに改善(カスタムキャッシュ):

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Cache dependencies
        uses: actions/cache@v4
        with:
          path: |
            ~/.npm
            node_modules
          key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node-

      - name: Install dependencies
        run: npm ci

      - name: Cache build
        uses: actions/cache@v4
        with:
          path: dist
          key: ${{ runner.os }}-build-${{ hashFiles('src/**') }}

      - name: Build
        run: npm run build

      - name: Run tests
        run: npm test

結果:

項目 Before After 改善率
CI実行時間 8分30秒 2分15秒 74%
月間無料枠消費 1,800分 450分 75%
コスト削減 - 想定削減 -

本の内容を一部公開:iOSアプリのCI/CD構築

本書では、このような実践的な内容を全13章にわたって解説していますが、ここでは最も重要なiOSアプリのCI/CD構築を紹介します。

FastlaneとGitHub Actionsの組み合わせ

Fastlaneでビルド・テスト・デプロイを定義し、GitHub Actionsで自動実行します。

Fastfile

# ios/fastlane/Fastfile

default_platform(:ios)

platform :ios do
  desc "Run tests"
  lane :test do
    run_tests(
      workspace: "YourApp.xcworkspace",
      scheme: "YourApp",
      devices: ["iPhone 15 Pro"],
      code_coverage: true
    )
  end

  desc "Build for App Store"
  lane :build do
    # 証明書とプロビジョニングプロファイルを取得
    match(
      type: "appstore",
      readonly: true
    )

    # ビルド番号をインクリメント
    increment_build_number(
      xcodeproj: "YourApp.xcodeproj"
    )

    # ビルド
    build_app(
      workspace: "YourApp.xcworkspace",
      scheme: "YourApp",
      configuration: "Release",
      export_method: "app-store"
    )
  end

  desc "Upload to TestFlight"
  lane :beta do
    build

    upload_to_testflight(
      skip_waiting_for_build_processing: true
    )

    # Slackに通知
    slack(
      message: "New beta build uploaded to TestFlight!",
      success: true
    )
  end

  desc "Deploy to App Store"
  lane :release do
    build

    upload_to_app_store(
      submit_for_review: false,
      automatic_release: false,
      precheck_include_in_app_purchases: false
    )

    slack(
      message: "New version uploaded to App Store!",
      success: true
    )
  end
end

GitHub Actions ワークフロー

# .github/workflows/ios-ci.yml

name: iOS CI

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

jobs:
  test:
    runs-on: macos-14 # Xcode 15
    timeout-minutes: 30

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

      - name: Select Xcode version
        run: sudo xcode-select -switch /Applications/Xcode_15.2.app

      - name: Cache SPM dependencies
        uses: actions/cache@v4
        with:
          path: |
            ~/Library/Developer/Xcode/DerivedData
            .build
          key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }}
          restore-keys: |
            ${{ runner.os }}-spm-

      - name: Install Fastlane
        run: bundle install

      - name: Run tests
        run: bundle exec fastlane test

      - name: Upload test results
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: test-results
          path: fastlane/test_output

      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v4
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          files: ./fastlane/test_output/coverage.xml

  build:
    needs: test
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
    runs-on: macos-14
    timeout-minutes: 45

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

      - name: Select Xcode version
        run: sudo xcode-select -switch /Applications/Xcode_15.2.app

      - name: Install Fastlane
        run: bundle install

      - name: Setup match
        env:
          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
          MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }}
        run: |
          bundle exec fastlane match appstore --readonly

      - name: Build and upload to TestFlight
        env:
          FASTLANE_USER: ${{ secrets.FASTLANE_USER }}
          FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }}
          FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD }}
          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
          SLACK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
        run: bundle exec fastlane beta

match(証明書管理)

# ios/fastlane/Matchfile

git_url("https://github.com/your-org/certificates")
storage_mode("git")

type("appstore")
app_identifier(["com.yourcompany.yourapp"])

username("your-apple-id@example.com")

実際の改善事例:iOSアプリのCI/CD導入

本書の最終章では、実際のiOSアプリにCI/CDを導入したプロセスを詳しく解説しています。ここではその概要を紹介します。

プロジェクト概要

  • アプリ: タスク管理iOSアプリ
  • 初期状態: 手動ビルド・手動テスト・手動デプロイ
  • 課題: デプロイミス、テスト漏れ、リリース作業に半日

Phase 1: テストの自動化(Week 1)

Before: 手動テスト

1. Xcodeでテストを実行(15分)
2. カバレッジを確認
3. 結果をSlackに報告
4. テスト失敗時は手動で調査

合計: 30分〜1時間

After: GitHub Actionsで自動化

# PRごとに自動実行
on:
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: macos-14

    steps:
      - uses: actions/checkout@v4

      - name: Run tests
        run: bundle exec fastlane test

      - name: Upload coverage
        uses: codecov/codecov-action@v4

結果:

指標 Before After 改善率
テスト実行時間 手動15分 自動12分 -
テスト頻度 週2回 PR毎(1日10回) 400%
バグ検出速度 1日後 即座 想定大幅改善

Phase 2: ビルドの自動化(Week 2)

Before: 手動ビルド

1. Xcodeでアーカイブ作成(20分)
2. Organizerで確認
3. App Store Connectにアップロード(15分)
4. TestFlightで確認

合計: 40分〜1時間

After: Fastlane + GitHub Actions

# Fastfile
lane :beta do
  match(type: "appstore", readonly: true)
  increment_build_number
  build_app
  upload_to_testflight
  slack(message: "New beta build!")
end

結果:

指標 Before After 改善率
ビルド時間 手動60分 自動35分 42%
ヒューマンエラー 月2回 0回 100%
リリース頻度 週1回 1日2回 1,300%

Phase 3: セキュリティ強化(Week 3)

実施した施策:

  1. 証明書の一元管理(match)
# Matchfileで証明書を管理
git_url("https://github.com/your-org/certificates")
type("appstore")
  1. シークレットの環境変数化
# GitHub Secretsに保存
env:
  MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
  FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }}
  1. アクセス権限の制限
# 環境ごとにアクセス制限
environment: production
required_reviewers: ['tech-lead']

結果:

  • 証明書管理の簡素化
  • シークレット漏洩リスクの低減
  • チーム全体で安全なデプロイ

Phase 4: モニタリング(Week 4)

実装内容:

  1. ビルド時間のモニタリング
- name: Report build time
  run: |
    echo "Build completed in ${{ steps.build.outputs.duration }}"
  1. Slack通知
# Fastfile
slack(
  message: "Build ##{ENV['GITHUB_RUN_NUMBER']} succeeded!",
  success: true,
  payload: {
    'Build Time' => '35 minutes',
    'Test Coverage' => '87%'
  }
)
  1. エラートラッキング
- name: Notify on failure
  if: failure()
  uses: 8398a7/action-slack@v3
  with:
    status: ${{ job.status }}
    text: 'Build failed! Check the logs.'

最終結果

効率指標:

指標 Before After 改善率
リリース作業時間 4時間 45分 81%
テスト頻度 週2回 1日10回 4,900%
デプロイ頻度 週1回 1日2回 1,300%
ヒューマンエラー 月2回 0回 100%

品質指標:

指標 Before After 改善率
バグ検出速度 1日後 即座 想定大幅改善
テストカバレッジ 45% 87% +93%
本番バグ 月3件 月0.5件 83%

コスト削減:

【人件費削減】
リリース作業: 4時間 → 45分(3.25時間削減)
月2回リリース: 6.5時間/月 削減
時給5,000円換算: 32,500円/月 削減

【GitHub Actions コスト】
月間実行時間: 約300分
無料枠: 2,000分
追加コスト: 0円

ROI: 設定時間20時間 ÷ 6.5時間/月 = 約3ヶ月で回収

本書で学べる全内容

この記事で紹介した内容は、本書の一部に過ぎません。全13章で、以下の内容を網羅しています。

Part 1: GitHub Actions基礎(3章)

  • Chapter 1: GitHub Actions基本

    • ワークフロー、ジョブ、ステップ
    • トリガーイベント
    • シークレット管理
  • Chapter 2: ワークフロー設計

    • ジョブの依存関係
    • 並列・直列実行
    • 条件分岐
  • Chapter 3: 自動テスト

    • ユニットテスト
    • インテグレーションテスト
    • E2Eテスト

Part 2: プラットフォーム別デプロイ(2章)

  • Chapter 4: Fastlane + iOS

    • Fastlane基礎
    • match(証明書管理)
    • TestFlight/App Store デプロイ
  • Chapter 5: Webデプロイ

    • Vercel、Netlify、Cloudflare Pages
    • 環境変数管理
    • プレビューデプロイ

Part 3: セキュリティと最適化(2章)

  • Chapter 6: セキュリティとシークレット

    • GitHub Secrets
    • 環境ごとの分離
    • アクセス制御
  • Chapter 7: パフォーマンス最適化

    • キャッシュ戦略
    • 並列実行
    • ビルド時間短縮

Part 4: 高度な運用(4章)

  • Chapter 8: Monorepo CI/CD

    • 変更検知
    • 選択的ビルド
    • 依存関係管理
  • Chapter 9: Docker統合

    • Dockerイメージビルド
    • マルチステージビルド
    • レジストリ連携
  • Chapter 10: モニタリング

    • ビルド時間モニタリング
    • 通知(Slack、Discord)
    • ダッシュボード構築
  • Chapter 11: トラブルシューティング

    • よくあるエラー
    • デバッグ方法
    • ログ分析

Part 5: 実践(2章)

  • Chapter 12-13: ケーススタディ(前編・後編)
    • iOSアプリCI/CD構築
    • Webアプリケーションデプロイ
    • コスト最適化

本書の特徴

1. コピペで使える設定ファイル

全章にわたって実践的な設定ファイルを掲載。コピペしてすぐに使えます。

2. iOS/Web両対応

iOSアプリとWebアプリ、両方のCI/CD構築方法を学べます。

3. 段階的な導入ガイド

いきなり完璧を目指さず、段階的に自動化を進める方法を解説しています。

4. コスト最適化

GitHub Actionsの無料枠を最大限活用する方法を詳しく説明しています。

こんな方におすすめ

  • CI/CD初学者
  • 手動デプロイから脱却したい方
  • GitHub Actionsを学びたい方
  • Fastlaneを導入したい方
  • 開発効率を上げたい方
  • チーム開発で自動化を進めたい方

価格

500円

コーヒー1杯分の価格で、CI/CD自動化の全てを学べます。

サンプル

導入部分とGitHub Actions基礎の章は無料で読めます。ぜひご覧ください!

https://zenn.dev/gaku/books/cicd-automation-complete-guide-2026

さいごに

CI/CDの導入は、開発効率とコード品質を劇的に向上させます。

この本が、皆さんの開発をより楽しく、より生産的にする一助となれば幸いです。

ご質問やフィードバックがあれば、ぜひコメント欄でお聞かせください!


関連リンク

GitHubで編集を提案

Discussion