CI/CD流水线把代码提交、构建、测试与部署串成一条可重复执行的自动化链路,是DevOps实践的落地核心。GitHub Actions直接在仓库内用YAML文件定义流水线,无需单独搭建CI服务器,适合中小团队快速上线。本文用一份可运行的工作流配置说明触发条件、分阶段构建、镜像推送与服务器部署的实现方法,并给出失败告警与回滚的常见做法。
CI/CD流水线的工作流文件结构
GitHub Actions使用仓库.github/workflows目录下的YAML文件组织任务,一个工作流由触发事件、job与step组成。以下配置在main分支推送时触发构建与测试:
name: ci
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npm run lint
- run: npm run test
- run: npm run build
每个job在独立环境执行,某个step失败会直接中断后续步骤,因此lint、测试与构建放在同一个job即可保证提交质量。
多阶段流水线与镜像构建推送
测试通过后进入镜像构建与推送阶段。构建镜像推送到容器镜像仓库,再由部署job拉取运行,实现构建与部署解耦:
jobs:
docker:
runs-on: ubuntu-latest
needs: build
steps:
- uses: actions/checkout@v4
- name: 登录镜像仓库
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: 构建并推送镜像
run: |
docker build -t myapp:${{ github.sha }} .
docker push ghcr.io/demo/myapp:${{ github.sha }}
服务器部署与一键回滚
部署阶段通过SSH在服务器执行拉取新镜像、健康检查、切换流量的流程,回滚时只需重新拉取上一次镜像tag:
deploy:
runs-on: ubuntu-latest
needs: docker
steps:
- name: 部署到生产
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USER }}
key: ${{ secrets.SSH_KEY }}
script: |
docker pull ghcr.io/demo/myapp:${{ github.sha }}
docker compose up -d app
curl -f http://localhost:3000/healthz
- name: 失败告警
if: failure()
run: echo "deploy failed, check logs and rollback"
健康检查失败时流水线标红,运维按上一次成功镜像tag回滚即可,回滚与发布共用同一条链路,避免人为操作引入二次故障。
流水线落地的常见问题
- 不要把所有逻辑塞进一个job,拆分成build、test、deploy三个job,单步失败可单独重跑。
- 依赖用actions/cache缓存node_modules或pip缓存,构建时间可压缩60%以上。
- 密钥一律通过secrets注入,禁止明文写在YAML文件或日志输出中。
这套流水线跑通后,代码合并到线上部署的耗时控制在几分钟内,配合回滚流程可显著缩短故障恢复时间,适合作为团队自动化部署的起点。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/cicd-liu-shui-xian-shi-zhan-githubactions-gou-jian-ce-shi/