mcpField
P
preview-environments-builder

preview-environments-builder

github.com/patricio0312revクラウド・DevOps63237 回インストール41 週間前に更新
リポジトリ

preview-environments-builder について

Pull Request のプレビュー環境を計画するスキルです。Vercel と Docker の例を示し、環境名、PR へのリンク、クリーンアップ、データベースのシード、リソース制限を扱います。

主な機能

  1. 01Vercel プレビューの例
  2. 02Docker ベースのプレビュー例
  3. 03PR クローズ時のクリーンアップ
  4. 04一意な環境名の設定
  5. 05データベースシードの指針
  6. 06リソースとシークレットの保護策

活用シーン

  1. 01Pull Request ごとに分離環境を作成
  2. 02PR コメントにプレビュー URL を掲載
  3. 03PR クローズ時にプレビュー資源を削除
  4. 04テストデータをプレビューデータベースに投入

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/patricio0312rev/skills --skill preview-environments-builder

インストール後、Claude Code で/preview-environments-builderを入力して読み込まれたか確認します。

詳細

プレビュー環境ビルダー

すべてのプルリクエストに対して、分離されたプレビュー環境をデプロイします。

Vercel のプレビュー デプロイ

# .github/workflows/preview.yml
name: Preview Deployment

on:
  pull_request:
    types: [opened, synchronize, reopened]

jobs:
  deploy-preview:
    runs-on: ubuntu-latest
    environment:
      name: preview-${{ github.event.pull_request.number }}
      url: ${{ steps.deploy.outputs.url }}

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: "20"
          cache: "npm"

      - run: npm ci
      - run: npm run build

      - name: Deploy to Vercel
        id: deploy
        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 }}
          scope: ${{ secrets.VERCEL_ORG_ID }}
          alias-domains: pr-${{ github.event.pull_request.number }}.myapp.dev

      - name: Comment PR
        uses: actions/github-script@v7
        with:
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `✅ Preview deployed!\n\n🔗 **URL:** ${{ steps.deploy.outputs.url }}\n\nCommit: ${context.sha.substring(0, 7)}`
            })

Docker ベースのプレビュー

preview:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4

    - name: Build Docker image
      run: |
        docker build -t myapp:pr-${{ github.event.pull_request.number }} .

    - name: Deploy to Kubernetes
      run: |
        kubectl create namespace pr-${{ github.event.pull_request.number }} || true
        kubectl apply -f k8s/preview.yml \
          --namespace pr-${{ github.event.pull_request.number }}
        kubectl set image deployment/myapp \
          myapp=myapp:pr-${{ github.event.pull_request.number }} \
          --namespace pr-${{ github.event.pull_request.number }}

    - name: Get preview URL
      id: url
      run: |
        URL=$(kubectl get ingress myapp \
          --namespace pr-${{ github.event.pull_request.number }} \
          -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
        echo "url=https://pr-${{ github.event.pull_request.number }}.preview.myapp.com" >> $GITHUB_OUTPUT

    - name: Comment PR
      uses: actions/github-script@v7
      with:
        script: |
          github.rest.issues.createComment({
            issue_number: context.issue.number,
            owner: context.repo.owner,
            repo: context.repo.repo,
            body: `🚀 Preview deployed to: ${{ steps.url.outputs.url }}`
          })

PR クローズ時のクリーンアップ

# .github/workflows/cleanup-preview.yml
name: Cleanup Preview

on:
  pull_request:
    types: [closed]

jobs:
  cleanup:
    runs-on: ubuntu-latest
    steps:
      - name: Delete Vercel deployment
        uses: actions/github-script@v7
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const deployments = await github.rest.repos.listDeployments({
              owner: context.repo.owner,
              repo: context.repo.repo,
              environment: `preview-${context.issue.number}`
            });

            for (const deployment of deployments.data) {
              await github.rest.repos.createDeploymentStatus({
                owner: context.repo.owner,
                repo: context.repo.repo,
                deployment_id: deployment.id,
                state: 'inactive'
              });

              await github.rest.repos.deleteDeployment({
                owner: context.repo.owner,
                repo: context.repo.repo,
                deployment_id: deployment.id
              });
            }

      - name: Cleanup Kubernetes namespace
        run: |
          kubectl delete namespace pr-${{ github.event.pull_request.number }} --ignore-not-found=true

環境の命名

# Consistent naming pattern
environment:
  name: preview-pr-${{ github.event.pull_request.number }}
  url: https://pr-${{ github.event.pull_request.number }}.preview.myapp.com

データベースのシード

- name: Setup preview database
  run: |
    # Create database
    psql -c "CREATE DATABASE preview_pr_${{ github.event.pull_request.number }};"

    # Seed with test data
    npm run db:seed -- --database=preview_pr_${{ github.event.pull_request.number }}
  env:
    DATABASE_URL: ${{ secrets.PREVIEW_DB_URL }}

ベストプラクティス

  1. 一意の URL:pr-{number}.preview.domain.com
  2. 自動クリーンアップ:PR のクローズ時に削除
  3. PR にコメント:プレビューへのリンクを記載
  4. 環境の保護:承認を必須にする
  5. リソース制限:不正利用を防止
  6. TTL:7 日後に自動削除
  7. シークレット管理:プレビュー専用のシークレットを使用

出力チェックリスト

  • プレビュー デプロイのワークフロー
  • 一意の URL 生成
  • リンク付きの PR コメント
  • クローズ時のクリーンアップ ワークフロー
  • 環境の命名戦略
  • データベースのシード(必要な場合)
  • リソース制限の設定

コメント