关于 preview-environments-builder
用于规划 Pull Request 预览部署的技能,提供 Vercel 和 Docker 示例,并涵盖环境命名、PR 链接、清理、数据库填充及资源限制。
主要功能
- 01Vercel 预览部署示例
- 02基于 Docker 的预览示例
- 03关闭 PR 时的清理工作流
- 04唯一环境命名方案
- 05数据库填充指导
- 06资源与密钥防护建议
适用场景
- 01为每个 Pull Request 创建隔离环境
- 02在 PR 评论中发布预览 URL
- 03PR 关闭时清除预览资源
- 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 }}
最佳实践
- 唯一 URL:pr-{number}.preview.domain.com
- 自动清理:PR 关闭时删除
- 在 PR 中评论:附上预览链接
- 环境保护:要求审批
- 资源限制:防止滥用
- TTL:7 天后自动删除
- 密钥管理:使用预览专用密钥
输出检查清单
- 预览部署工作流
- 唯一 URL 生成
- 包含链接的 PR 评论
- 关闭 PR 时运行的清理工作流
- 环境命名策略
- 数据库填充(如需要)
- 已配置资源限制
评论
支持 Markdown