DEVOPS

GitHub Actions 自动部署到云服务器

用最小权限、制品发布与健康检查实现可靠的 CI/CD。

发布目标#

流水线应产出一次构建、保存制品、串行部署到 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 可以限制并行发布和密钥访问。回滚应使用上一个已验证制品,而不是现场重新构建。

GK / OPS NOTES
把每一次变更写成可以复现的步骤

示例命令请先在测试环境验证,再根据自己的系统版本、网络和备份策略调整。

讨论区 16

分享你的经验、补充或不同观点。支持 Markdown 基础语法。

讨论区暂时为空,欢迎分享你的经验。