rollback-workflow-builder について
本番デプロイのロールバック手順を設計するスキルです。手動または障害発生時の復旧計画が必要なチーム向けに、デプロイ、Kubernetes、Docker イメージ、データベース移行の例と、検証・連絡のガイドを扱います。
主な機能
- 01手動ロールバックワークフローの作成
- 02障害時の自動ロールバック計画
- 03Kubernetes と Docker のロールバック
- 04データベース移行のロールバック記録
- 05ヘルスチェックとランブックの追加
活用シーン
- 01本番環境の手動ロールバック準備
- 02障害後の以前のデプロイへの復旧
- 03データベース移行のロールバック計画
- 04ロールバック後のサービス健全性確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ patricio0312rev/ skills --skill rollback-workflow-builderインストール後、Claude Code で/rollback-workflow-builderを入力して読み込まれたか確認します。
詳細
ロールバックワークフロービルダー
本番環境へのデプロイに向けて、安全かつ迅速なロールバックの仕組みを構築します。
手動ロールバックワークフロー
# .github/workflows/rollback.yml
name: Rollback
on:
workflow_dispatch:
inputs:
version:
description: "Version to rollback to (e.g., v1.2.3 or previous)"
required: true
type: string
environment:
description: "Environment to rollback"
required: true
type: choice
options:
- staging
- production
reason:
description: "Reason for rollback"
required: true
type: string
jobs:
rollback:
runs-on: ubuntu-latest
environment: ${{ github.event.inputs.environment }}
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.version }}
- name: Verify version exists
run: |
if ! git rev-parse ${{ github.event.inputs.version }} >/dev/null 2>&1; then
echo "❌ Version ${{ github.event.inputs.version }} not found"
exit 1
fi
echo "✅ Version ${{ github.event.inputs.version }} exists"
- name: Get current version
id: current
run: |
CURRENT=$(git describe --tags --abbrev=0)
echo "version=$CURRENT" >> $GITHUB_OUTPUT
echo "Current version: $CURRENT"
- name: Confirm rollback
run: |
echo "🔄 Rolling back from ${{ steps.current.outputs.version }} to ${{ github.event.inputs.version }}"
echo "Environment: ${{ github.event.inputs.environment }}"
echo "Reason: ${{ github.event.inputs.reason }}"
- uses: actions/setup-node@v4
with:
node-version: "20"
- run: npm ci
- run: npm run build
- name: Deploy rollback
run: |
./scripts/deploy.sh ${{ github.event.inputs.environment }}
env:
DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
- name: Verify deployment
run: |
./scripts/health-check.sh ${{ github.event.inputs.environment }}
- name: Create incident issue
uses: actions/github-script@v7
with:
script: |
github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: `Rollback: ${context.payload.inputs.environment} to ${context.payload.inputs.version}`,
body: `## Rollback Details
**Environment:** ${context.payload.inputs.environment}
**From:** ${{ steps.current.outputs.version }}
**To:** ${context.payload.inputs.version}
**Reason:** ${context.payload.inputs.reason}
**Triggered by:** @${context.actor}
**Time:** ${new Date().toISOString()}
## Next Steps
- [ ] Verify rollback successful
- [ ] Investigate root cause
- [ ] Create fix
- [ ] Update postmortem
`,
labels: ['incident', 'rollback']
})
障害発生時の自動ロールバック
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy
id: deploy
run: ./scripts/deploy.sh production
continue-on-error: true
- name: Verify deployment
id: verify
if: steps.deploy.outcome == 'success'
run: ./scripts/health-check.sh production
continue-on-error: true
- name: Auto-rollback on failure
if: steps.deploy.outcome == 'failure' || steps.verify.outcome == 'failure'
run: |
echo "⚠️ Deployment failed, initiating automatic rollback"
PREVIOUS_VERSION=$(git describe --tags --abbrev=0 HEAD^)
./scripts/deploy.sh production $PREVIOUS_VERSION
# Verify rollback
if ./scripts/health-check.sh production; then
echo "✅ Rollback successful"
else
echo "❌ Rollback failed - manual intervention required"
exit 1
fi
Kubernetes のロールバック
rollback-k8s:
runs-on: ubuntu-latest
steps:
- name: Setup kubectl
uses: azure/setup-kubectl@v3
- name: Configure kubectl
run: |
echo "${{ secrets.KUBECONFIG }}" > kubeconfig
export KUBECONFIG=kubeconfig
- name: Rollback deployment
run: |
kubectl rollout undo deployment/myapp -n production
kubectl rollout status deployment/myapp -n production --timeout=5m
- name: Get rollback revision
run: |
kubectl rollout history deployment/myapp -n production
Docker イメージのロールバック
- name: Rollback to previous image
run: |
# Get previous image tag
PREVIOUS_TAG=$(docker inspect myapp:latest | jq -r '.[0].ContainerConfig.Labels.previous_tag')
# Retag previous as latest
docker pull myapp:$PREVIOUS_TAG
docker tag myapp:$PREVIOUS_TAG myapp:latest
docker push myapp:latest
# Restart containers
docker-compose pull
docker-compose up -d
データベースマイグレーションのロールバック
- name: Rollback database migrations
run: |
# Get migration to rollback to
CURRENT=$(npm run migrate:current)
TARGET=${{ github.event.inputs.migration }}
echo "Rolling back from $CURRENT to $TARGET"
npm run migrate:down -- --to=$TARGET
# Verify rollback
AFTER=$(npm run migrate:current)
if [ "$AFTER" != "$TARGET" ]; then
echo "❌ Migration rollback failed"
exit 1
fi
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
ロールバック手順書
# Production Rollback Runbook
## When to Rollback
Rollback if:
- Critical bugs affecting >10% of users
- Data integrity issues
- Security vulnerabilities
- Performance degradation >50%
- Error rate >5%
## Before Rollback
1. **Assess impact**: Check monitoring dashboards
2. **Identify version**: Determine last known good version
3. **Notify team**: Post in #incidents Slack channel
4. **Enable maintenance mode** (if possible)
## Rollback Steps
### Automated Rollback (Preferred)
1. Go to Actions → Rollback workflow
2. Select environment (staging/production)
3. Enter target version (e.g., v1.2.3 or "previous")
4. Enter reason for rollback
5. Click "Run workflow"
6. Monitor progress in Actions tab
### Manual Rollback (Emergency)
```bash
# 1. SSH to production server
ssh production
# 2. Check current version
docker ps | grep myapp
# 3. Pull previous version
docker pull myapp:v1.2.3
# 4. Update docker-compose
vim docker-compose.yml
# Change image: myapp:latest to myapp:v1.2.3
# 5. Deploy
docker-compose up -d
# 6. Verify
curl https://api.myapp.com/health
# 7. Check logs
docker logs myapp -f
```
ロールバック後
- 検証:スモークテストを実行します
- 監視:15 分間、エラー率を監視します
- 通知:#incidents にステータスを更新します
- メンテナンスモードを解除します
- インシデントチケットを作成します
- 事後検証会を予定します
ロールバックの検証
- ヘルスチェックが 200 を返す
- エラー率が 1% 未満
- p95 レスポンスタイムが 500ms 未満
- 主要機能(ログイン、チェックアウトなど)が動作する
- データベースに接続できる
コミュニケーション用テンプレート
🔄 ROLLBACK IN PROGRESS
Environment: Production
From: v1.3.0
To: v1.2.3
Reason: Critical bug in checkout flow
Status: In progress
ETA: 5 minutes
Updates: #incidents
よくある問題
問題:ロールバックに失敗する
**症状:**デプロイが開始しない
**対処法:**ログを確認し、バージョンが存在すること、およびシークレットが有効であることを確認します
問題:データベースとの互換性がない
**症状:**アプリは起動するものの、データを読み取れない
**対処法:**先にマイグレーションをロールバックする必要がある場合があります
問題:トラフィックがルーティングされない
**症状:**ユーザーに引き続き新しいバージョンが表示される
**対処法:**CDN キャッシュをクリアし、ロードバランサーの設定を確認します
## Health Check Script
```bash
#!/bin/bash
# scripts/health-check.sh
ENVIRONMENT=$1
BASE_URL="https://${ENVIRONMENT}.myapp.com"
echo "Running health checks for $ENVIRONMENT..."
# API health
if ! curl -f "$BASE_URL/api/health" > /dev/null 2>&1; then
echo "❌ API health check failed"
exit 1
fi
# Database connection
if ! curl -f "$BASE_URL/api/health/db" > /dev/null 2>&1; then
echo "❌ Database health check failed"
exit 1
fi
# Key endpoints
ENDPOINTS=("/api/users" "/api/products" "/api/orders")
for endpoint in "${ENDPOINTS[@]}"; do
if ! curl -f "$BASE_URL$endpoint" > /dev/null 2>&1; then
echo "❌ Endpoint $endpoint health check failed"
exit 1
fi
done
echo "✅ All health checks passed"
exit 0
ベストプラクティス
- 迅速なロールバック:5 分以内に前のバージョンへ戻します
- 自動化:ワンクリックで実行できるロールバックワークフロー
- 検証:ロールバック後にヘルスチェックを実施します
- 文書化:明確な手順書を用意します
- テスト:定期的にロールバックを練習します
- 監視:失敗時にアラートを出します
- コミュニケーション:関係者に通知します
出力チェックリスト
- 手動ロールバックワークフロー
- 障害発生時の自動ロールバック
- プラットフォーム固有のロールバック(K8s/Docker)
- データベースのロールバック手順
- ロールバック手順書の文書化
- ヘルスチェックスクリプト
- コミュニケーション用テンプレート
- インシデント課題の自動化
コメント
Markdown 対応