GitHub Actions マルチ環境デプロイメント実践ガイド:Dev/Staging/Prod 完全自動化¶
この記事の対象者
- CI/CDの基本を理解している中級開発者(GitHub Actions使用経験がある方)
この記事のポイント¶
- Dev→Staging→Prodの段階的デプロイワークフローを自動化できる
- 環境別シークレット管理と承認プロセスを設定できる
- デプロイ失敗時の自動ロールバック機能を実装できる
なぜこの問題が今重要か¶
現代のアプリケーション開発では、複数環境での品質担保が必須です。手動デプロイによる人的ミスやデプロイ時間の増大、環境間の設定差異によるトラブルが頻発しています。GitHub Actionsの活用により、これらの課題を根本的に解決できます。
解決ステップ概要¶
| ステップ | 内容 | 到達指標 |
|---|---|---|
| 1 | 環境設定とシークレット管理 | 3環境のシークレット設定完了 |
| 2 | 段階的デプロイワークフロー作成 | 自動デプロイ実行成功 |
| 3 | 承認とロールバック設定 | 手動承認+自動復旧機能動作確認 |
ステップ1: 環境設定とシークレット管理¶
リポジトリのEnvironmentsでdev、staging、productionを設定し、各環境専用のシークレットを登録します。
# .github/workflows/multi-env-deploy.yml
name: Multi-Environment Deployment
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
deploy-dev:
if: github.ref == 'refs/heads/develop'
runs-on: ubuntu-latest
environment: dev
steps:
- uses: actions/checkout@v4
- name: Deploy to Dev
run: |
echo "Deploying to Dev environment"
echo "${{ secrets.DEV_API_KEY }}" | head -c 8
ステップ2: 段階的デプロイワークフロー作成¶
main ブランチへのプッシュ時にstaging → production の順序でデプロイを実行する設定を追加します。
deploy-staging:
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
environment: staging
steps:
- uses: actions/checkout@v4
- name: Run Tests
run: npm test
- name: Deploy to Staging
run: |
echo "Deploying to Staging"
# 実際のデプロイコマンド
deploy-production:
needs: deploy-staging
runs-on: ubuntu-latest
environment: production
steps:
- uses: actions/checkout@v4
- name: Deploy to Production
run: echo "Production deployment complete"
ステップ3: 承認とロールバック設定¶
ProductionとStagingにProtection Rules設定で手動承認を必須にし、デプロイ後のヘルスチェックを実装します。
health-check:
needs: deploy-production
runs-on: ubuntu-latest
steps:
- name: Health Check
run: |
curl -f ${{ secrets.PROD_URL }}/health || exit 1
- name: Rollback on Failure
if: failure()
run: |
echo "Health check failed, initiating rollback"
# 前バージョンへの自動復旧処理
よくある落とし穴と対処¶
| 症状 | 原因 | 即時対処 |
|---|---|---|
| シークレット取得エラー | Environment未設定 | Settings > Environments で環境作成 |
| 無限待機状態 | Required reviewers未設定 | Protection rules でレビュアー指定 |
| デプロイ先接続失敗 | ネットワーク設定不備 | VPN設定またはIP制限確認 |
詳細設定(高度最適化)
### 条件分岐デプロイdeploy-feature:
if: startsWith(github.ref, 'refs/heads/feature/')
environment: dev
runs-on: ubuntu-latest
steps:
- name: Feature Branch Deploy
run: echo "Feature環境デプロイ"
env:
NODE_ENV: ${{ github.event.repository.environment == 'production' && 'production' || 'staging' }}
API_URL: ${{ secrets.API_URL }}
- name: Notify Slack
uses: 8398a7/action-slack@v3
with:
status: ${{ job.status }}
text: 'Deployment to ${{ github.event.repository.environment }} completed'
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}