前言
CI/CD(持续集成/持续部署)是现代软件开发的核心实践。本文介绍如何使用GitLab CI搭建完整的自动化部署流水线。
一、流水线架构设计
一个完整的CI/CD流水线通常包含以下阶段:
- 代码检查:Lint、静态分析
- 单元测试:自动化测试验证
- 构建:编译、打包、生成镜像
- 部署:自动部署到测试/生产环境
二、GitLab CI配置示例
# .gitlab-ci.yml
stages:
- lint
- test
- build
- deploy
lint:
stage: lint
image: node:20-alpine
script:
- npm ci
- npm run lint
test:
stage: test
image: node:20-alpine
script:
- npm ci
- npm run test
coverage: '/Lines\s*:\s*(\d+\.?\d*)%/'
build:
stage: build
image: docker:24
services:
- docker:24-dind
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
only:
- master
deploy:
stage: deploy
image: alpine
script:
- apk add --no-cache openssh-client
- ssh -o StrictHostKeyChecking=no $DEPLOY_USER@$DEPLOY_HOST "cd /opt/app && docker compose pull && docker compose up -d"
only:
- master
when: manual
三、Docker镜像推送
构建完成后自动推送镜像到私有仓库:
# 登录仓库
echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin
# 打标签并推送
docker tag myapp:$CI_COMMIT_SHA registry.example.com/myapp:latest
docker push registry.example.com/myapp:latest
四、部署策略
4.1 滚动更新
逐步替换旧版本容器,实现零停机部署:
# docker-compose.yml
services:
api:
image: myapp:latest
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
order: start-first
4.2 蓝绿部署
同时运行新旧版本,通过Nginx切换流量:
# 切换Nginx上游
upstream backend {
server api-blue:3000; # 新版本
# server api-green:3000; # 旧版本(下线)
}
五、回滚机制
部署失败时快速回滚到上一个稳定版本:
# 回滚脚本
#!/bin/bash
PREVIOUS_TAG=$(git tag --sort=-creatordate | head -2 | tail -1)
docker compose pull myapp:$PREVIOUS_TAG
docker compose up -d myapp
CI/CD的核心价值在于:让每一次代码变更都能快速、安全地交付到用户手中。