GitHub Actionsチュートリアル:2026年CI/CDを自動化する

GitHub Actionsチュートリアル:2026年CI/CDを自動化する

GitHub Actionsのステップバイステップチュートリアル。Node.js、Pythonの実践例でテスト、ビルド、デプロイを自動化。

2026年3月17日4分で読了

CI/CDとは何か

CI/CDは現代のソフトウェア開発に欠かせない自動化の仕組みです。

  • CI(継続的インテグレーション): コードをプッシュするたびに自動でテストやビルドを実行
  • CD(継続的デリバリー/デプロイ): テストが通ったコードを自動で本番環境へデプロイ

手動でのテスト実行やデプロイ作業を自動化することで、バグの早期発見とリリースの高速化を実現します。

GitHub Actionsとは

GitHub Actionsは、GitHubが提供するCI/CDプラットフォームです。2019年のGA(一般提供)以来、GitHubリポジトリとのシームレスな統合により、世界中で広く使われています。

主要な特徴

  • GitHubと完全統合: Push、PR、リリースなどGitHubイベントをトリガーにできる
  • マーケットプレイス: 数千のアクションが公開されており、再利用可能
  • マトリックスビルド: 複数のOSや言語バージョンで並列テスト
  • 無料枠: パブリックリポジトリは無制限、プライベートは月2,000分まで無料

基本構造を理解する

GitHub Actionsのワークフローは .github/workflows/ ディレクトリにYAMLファイルとして保存します。

.github/
  workflows/
    ci.yml          # CIワークフロー
    deploy.yml      # デプロイワークフロー
    release.yml     # リリースワークフロー

基本的な用語

用語説明
Workflow自動化された処理の全体的な流れ
Eventワークフローを起動するトリガー(push, PR, scheduleなど)
Jobワークフロー内の処理単位(並列または順次実行)
Stepジョブ内の各ステップ(コマンドまたはアクション)
Action再利用可能な処理単位(マーケットプレイスで公開)
Runnerジョブが実行される仮想マシン

最初のワークフロー:Node.jsアプリ

# .github/workflows/ci.yml

name: CI Pipeline

# トリガーの設定
on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  # テストジョブ
  test:
    name: Test
    runs-on: ubuntu-latest

    # マトリックス:複数のNode.jsバージョンでテスト
    strategy:
      matrix:
        node-version: [20.x, 22.x]

    steps:
      # 1. コードをチェックアウト
      - name: Checkout code
        uses: actions/checkout@v4

      # 2. Node.jsのセットアップ
      - name: Setup Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'

      # 3. 依存関係のインストール
      - name: Install dependencies
        run: npm ci

      # 4. リントチェック
      - name: Run linter
        run: npm run lint

      # 5. テストの実行
      - name: Run tests
        run: npm test -- --coverage

      # 6. カバレッジレポートのアップロード(オプション)
      - name: Upload coverage
        uses: codecov/codecov-action@v4
        with:
          token: ${{ secrets.CODECOV_TOKEN }}

Pythonアプリのワークフロー

# .github/workflows/python-ci.yml

name: Python CI

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

jobs:
  test:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        python-version: ["3.11", "3.12", "3.13"]

    steps:
      - uses: actions/checkout@v4

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}

      # 依存関係のキャッシュ(ビルドを高速化)
      - name: Cache pip packages
        uses: actions/cache@v4
        with:
          path: ~/.cache/pip
          key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt') }}

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
          pip install -r requirements-dev.txt

      # コードフォーマットチェック
      - name: Check formatting with black
        run: black --check .

      # リントチェック
      - name: Lint with ruff
        run: ruff check .

      # 型チェック
      - name: Type check with mypy
        run: mypy .

      # テスト実行
      - name: Run tests with pytest
        run: pytest --cov=app --cov-report=xml

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

Secretsの使い方

APIキーや認証情報はコードに直接書かず、GitHub Secretsに保存します。

Secretsの登録方法

  1. GitHubリポジトリの SettingsSecrets and variablesActions を開く
  2. New repository secret をクリック
  3. 名前(例:DATABASE_URL)と値を入力

ワークフローでSecretsを使う

steps:
  - name: Deploy to production
    env:
      DATABASE_URL: ${{ secrets.DATABASE_URL }}
      API_KEY: ${{ secrets.API_KEY }}
      AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
      AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
    run: |
      echo "データベースに接続中..."
      ./scripts/deploy.sh

デプロイメントワークフロー

Vercelへの自動デプロイ(Next.jsアプリ)

# .github/workflows/deploy.yml

name: Deploy to Vercel

on:
  push:
    branches: [main]

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    needs: [test]  # testジョブが成功した後に実行

    steps:
      - uses: actions/checkout@v4

      - name: Deploy to Vercel
        uses: amondnet/vercel-action@v25
        with:
          vercel-token: ${{ secrets.VERCEL_TOKEN }}
          vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
          vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
          vercel-args: '--prod'

DockerイメージのビルドとECRへのプッシュ

name: Build and Push Docker Image

on:
  push:
    branches: [main]
    tags: ['v*']

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      # AWS認証
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-1

      # ECRにログイン
      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v2

      # Dockerイメージのビルドとプッシュ
      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: |
            ${{ steps.login-ecr.outputs.registry }}/my-app:latest
            ${{ steps.login-ecr.outputs.registry }}/my-app:${{ github.sha }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

実践的なテクニック

条件分岐でジョブを制御

jobs:
  deploy-staging:
    if: github.ref == 'refs/heads/develop'
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to staging
        run: echo "Stagingにデプロイ中..."

  deploy-production:
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to production
        run: echo "Productionにデプロイ中..."

再利用可能なワークフロー

# .github/workflows/reusable-test.yml
on:
  workflow_call:
    inputs:
      node-version:
        required: true
        type: string

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ inputs.node-version }}
      - run: npm ci && npm test
# 呼び出し側のワークフロー
jobs:
  run-tests:
    uses: ./.github/workflows/reusable-test.yml
    with:
      node-version: '22.x'

ワークフローのベストプラクティス

# 推奨事項をまとめたサンプル

name: Best Practice CI

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

# 同じブランチへの複数プッシュ時に古い実行をキャンセル
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  ci:
    runs-on: ubuntu-latest

    # タイムアウトの設定(無限ループ防止)
    timeout-minutes: 15

    permissions:
      contents: read
      pull-requests: write

    steps:
      - uses: actions/checkout@v4

      # アクションはバージョンを固定する(セキュリティ)
      - uses: actions/setup-node@v4
        with:
          node-version: '22'
          cache: 'npm'

      - run: npm ci

      # 並列でテストを実行
      - run: npm run lint & npm run typecheck & wait

      - run: npm test

まとめ:GitHub Actionsを今日から始めよう

GitHub Actionsを導入することで得られるメリットは計り知れません:

  1. バグの早期発見: すべてのPRで自動テストが実行される
  2. リリースの高速化: 手動デプロイ作業がゼロになる
  3. 品質の担保: コードスタイルや型チェックが自動化される
  4. チームの安心感: 自動テストが通ったコードのみがマージされる

最初は簡単なテスト自動化から始めて、徐々にデプロイパイプラインへと拡張していきましょう。GitHubマーケットプレイスには数千のアクションが公開されており、ほとんどのユースケースに対応できます。

関連記事