GitLab CI/CD 教程
下面是一份 完全版 GitLab CI/CD 教程,覆盖核心概念、底层工作机制、关键配置、企业级实践、优化技巧等。
📌 目录
- GitLab CI/CD 是什么?
- CI/CD 核心概念
- .gitlab-ci.yml 文件结构与关键语法
- Pipeline(持续集成流程)详解
- Jobs、Stages、Rules
- GitLab Runner 工作机制
- 常用 CI 模块(cache、artifacts、needs、variables)
- 环境(Environments)与部署(Deployments)
- GitLab 内置模板与 include
- 高级功能:并发、依赖、条件构建
- Secrets、配置中心、变量管理
- CI/CD 进阶优化(速度、缓存、镜像)
- 生产级项目完整示例
- 常见问题排查
GitLab CI/CD 是 GitLab 内置的持续集成和持续部署系统,用于:
- 代码自动测试
- 构建镜像/二进制
- 部署到服务器/云/K8s
- 持续检查质量(Lint、审计)
只需要一个文件 .gitlab-ci.yml 就能自动执行整个工作流程。
一次 CI 执行即为一个 Pipeline,由多个 Job/stage 组成。
例子:
Pipeline
├── build
├── test
└── deploy
最小 CI 单元,一个 job 代表一段要执行的脚本。
Job 分组,按顺序执行:
stages:
- build
- test
- deploy
GitLab CI 的执行者,负责运行 Job(前面你已经学过了)。
Runner 执行 .gitlab-ci.yml 内的脚本。
某个 job 产生的文件,可被后续 job 下载使用。
用于加速 Pipeline 速度,如 node_modules/、pip 缓存等。
CI 环境变量,用于配置敏感信息、环境参数。
基础结构示例:
stages:
- build
- test
- deploy
build_job:
stage: build
script:
- npm install
- npm run build
test_job:
stage: test
script:
- npm test
deploy_job:
stage: deploy
script:
- ./deploy.sh
only:
- main
Pipeline 执行顺序:
stages 顺序
-> 同 stage 的 job 并行执行
-> 下一个 stage
比如:
build(并行)
test(并行)
deploy(并行)
build-job:
stage: build
script:
- go build main.go
比 only/except 更强大的条件匹配系统。
示例:只在 main 分支运行
deploy:
stage: deploy
script: ./deploy.sh
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
更复杂:
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
- if: '$CI_COMMIT_BRANCH == "main"'
test:
stage: test
needs: ["build"]
when: manual
用于生产部署。
流程:
- GitLab 调度 pipeline
- 匹配 tags -> 找 Runner
- Runner 拉取代码
- 执行 script
- 产生 artifacts
- 上报状态给 GitLab
cache:
paths:
- node_modules/
artifacts:
paths:
- dist/
expire_in: 1 week
variables:
NODE_ENV: production
整个 pipeline 通用:
before_script:
- echo "start"
定义环境:
deploy:
stage: deploy
script: ./deploy.sh
environment:
name: production
url: https://example.com
支持:
- 自动部署
- 回滚(rollback)
- 多环境(dev / staging / prod)
你可以把 CI 拆分成很多小文件:
include:
- local: 'ci/build.yml'
- local: 'ci/test.yml'
- template: 'Jobs/Build.gitlab-ci.yml'
非常适合大型项目。
利用 tags 分配不同类型任务:
build-job:
tags: ["docker"]
test-job:
tags: ["k8s"]
例如:
test:
stage: test
parallel:
matrix:
- GO_VERSION: ["1.20", "1.21", "1.22"]
when: manual
allow_failure: false
test:
dependencies:
- build
在 GitLab UI 设置:
Settings -> CI/CD -> Variables
常见敏感信息:
- TOKEN
- SSH_PRIVATE_KEY
- DOCKER_PASSWORD
- K8S_CONFIG
在 CI 中使用:
script:
- echo "$SSH_PRIVATE_KEY" > key.pem
使用语言官方镜像 + cache:
image: python:3.12-slim
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- .cache/pip
适用于真实企业项目:
stages:
- lint
- build
- test
- docker
- deploy
variables:
APP: myapp
lint:
stage: lint
image: node:20
script:
- npm ci
- npm run lint
build:
stage: build
image: python:3.12
script:
- pip install -r requirements.txt
- python build.py
artifacts:
paths:
- build/
test:
stage: test
image: python:3.12
needs: ["build"]
script:
- pytest -v
docker-build:
stage: docker
tags: ["docker"]
image: docker:24
services:
- docker:dind
script:
- docker build -t registry.example.com/$APP:$CI_COMMIT_SHA .
- docker push registry.example.com/$APP:$CI_COMMIT_SHA
deploy:
stage: deploy
tags: ["prod"]
when: manual
script:
- ./deploy_prod.sh
这是生产环境中最常见的 CI/CD 结构。
检查你的 job 是否设置了 tags:。
必须存在同一个 Runner 才有效。
需要:
privileged = true
检查:
CI Lint 工具
GitLab 自带检查工具非常好用。