别再手动传代码了!用GitHub Actions + Cloudflare Pages实现静态网站自动部署(保姆级教程)

张开发
2026/4/12 5:38:37 15 分钟阅读

分享文章

别再手动传代码了!用GitHub Actions + Cloudflare Pages实现静态网站自动部署(保姆级教程)
从提交到上线GitHub Actions与Cloudflare Pages的自动化部署实战每次代码改动后手动部署的日子该结束了。作为一名长期与静态网站打交道的开发者我深知重复上传、等待构建的繁琐。直到将GitHub Actions与Cloudflare Pages结合才真正体会到提交即上线的流畅感——现在只需git push剩下的工作全交给自动化流程。1. 为什么需要自动化部署手动上传代码文件到托管平台的方式在个人博客或小型项目中或许勉强可用。但当团队协作或频繁更新时这种方式的低效与风险立刻显现时间成本每次修改后需本地构建、压缩、上传占用核心开发时间人为失误可能上传错误版本或遗漏关键文件版本回溯困难缺乏与git commit的直接关联协作障碍团队成员无法实时获取最新部署状态# 传统手动部署流程示例 npm run build tar -czf dist.tar.gz dist/ scp dist.tar.gz userserver:/path/to/deploy ssh userserver tar -xzf /path/to/deploy/dist.tar.gz而自动化部署体系带来的改变是根本性的即时性代码推送触发全流程缩短交付周期一致性每次部署使用相同的清洁环境可追溯每个线上版本对应明确的git commit安全隔离无需在本地存储生产环境凭据2. 技术栈选型为什么是GitHub Actions Cloudflare Pages市面上常见的静态网站托管方案各有特点方案免费额度构建速度全球CDN自定义域名自动化支持Cloudflare Pages无限流量★★★★☆✓✓✓GitHub Pages100GB/月★★☆☆☆×✓有限Netlify100GB/月★★★☆☆✓✓✓Vercel100GB/月★★★★☆✓✓✓Cloudflare Pages的独特优势在于完全免费的全球边缘网络相比其他方案的流量限制更宽松原生Git集成支持GitHub、GitLab等主流平台智能缓存失效内容更新后CDN刷新更及时预览部署每个PR自动生成可测试的临时URL而GitHub Actions作为自动化引擎深度仓库集成无需额外配置webhook丰富的社区actions重用经过验证的工作流组件灵活的触发条件可按分支、标签等精细控制3. 配置自动化部署流水线3.1 前期准备确保已具备GitHub仓库中的静态网站项目支持Hugo、Next.js、VuePress等主流框架Cloudflare账户免费版即可自定义域名可选非必须提示如果项目使用SSG框架建议先在本地测试npm run build能正常生成静态文件3.2 Cloudflare Pages基础配置访问Cloudflare Dashboard → Workers Pages → 创建应用 → Pages连接GitHub账户并授权访问目标仓库选择仓库后进入构建设置框架预设根据项目选择如Vue.js、React等构建命令通常为npm run build输出目录一般为dist或public点击保存并部署完成初始配置此时已实现基本的git推送触发部署但还不够理想——每次构建实际发生在Cloudflare的服务器我们无法完全控制环境。3.3 进阶GitHub Actions配置在项目根目录创建.github/workflows/deploy.ymlname: Deploy to Cloudflare Pages on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: ubuntu-latest permissions: contents: read deployments: write steps: - uses: actions/checkoutv3 - name: Setup Node uses: actions/setup-nodev3 with: node-version: 18 - run: npm ci - run: npm run build - name: Upload artifact uses: actions/upload-pages-artifactv1 with: path: dist/ deploy: needs: build runs-on: ubuntu-latest permissions: pages: write id-token: write environment: name: production url: ${{ steps.deployment.outputs.page_url }} steps: - name: Deploy to Cloudflare uses: cloudflare/pages-action1 with: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} projectName: your-project-name directory: dist/关键配置说明触发条件主分支推送或PR时运行构建环境使用官方Node.js环境确保一致性权限控制contents: read允许检出代码deployments: write创建部署状态安全实践API Token通过GitHub Secrets管理构建产物作为独立artifact传递3.4 获取Cloudflare API凭证在Cloudflare控制台 → 用户设置 → API Tokens创建自定义Token → 选择编辑Cloudflare Pages模板权限范围选择包含Account → Pages → EditZone → Zone → Read将生成的Token和Account ID添加到GitHub仓库Secrets注意Account ID可在Cloudflare控制台右下角获取而非Zone ID4. 高级优化技巧4.1 构建缓存加速在buildjob中添加缓存步骤- name: Cache node modules uses: actions/cachev3 with: path: | ~/.npm node_modules key: ${{ runner.os }}-node-${{ hashFiles(**/package-lock.json) }} restore-keys: | ${{ runner.os }}-node-4.2 多环境部署通过GitHub环境区分生产与预览deploy: environment: name: ${{ github.ref refs/heads/main production || preview }} url: ${{ steps.deployment.outputs.page_url }}4.3 自定义域名SSL配置在cloudflare-pages-action后添加DNS验证步骤- name: Setup SSL for custom domain if: github.ref refs/heads/main run: | curl -X POST https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records \ -H Authorization: Bearer ${{ secrets.CLOUDFLARE_API_TOKEN }} \ -H Content-Type: application/json \ --data { type: CNAME, name: www, content: your-project.pages.dev, ttl: 3600, proxied: true } env: ZONE_ID: ${{ secrets.CLOUDFLARE_ZONE_ID }}4.4 构建通知集成添加Slack或邮件通知- name: Notify on failure if: ${{ failure() }} uses: rtCamp/action-slack-notifyv2 env: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} SLACK_MESSAGE: 部署失败: ${{ github.repository }}${{ github.sha }}5. 常见问题排查构建成功但内容未更新检查Cloudflare Pages的构建输出目录配置确认GitHub Actions上传的artifact路径正确清除浏览器缓存或测试隐身窗口环境变量缺失前端项目需通过.env.production设置变量在GitHub Actions中注入- run: npm run build env: VUE_APP_API_URL: ${{ secrets.API_URL }}部署超时优化构建脚本移除不必要的步骤对于大型项目考虑增量构建检查node_modules是否被意外部署混合内容警告确保所有资源使用HTTPS链接在HTML头部添加meta http-equivContent-Security-Policy contentupgrade-insecure-requests经过三个月的生产环境运行这套自动化流程已为我节省超过40小时的部署时间。最惊喜的是处理紧急修复时——从代码修改到全球CDN生效全程不超过90秒。

更多文章