关于 cloudflare-workers-ci-cd
这是一项使用 GitHub Actions 或 GitLab CI 自动测试和部署 Cloudflare Workers 的 CI/CD 参考技能。它为团队提供多环境与预览发布、密钥管理、部署验证和回滚实践指南。
主要功能
- 01GitHub Actions 与 GitLab CI 工作流
- 02部署前自动运行测试
- 03预览与多环境部署
- 04密钥管理指南
- 05部署验证与回滚
适用场景
- 01变更合入 main 时部署 Workers
- 02为拉取请求创建预览部署
- 03在每次提交时运行测试
- 04为生产发布设置审批
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ secondsky/ claude-skills --skill cloudflare-workers-ci-cd安装后在 Claude Code 中输入/cloudflare-workers-ci-cd确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/deployment-strategies.mdgithub-actions.mdgitlab-ci.mdsecrets-management.mdscripts/verify-deployment.shtemplates/github-actions-full.ymlgitlab-ci-full.ymlpreview-deployment.ymlrollback-workflow.yml详细介绍
Cloudflare Workers CI/CD
状态:✅ 已可用于生产环境 | 上次验证:2025-01-27 GitHub Actions:v4 | GitLab CI:最新版本 | Wrangler:4.81.0
目录
什么是 Workers CI/CD?
使用 GitHub Actions 或 GitLab CI 对 Cloudflare Workers 进行自动化测试和部署。支持在每次提交时运行测试,自动部署到预览、预发布和生产环境,安全地管理密钥,并设置部署关卡以确保安全发布。
主要功能:自动化测试、多环境部署、为每个 PR 提供预览 URL、密钥管理、部署验证、自动回滚。
2025 年新增内容
GitHub Actions 更新(2025 年 1 月):
- 新增:
cloudflare/wrangler-action@v4(改进缓存,加快部署) - 改进:通过
vars和secrets参数支持密钥 - 新增:内置预览环境清理功能
- 破坏性变更:
apiToken重命名为api-token(kebab-case)
从 v3 迁移:
# ❌ OLD (v3)
- uses: cloudflare/wrangler-action@3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
# ✅ NEW (v4)
- uses: cloudflare/wrangler-action@v4
with:
api-token: ${{ secrets.CLOUDFLARE_API_TOKEN }}
Wrangler 4.50.0(2025 年 1 月):
- 新增:用于部署验证的
--dry-run标志 - 改进:通过并行上传加快部署
- 新增:用于保留环境变量的
--keep-vars
快速入门(10 分钟)
设置 GitHub Actions
1. 创建 Cloudflare API Token
访问:https://dash.cloudflare.com/profile/api-tokens
创建具有以下权限的令牌:
- Account.Cloudflare Workers Scripts - 编辑
- Account.Cloudflare Pages - 编辑(如果使用 Pages)
2. 在 GitHub 中添加密钥
仓库 → Settings → Secrets → Actions → New repository secret:
- 名称:
CLOUDFLARE_API_TOKEN - 值:[粘贴令牌]
3. 创建 .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
name: Deploy to Cloudflare Workers
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- run: bun install
- run: bun test
- name: Deploy
uses: cloudflare/wrangler-action@v4
with:
api-token: ${{ secrets.CLOUDFLARE_API_TOKEN }}
command: deploy
4. 推送并验证
git add .github/workflows/deploy.yml
git commit -m "Add CI/CD pipeline"
git push
在 GitHub 的 Actions 选项卡中查看部署进度。
关键规则
1. 切勿将密钥提交到 Git
✅ 正确:
# Use GitHub Secrets
api-token: ${{ secrets.CLOUDFLARE_API_TOKEN }}
❌ 错误:
# ❌ NEVER hardcode tokens
api-token: "abc123def456..."
原因:令牌泄露后,任何人都可以向你的账户部署。
2. 部署前务必运行测试
✅ 正确:
- run: bun test # ✅ Tests run first
- name: Deploy
uses: cloudflare/wrangler-action@v4
with:
api-token: ${{ secrets.CLOUDFLARE_API_TOKEN }}
❌ 错误:
# ❌ Skipping tests
- name: Deploy
uses: cloudflare/wrangler-action@v4
# No tests!
原因:有问题的代码不应进入生产环境。
3. 使用不同的环境
✅ 正确:
# Production (main branch)
- name: Deploy to Production
if: github.ref == 'refs/heads/main'
run: bunx wrangler deploy --env production
# Staging (other branches)
- name: Deploy to Staging
if: github.ref != 'refs/heads/main'
run: bunx wrangler deploy --env staging
❌ 错误:
# ❌ Always deploying to production
- run: bunx wrangler deploy
原因:先在预发布环境测试变更,再部署到生产环境。
4. 验证部署是否成功
✅ 正确:
- name: Deploy
id: deploy
uses: cloudflare/wrangler-action@v4
- name: Verify Deployment
run: |
curl -f https://your-worker.workers.dev/health || exit 1
❌ 错误:
# ❌ No verification
- name: Deploy
uses: cloudflare/wrangler-action@v4
# Assuming it worked...
原因:部署可能会静默失败(DNS 问题、绑定错误)。
5. 为生产环境设置部署关卡
✅ 正确:
deploy-production:
environment:
name: production
url: https://your-worker.workers.dev
# Requires manual approval
❌ 错误:
# ❌ Auto-deploy to production without review
deploy-production:
runs-on: ubuntu-latest
原因:人工审核可以发现自动化流程会遗漏的问题。
核心概念
多环境策略
推荐设置:
- 生产环境:
main分支 → 生产环境 - 预发布环境:拉取请求 → 预发布环境
- 预览环境:每个 PR → 唯一的预览 URL
wrangler.jsonc:
{
"name": "my-worker",
"main": "src/index.ts",
"env": {
"production": {
"name": "my-worker-production",
"vars": {
"ENVIRONMENT": "production"
}
},
"staging": {
"name": "my-worker-staging",
"vars": {
"ENVIRONMENT": "staging"
}
}
}
}
密钥管理
配置类型:
- 公开变量(wrangler.jsonc)- 非敏感配置
- 密钥(wrangler secret)- API 密钥、令牌
- CI 变量(GitHub Secrets)- 部署凭据
设置密钥:
# Local development
wrangler secret put DATABASE_URL
# CI/CD (via GitHub Actions)
bunx wrangler secret put DATABASE_URL --env production <<< "${{ secrets.DATABASE_URL }}"
预览部署
自动将每个 PR 部署到唯一的 URL,以供测试:
- name: Deploy Preview
uses: cloudflare/wrangler-action@v4
with:
api-token: ${{ secrets.CLOUDFLARE_API_TOKEN }}
command: deploy --env preview-${{ github.event.number }}
每个 PR 都会获得类似以下的 URL:my-worker-preview-42.workers.dev
5 大使用场景
1. 推送到 Main 时部署
name: Deploy Production
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
- run: bun install
- run: bun test
- run: bun run build
- name: Deploy to Production
uses: cloudflare/wrangler-action@v4
with:
api-token: ${{ secrets.CLOUDFLARE_API_TOKEN }}
command: deploy --env production
2. 为 PR 创建预览部署
name: Preview
on:
pull_request:
branches: [main]
jobs:
preview:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
- run: bun install
- run: bun test
- name: Deploy Preview
id: deploy
uses: cloudflare/wrangler-action@v4
with:
api-token: ${{ secrets.CLOUDFLARE_API_TOKEN }}
command: deploy --env preview-${{ github.event.number }}
- 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: https://my-worker-preview-${{ github.event.number }}.workers.dev'
})
3. 每次提交时运行测试
name: Test
on:
push:
branches: ['**']
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
- run: bun install
- run: bun test --coverage
- name: Upload Coverage
uses: codecov/codecov-action@v4
with:
files: ./coverage/lcov.info
4. 通过审批关卡进行部署
name: Deploy Production (Manual Approval)
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
environment:
name: production
url: https://my-worker.workers.dev
# Requires manual approval in GitHub Settings
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
- run: bun install
- run: bun test
- name: Deploy
uses: cloudflare/wrangler-action@v4
with:
api-token: ${{ secrets.CLOUDFLARE_API_TOKEN }}
command: deploy --env production
5. 分阶段发布(金丝雀发布)
name: Canary Deployment
on:
workflow_dispatch:
inputs:
percentage:
description: 'Traffic percentage to new version'
required: true
default: '10'
jobs:
canary:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
- run: bun install
# Deploy to canary environment
- name: Deploy Canary
uses: cloudflare/wrangler-action@v4
with:
api-token: ${{ secrets.CLOUDFLARE_API_TOKEN }}
command: deploy --env canary
# Configure traffic split via Cloudflare API
# (See references/deployment-strategies.md for full example)
最佳实践
✅ 应该做
-
使用语义化提交消息:
feat: add user authentication fix: resolve rate limiting issue chore: update dependencies -
运行代码检查和类型检查:
- run: bun run lint - run: bun run type-check - run: bun test -
缓存依赖项:
- uses: oven-sh/setup-bun@v2 with: bun-version: latest # Bun automatically caches dependencies -
将不同分支部署到不同环境:
- name: Deploy run: | if [ "${{ github.ref }}" == "refs/heads/main" ]; then bunx wrangler deploy --env production else bunx wrangler deploy --env staging fi -
监控部署:
- name: Notify Slack if: failure() uses: slackapi/slack-github-action@v1 with: payload: | {"text": "Deployment failed: ${{ github.sha }}"}
❌ 不应该做
- 不要跳过测试
- 不要未经验证就部署
- 不要将密钥硬编码
- 不要从功能分支部署到生产环境
- 不要忽略部署失败
可预防的 7 大错误
1. ❌ Error: A valid Cloudflare API token is required
原因:缺少或无效的 CLOUDFLARE_API_TOKEN 密钥。
修复方法:
- 创建 API 令牌:https://dash.cloudflare.com/profile/api-tokens
- 添加到 GitHub Secrets:Settings → Secrets → Actions
- 在工作流中使用:
api-token: ${{ secrets.CLOUDFLARE_API_TOKEN }}
2. ❌ Error: Not enough permissions to deploy
原因:API 令牌缺少所需权限。
修复方法:重新创建令牌并授予以下权限:
- Account.Cloudflare Workers Scripts - 编辑
- Account settings - 读取
3. ❌ Error: wrangler.toml not found
原因:缺少 wrangler 配置。
修复方法:确保仓库根目录中存在 wrangler.jsonc。
4. ❌ 部署成功,但 worker 无法正常运行
原因:缺少密钥或环境变量。
修复方法:在 CI 中设置密钥:
- name: Set Secrets
run: |
echo "${{ secrets.DATABASE_URL }}" | bunx wrangler secret put DATABASE_URL --env production
5. ❌ 本地测试通过,但在 CI 中失败
原因:环境差异(Node 版本、缺少依赖项)。
修复方法:
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest # Lock version
- run: bun install --frozen-lockfile # Use exact versions
6. ❌ 预览部署发生冲突
原因:多个 PR 部署到同一个预览环境。
修复方法:在环境名称中使用 PR 编号:
command: deploy --env preview-${{ github.event.number }}
7. ❌ 密钥暴露在日志中
原因:在工作流中回显密钥。
修复方法:
# ❌ WRONG
- run: echo "Token: ${{ secrets.API_TOKEN }}"
# ✅ CORRECT
- run: echo "Deploying..." # No secrets in output
何时加载参考资料
需要详细的专业内容时,加载参考文件:
在以下情况加载 references/github-actions.md:
- 从头开始设置 GitHub Actions
- 配置矩阵构建(多个 Node 版本)
- 使用 GitHub 环境和部署保护
- 实现部署门禁和审批
在以下情况加载 references/gitlab-ci.md:
- 设置 GitLab CI 流水线
- 配置 GitLab 环境
- 使用 GitLab 密钥变量
- 实现 Review Apps
在以下情况加载 references/deployment-strategies.md:
- 实现蓝绿部署
- 设置金丝雀发布
- 配置流量拆分
- 规划回滚流程
在以下情况加载 references/secrets-management.md:
- 管理不同环境中的密钥
- 轮换 API 令牌
- 使用外部密钥提供商(Vault、1Password)
- 实现最小权限访问
在以下情况加载 templates/github-actions-full.yml:
- 完整的、可用于生产环境的 GitHub Actions 工作流
- 多环境部署示例
- 已配置所有部署门禁
在以下情况加载 templates/gitlab-ci-full.yml:
- 完整的 GitLab CI 流水线
- 多阶段部署
- Review App 配置
在以下情况加载 templates/preview-deployment.yml:
- PR 预览部署设置
- PR 关闭时自动清理
- 在评论中附上预览 URL
在以下情况加载 templates/rollback-workflow.yml:
- 手动回滚工作流
- 部署历史追踪
- 健康检查失败时自动回滚
在以下情况加载 scripts/verify-deployment.sh:
- 自动验证部署
- 健康检查实现
- 部署后的冒烟测试
安全安装
安装 CI/CD 依赖项时,请遵循供应链安全最佳实践:
- 阻止安装后脚本 —
npm config set ignore-scripts true(或 Bun:默认禁用) - 在 CI 中使用冻结的锁文件 — 始终使用
npm ci或bun install --frozen-lockfile - 安全门禁 — 在 CI 流水线中添加
socket ci,阻止违反安全策略的 PR
加载 dependency-upgrade 技能,获取完整的安全配置,包括 Socket CLI 集成、冷却期设置、锁文件验证和 CI 强制执行。
相关 Cloudflare 插件
如需进行部署测试,请加载:
- cloudflare-workers-testing - 在部署前测试 Workers
- cloudflare-manager - 通过 Cloudflare API 管理部署
此技能专注于 CI/CD 自动化,适用于所有 Workers 部署,无论使用哪些绑定。
有疑问? 请加载 references/secrets-management.md,或使用 /workers-deploy 命令获取部署指导。