发布目标#
流水线应产出一次构建、保存制品、串行部署到 production,并在健康检查失败时停止。服务器只接收制品,不在生产机执行不受控的 git pull && npm install。
最小权限工作流#
yaml
name: deploy
on:
push:
branches: [main]
workflow_dispatch:
permissions:
contents: read
concurrency:
group: production
cancel-in-progress: false
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm test
- run: npm run build
- uses: actions/upload-artifact@v4
with:
name: app-standalone
path: |
.next/standalone
.next/static
public
deploy:
needs: build
runs-on: ubuntu-latest
environment: production
steps:
- uses: actions/download-artifact@v4
with: { name: app-standalone }
- run: ./scripts/deploy.sh
env:
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
服务器端部署约束#
部署账号只允许写应用目录和重启目标服务;数据库迁移在备份后执行;脚本使用唯一发布目录并通过软链接切换,避免上传到一半就被流量访问。
验收与回滚#
bash
curl --fail --retry 10 --retry-delay 3 https://blog.example.com/api/health
curl --fail https://blog.example.com/login >/dev/null
GitHub 官方文档中的 environments 与 concurrency 可以限制并行发布和密钥访问。回滚应使用上一个已验证制品,而不是现场重新构建。
讨论区 16
分享你的经验、补充或不同观点。支持 Markdown 基础语法。