zudo-cloudflare-wisdom

Type to search...

to open search from anywhere

本番デプロイ

作成2026年4月4日Takeshi Takatsudo

main ブランチデプロイ用の GitHub Actions ワークフロー

標準ワークフロー

本番デプロイワークフローは main への push でトリガーされます:

name: Production Deploy

on:
  push:
    branches:
      - main

concurrency:
  group: production-deploy
  cancel-in-progress: false

permissions:
  contents: read

⚠️ 進行中のデプロイをキャンセルしない

本番デプロイでは cancel-in-progress: false を設定してください。短時間に2回 push された場合、最初のデプロイを途中でキャンセルせず、順番に両方を完了させたいためです。

ビルドジョブ

jobs:
  build-site:
    name: Build Site
    runs-on: ubuntu-latest
    timeout-minutes: 15

    steps:
      - name: Checkout repository
        uses: actions/checkout@v5
        with:
          fetch-depth: 0

      - name: Setup pnpm
        uses: pnpm/action-setup@v4

      - name: Setup Node.js
        uses: actions/setup-node@v5
        with:
          node-version: 22

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

      - name: Build site
        run: pnpm build

      - name: Upload build artifact
        uses: actions/upload-artifact@v7
        with:
          name: dist-out
          path: dist/
          retention-days: 1

💡 fetch-depth: 0

ビルドに git 履歴が必要な場合(例: ドキュメントのメタ情報で作成日/更新日を表示する場合)は fetch-depth: 0 を使用してください。

デプロイジョブ

  deploy:
    name: Deploy to Cloudflare Pages
    needs: [build-site]
    runs-on: ubuntu-latest
    timeout-minutes: 10

    steps:
      - name: Download site artifact
        uses: actions/download-artifact@v7
        with:
          name: dist-out
          path: dist-out/

      - name: Prepare deploy directory
        run: |
          mkdir -p deploy/pj/my-site
          if [ -d dist-out/client ]; then
            cp -r dist-out/client/. deploy/pj/my-site/
          else
            cp -r dist-out/. deploy/pj/my-site/
          fi
          echo '/ /pj/my-site/ 302' > deploy/_redirects

      - name: Deploy to Cloudflare Pages (production)
        run: |
          npx wrangler@4 pages deploy deploy \
            --project-name=my-site \
            --branch=main \
            --commit-hash="${GITHUB_SHA}" \
            --commit-message="Production deploy: ${GITHUB_SHA}"
        env:
          CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}

ビルドとデプロイを分離する理由

ビルドとデプロイを別ジョブに分けることが推奨される理由:

  1. 成果物の確認: 必要に応じてビルド出力をダウンロードして検査できる
  2. デプロイの再試行: デプロイが失敗した場合(ネットワーク障害など)、デプロイジョブのみ再実行できる
  3. ビルドとデプロイの間でテスト: ビルドとデプロイの間にテストジョブ(e2e、Lighthouse など)を挟める