CI/CD
GitLab CI/CD 与 Git 协同
系统介绍 GitLab CI/CD 如何与 Git 仓库深度集成,包括 .gitlab-ci.yml 配置、流水线触发策略和最佳实践。
- 要在 CI/CD 中使用 Git 的开发者
- 想理解管线中 Git 操作的边界和安全性
- 知道 branch、commit、push 的基本用法
- 有基础 CI/CD 概念
- 在 CI 中误用 GITHUB_TOKEN 导致安全风险
- 不理解 shallow clone 和 partial clone 的区别
一句话理解
GitLab CI/CD 内建于 GitLab 仓库中,通过仓库根目录的 .gitlab-ci.yml 文件定义流水线,实现"代码即流水线"的 DevOps 模式。
核心概念
.gitlab-ci.yml
流水线定义文件存放在仓库根目录:
stages:
- build
- test
- deploy
build-job:
stage: build
script:
- npm ci
- npm run build
test-job:
stage: test
script:
- npm test
deploy-job:
stage: deploy
script:
- npm run deploy
Git 事件与流水线触发
| Git 事件 | 流水线行为 |
|---|---|
git push | 自动触发对应分支的流水线 |
| Merge Request 创建/更新 | 触发 MR 流水线 |
| Tag push | 触发标签流水线,适合发布 |
| 定时流水线 | 基于 cron 调度 |
分支策略与流水线
按分支控制
workflow:
rules:
- if: $CI_COMMIT_BRANCH == "main"
variables:
DEPLOY_ENV: "production"
- if: $CI_COMMIT_BRANCH == "develop"
variables:
DEPLOY_ENV: "staging"
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
variables:
DEPLOY_ENV: "review"
Merge Request 流水线
MR 流水线在 PR/MR 的上下文中运行,可以访问源分支和目标分支的信息:
merge-check:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
script:
- git fetch origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
- git diff --check origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME...HEAD
与 Git 深度集成的功能
CI/CD 变量与 Git 信息
GitLab CI 提供大量与 Git 相关的预定义变量:
job:
script:
- echo "分支: $CI_COMMIT_BRANCH"
- echo "提交: $CI_COMMIT_SHORT_SHA"
- echo "Tag: $CI_COMMIT_TAG"
- echo "提交者: $CI_COMMIT_AUTHOR"
使用 CI_JOB_TOKEN 进行 Git 操作
git-push-job:
script:
- git remote set-url origin https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/group/project.git
- git checkout -b auto-release/$CI_COMMIT_SHORT_SHA
- git push origin auto-release/$CI_COMMIT_SHORT_SHA
合并结果流水线(Merge Result Pipeline)
在 MR 的合并结果上运行流水线,比仅在源分支上运行更准确:
merge-result:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
script:
- npm ci && npm test
Git 操作的最佳实践
使用 Git 深度(fetch-depth)
variables:
GIT_STRATEGY: clone
GIT_DEPTH: 10
GIT_DEPTH: 10:只获取最近 10 个提交,加速 CIGIT_DEPTH: 0:获取全部历史GIT_STRATEGY: clone:每次完整克隆(隔离性最好)GIT_STRATEGY: fetch:增量获取(更快但可能遇到问题)
使用 Git Clean 策略
variables:
GIT_CLEAN_FLAGS: -ffdx
确保流水线运行在干净的工作区中。
差异化优势
相比 GitHub Actions,GitLab CI/CD 有几个独特优势:
- 内置 Registry:Container Registry 与 CI 深度集成
- Review Apps:每次 MR 自动创建预览环境
- Merge Trains:自动排序 MR 并验证合并结果
- GitLab Pages:直接从 CI 部署静态站点
继续学习建议
gitlab/gitlab-ci-and-runners— GitLab CI 与 Runner 详解gitlab/gitlab-merge-trains-and-merge-result-pipelines— Merge Train 机制workflows/ci-optimization-with-git— CI 中的 Git 优化
上下篇
上一篇GitHub Actions 与 Git 协同命令专题
下一篇当前方向没有更多内容