DevOps实践里,CI/CD流水线是把代码提交到生产环境之间路程缩短的最直接工具。GitLab CI内置在GitLab平台内,不依赖额外部署的Jenkins服务,写一份.gitlab-ci.yml就能把测试、镜像构建、服务器部署串起来。本文给出一套可直接落地的Docker自动化部署流水线。
GitLab Runner注册与部署
Runner是流水线的执行者,用Docker executor方式部署,让每次任务都跑在干净镜像里。
# 安装runner(Debian/Ubuntu)
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
sudo apt-get install gitlab-runner
# 注册runner
sudo gitlab-runner register \
--url https://gitlab.example.com \
--token GLRT-xxxx \
--executor docker \
--docker-image docker:latest
runner注册token在项目或群组的Settings->CI/CD->Runners里获取。注册完成后,仓库里推送.gitlab-ci.yml即可触发流水线。
gitlab-ci.yml流水线编排
流水线按stage组织:test跑单元测试,build构建并推送镜像,deploy发布到服务器。
stages:
- test
- build
- deploy
variables:
IMAGE_TAG: $CI_COMMIT_SHORT_SHA
test:
stage: test
image: python:3.11
script:
- pip install -r requirements.txt
- pytest -v
build:
stage: build
image: docker:24
services:
- docker:24-dind
script:
- docker build -t registry.example.com/app:$IMAGE_TAG .
- echo "$REGISTRY_PASSWORD" | docker login registry.example.com -u "$REGISTRY_USER" --password-stdin
- docker push registry.example.com/app:$IMAGE_TAG
only:
- main
deploy:
stage: deploy
image: alpine:3
before_script:
- apk add --no-cache openssh-client
script:
- ssh -o StrictHostKeyChecking=no deploy@server "cd /srv/app && docker compose pull app && docker compose up -d app"
environment:
name: production
only:
- main
密钥与敏感信息管理
流水线里的密码统一走GitLab CI/CD Variables,禁止写进仓库。注册为Protected变量的值只对受保护分支生效。
# Settings -> CI/CD -> Variables 添加:
# REGISTRY_USER protected=true
# REGISTRY_PASSWORD protected=true, masked=true
镜像构建加速与缓存
Kaniko缓存配合Dockerfile分层缓存能明显缩短构建时间,适合无特权容器环境。
build:
stage: build
image: gcr.io/kaniko-project/executor:latest
script:
- /kaniko/executor --context . --dockerfile Dockerfile \
--destination registry.example.com/app:$IMAGE_TAG \
--cache=true --cache-repo=registry.example.com/cache
only:
- main
部署回滚与发布策略
镜像标签固定用Git提交短哈希,保证每次发布可追溯。线上出问题时直接回滚到上一个标签。
ssh deploy@server "cd /srv/app && docker compose pull app && docker compose up -d app"
# 回滚到旧版本
ssh deploy@server "cd /srv/app && IMAGE_TAG=旧标签 docker compose up -d app"
实际项目中把Dockerfile分层做细、测试镜像做小,CI耗时和失败率一起下降。流水线稳定后,发布动作就变成一次merge request评审,部署结果由流水线保证。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/gitlabcicd-liu-shui-xian-da-jian-docker-zi-dong-hua-gou/