本番デプロイ
作成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 }}
ビルドとデプロイを分離する理由
ビルドとデプロイを別ジョブに分けることが推奨される理由:
- 成果物の確認: 必要に応じてビルド出力をダウンロードして検査できる
- デプロイの再試行: デプロイが失敗した場合(ネットワーク障害など)、デプロイジョブのみ再実行できる
- ビルドとデプロイの間でテスト: ビルドとデプロイの間にテストジョブ(e2e、Lighthouse など)を挟める