GitLab CI/CD 是内置于 GitLab 平台的持续集成(Continuous Integration)与持续交付(Continuous Delivery)系统。持续集成指代码合并后自动触发构建与测试,持续交付指把验证通过的产物自动或半自动部署到目标环境。传统做法需要独立部署 Jenkins 等 CI 服务器,把构建脚本放在服务器上、与代码仓库割裂,环境状态靠文档维护。GitLab CI/CD 把整套能力内建在 GitLab 中:配置文件 .gitlab-ci.yml 随仓库版本化、随代码评审一起走合并请求(MR),MR 合并前即可运行流水线验证,部署环境与回滚记录在界面上直接可查。核心特点包括:stages + needs 的灵活编排、内置 Runner 体系(Docker/Kubernetes 等执行器)、制品与缓存机制、环境与部署追踪、以及 CI/CD 组件复用。本篇按「速览 → 安装 → 上手 → 核心能力 → 生产部署 → 选型对比 → 应用场景 → 误区 → 面试题」的顺序,让读者读完即可在自己的仓库里跑通第一条流水线。
对 AI 从业者而言,CI/CD 是模型服务、训练流水线与 MLOps 管道落地的工程底座,掌握 GitLab CI/CD 意味着具备把「能跑的代码/模型」变成「可发布、可回滚、可观测的生产服务」的核心交付能力。
目录
速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。
为什么需要 GitLab CI/CD:CI 与 CD 一体化,无需独立 CI 服务器
没有 CI/CD 时,代码合并靠人工确认、测试靠本地执行、部署靠 SSH 上去手动操作,出现「在我机器上是好的」和「上线回滚靠回忆」的常态。独立 CI 服务器(如自建 Jenkins)解决了自动化问题,却引入新成本:服务器要单独部署维护,构建脚本散落在服务器或插件配置里,无法随代码评审,触发器与代码仓库的关联靠插件拼接。
GitLab CI/CD 把答案收敛在代码仓库本身。配置文件 .gitlab-ci.yml 与代码同库、同提交、同评审,任何一次修改都能在 MR 中看到 diff;推送代码即触发流水线,MR 分支天然获得独立验证,默认按 build → test → deploy 三阶段执行,未通过测试的代码进不了主干。部署侧内置环境(environment)记录、回滚按钮与部署审批,发布历史成为可检索的结构化数据,不再依赖人工记录。
与同类工具相比,GitLab CI/CD 的气质是「平台收敛」:SCM、MR 评审、流水线、制品库、安全扫描同属一个平台,配置一处编写、权限统一管控。GitHub Actions 更强调事件驱动与 Action 市场的开放生态,Jenkins 胜在插件定制的自由度,而 GitLab CI/CD 的核心优势是少组装、开箱即用,特别适合已经在用 GitLab 管理代码的团队。
安装与环境配置:4 步就绪(GitLab.com 免安装)
路径 A:直接用 GitLab.com(推荐先体验)。 注册账号、新建项目即可获得 CI/CD 能力,无需任何安装。注意免费套餐的共享 Runner 额度政策多次调整,2023 年后新建私有项目基本不再默认赠送共享 Runner 计算时长,生产使用建议自托管 Runner。
路径 B:自托管 GitLab + 自己的 Runner。 按以下步骤操作:
步骤一:安装 GitLab 服务端(Ubuntu 22.04 示例)。 官方提供的 apt 仓库脚本会配置软件源,随后设置对外 URL 并安装,安装后服务自动启动,浏览器访问 https://gitlab.example.com 完成 root 密码初始化。
步骤二:安装 GitLab Runner。 Runner 是真正执行流水线 job 的代理程序,需要与 GitLab 服务端分开安装。安装后可用 gitlab-runner --version 确认版本。
步骤三:注册 Runner。 在项目「设置 → CI/CD → Runner」中获取注册令牌(token),执行注册命令。--executor docker 表示每个 job 在独立容器中运行,隔离性好,是生产最常用方案。
步骤四:验证。 执行 gitlab-runner verify 查看 Runner 是否在线,再提交一个含 .gitlab-ci.yml 的提交触发冒烟流水线。
# 1. 安装 GitLab(Ubuntu,企业版包,社区版将 gitlab-ee 换为 gitlab-ce)curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bashsudo EXTERNAL_URL="https://gitlab.example.com" apt-get install gitlab-ee # 2. 安装 Runnercurl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bashsudo apt-get install gitlab-runner # 3. 注册 Runner(token 在项目/组/实例的设置中获取)sudo gitlab-runner register \ --url https://gitlab.example.com \ --token "$RUNNER_REGISTRATION_TOKEN" \ --executor docker \ --docker-image alpine:latest # 4. 验证sudo gitlab-runner verify
快速上手:10 分钟跑通第一个流水线
最小可用流程的思路:一个 YAML 文件 + 一次推送 = 一条可观察的流水线。不需要先搞懂全部关键字,先把「提交 → 自动测试 → 自动构建 → 手动部署」这条骨架立起来,再逐步加规则。
步骤一:新建项目。 在 GitLab 上创建空白项目,语言选任何你熟悉的即可;CI/CD 不依赖项目语言。
步骤二:创建 .gitlab-ci.yml。 在项目根目录创建该文件,或打开「构建 → 流水线编辑器」(Pipeline Editor)在线编写。编辑器自带语法高亮与 CI Lint 校验,保存前即可发现 YAML 与关键字错误,是官方推荐入口。
步骤三:编写最小流水线。 复制下面的三段式示例:test 与 build 在推送时自动执行,deploy 仅当推送到默认分支(main)时出现,且需要人工点击确认(when: manual)——这是生产环境常见的「人控门禁」。
步骤四:提交并观察。 推送到仓库后,打开「构建 → 流水线」查看运行状态,点击 job 看实时日志;job 失败会以非零退出码标记为红色。
进阶技巧:在流水线编辑器右侧的 CI Lint 中可对任意分支的配置做离线校验;想验证「只跑某个 job」可勾选 job 旁的运行按钮;pytest 等命令建议放到项目自带的环境(Docker 镜像的 image 关键字)中,保证本地与 CI 行为一致。
# .gitlab-ci.yml(最小可用示例,script 替换为项目真实命令)stages: # 未声明时默认 build → test → deploy - test - build - deploy test: stage: test script: - echo "running tests" - pytest # 按项目实际测试命令替换 build: stage: build script: - docker build -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" . deploy: stage: deploy environment: production # 记录部署环境,可在界面查看历史与回滚 script: - echo "deploying to production" rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH when: manual # 默认分支上手动点击才部署
核心能力详解:6 大支柱
支柱一:流水线编排与规则引擎。 默认模型是「阶段串行、阶段内 job 并行」:后一阶段等待前一阶段全部结束。需要提速时用 needs 声明直接依赖,构成 DAG(有向无环图,即 job 之间只按依赖关系串行、互不依赖的并行执行),配合 rules: if/changes/exists 按分支、文件变动或流水线来源(推送、MR、定时、API 触发)决定是否运行;workflow: rules 可全局控制整条流水线的启停条件。
支柱二:Runner 与执行器。 Runner 分为共享(实例/组级)、项目级三类,用 tags 指定某个 job 必须由哪类 Runner 执行。执行器(executor)决定 job 的运行环境:shell 直接在宿主机执行,docker 每个 job 起独立容器,kubernetes 由集群动态调度 Pod,另有 ssh、virtualbox、parallels 等。生产推荐 docker 或 kubernetes,依赖隔离且扩展性好。
支柱三:制品与缓存。 artifacts(构建产物,如编译结果、测试报告)会在 job 成功后被 GitLab 收集,按 dependencies 指定的依赖关系传给下一阶段,也可在页面直接下载;cache 则缓存依赖目录(如 node_modules、PyPI 缓存)以加速后续运行。两者不能混用:文件跨 job 传递只能靠 artifacts,cache 只是「尽力而为」的加速手段,不保证存在。
支柱四:环境、部署与回滚。 environment: production 把 job 与部署环境绑定,流水线页会生成环境列表、每次部署对应的提交与时间线;问题版本可一键回滚到上一成功部署。动态环境(如 review apps)用 $CI_COMMIT_REF_SLUG 等预定义变量为每个 MR 生成临时环境,MR 关闭即回收。企业版还支持部署审批与保护环境,生产环境部署需指定角色批准。
支柱五:变量与凭据安全。 变量优先级从高到低为:触发器/定时流水线变量 → 项目变量 → 组变量 → 实例变量 → .gitlab-ci.yml 中定义的变量 → 系统预定义变量(CI_COMMIT_SHA、CI_PIPELINE_ID、CI_REGISTRY_IMAGE 等)。敏感值用「受保护变量」(仅受保护分支/标签可见)与「掩码变量」(日志中自动打码);job 间凭据传递用 CI_JOB_TOKEN,默认只可访问当前项目,跨项目访问需在「设置 → CI/CD → Job token 权限」显式授权。
支柱六:CI/CD 组件与复用。 include 支持 local(同仓库)、project(跨仓库文件)、remote(URL)、template(官方模板)四种引用方式;更进一步是 CI/CD 组件(components),把一组 job/脚本封装成带版本的单元,通过 include: component: gitlab.com/namespace/project/component@版本 引入,适合多项目共享流水线逻辑。
生产部署与监控:从上线到运维
部署方式一:GitLab.com + 自托管 Docker Runner。 团队用官方 SaaS 托管代码,Runner 部署在自己的云主机或内网,适合中小团队快速上线、且对代码托管无合规约束的场景。Runner 机器建议独立于业务机器,按项目打 tag 隔离并发。
部署方式二:Kubernetes 集群 + Runner Helm 部署。 在已有 K8s 集群中使用官方 Helm Chart 部署 Runner,执行器选 kubernetes,job 作为 Pod 由集群调度,按队列自动扩缩。适合已经容器化的中大规模团队,CI 与线上环境共享基础设施、也可用独立节点池隔离。
可观测性。 单条流水线在「构建 → 流水线」/「流水线编辑器」按阶段查看每个 job 的实时日志、时长与退出码;制品文件可在 job 详情页浏览下载。「构建 → CI/CD 分析」聚合仓库维度的流水线平均时长、成功率和失败趋势,适合周会复盘。「项目 → 设置 → Webhooks」把流水线事件推给监控/IM 系统,也可通过 REST API(/projects/:id/pipelines)拉取状态做外部大盘。Runner 自身暴露 Prometheus metrics(默认 9252 端口),可纳入集群监控告警。
<p class="para-label">避坑清单:</p>
<ul class="dash-list"><li>坑 1:rules 与旧式 only/except 混用。两者同时出现时按 GitLab 固定合并规则生效,极易写出「看似生效实则跳过」的 job。官方文档明确推荐只用 rules,旧的 only/except 是遗留语法。</li><li>坑 2:把 cache 当 artifacts 用。cache 只是「尝试恢复」的加速缓存,新 Runner 或缓存被清理时文件不保证存在;跨 job 传递必需文件请用 artifacts + dependencies。</li><li>坑 3:shell executor 跑在共享宿主机。多个项目的 job 在同一台机器、同一文件系统上执行,环境互相污染、权限难隔离且有安全风险。生产至少用 docker executor,最好用 kubernetes。</li><li>坑 4:制品与大镜像不限量保留。artifacts 默认 30 天失效但仍占用存储,频繁构建的镜像仓库会持续膨胀;设置合理的 expire_in(如 1 周)并在容器仓库配置清理策略。</li><li>坑 5:忽略 GIT_STRATEGY 与克隆开销。每次 job 默认全量 clone 仓库,提交频繁时会显著拖慢流水线;改为 fetch(增量拉取)可减少传输,必要时用 shallow clone 控制深度。</li></ul>
helm repo add gitlab https://charts.gitlab.iohelm install gitlab-runner gitlab/gitlab-runner \ --set gitlabUrl=https://gitlab.example.com \ --set runnerRegistrationToken="$RUNNER_REGISTRATION_TOKEN" \ --set rbac.create=true
| 维度 | GitLab CI/CD | GitHub Actions | Jenkins | CircleCI |
|---|---|---|---|---|
| 定位 | 与 GitLab SCM 深度绑定的 CI/CD 平台 | GitHub 仓库原生的 CI/CD | 独立 CI 服务器,通用 SCM/交付 | 云原生 CI/CD 平台(SaaS 为主) |
| 配置方式 | 仓库根目录 `.gitlab-ci.yml`,单文件集中 | `.github/workflows/*.yml`,按事件拆多文件 | `Jenkinsfile`(声明式/脚本式)或自由风格任务 | `.circleci/config.yml` 单文件 |
| 执行单元 | 自托管 Runner,executor 可选 shell/docker/k8s | 托管 runner + 自托管 runner | Controller + Agent 主从架构 | 云执行环境 + 自托管 Runner |
| 编排模型 | stages 串行 + needs 实现 DAG + rules 条件 | jobs + needs,workflow 事件驱动 | 声明式 stage/node 或脚本自由编排 | workflows + jobs + orbs 可复用组合 |
| 生态集成 | GitLab MR/环境/容器仓库/安全扫描内建 | GitHub Action 市场最丰富,社区量大 | 插件生态庞大(1800+),定制能力最强 | orb 市场,云服务集成友好 |
| 生产部署 | 内置 environments、回滚、审批、保护环境 | 内置 environments、审批与保护规则 | 回滚/审批需插件组合,自建成本高 | 内置环境管理与审批,云优先 |
| License | CE(MIT)/ EE(专有,付费功能) | 私有仓库按席位收费,runner 开源 | MIT(自托管免费) | 商业订阅(按席位/用量) |
| 适合谁 | 已用 GitLab 管理代码的中大型团队 | GitHub 重度用户与开源项目 | 离线/受监管环境、存量插件资产团队 | 追求零运维、按量付费的云上团队 |
选型建议:代码已经托管在 GitLab 的团队直接选用 GitLab CI/CD,MR 门禁与部署追踪零成本打通;以 GitHub 为唯一代码平台的选 GitHub Actions,生态最省心;受监管、离线环境或需要深度自定义流水线的选 Jenkins,插件资产是最大护城河;团队小、要快速起步且不想维护 CI 服务器,CircleCI 的 SaaS 模式最合适。四者配置语法互不兼容,迁移需重写流水线,选型应结合未来 2-3 年的代码托管战略一并决策。
版本迭代
GitLab 自 2018 年起按月发布新版本,每年 5 月左右发布一次「00」结尾的年度大版本。近三年主线是:15.x 完善流水线编辑器与 DAG 并行体验,16.x 强化合并请求内验证,17.x 大规模清理遗留语法并推进 CI/CD 组件复用,18.0 延续组件生态并移除到期废弃项。(截至训练数据,18.0 后可能已有更新版本)
| 版本 | 时间 | 变化 | 提升 |
|---|---|---|---|
| 15.0 | 2022-05 | 流水线编辑器正式推出 | 在 UI 中编写、校验、查看 `.gitlab-ci.yml`,显著降低 YAML 配置出错成本 |
| 16.0 | 2023-05 | 合并请求结果流水线 GA | 在 MR 中直接验证「合并后」代码状态,减少合入主干的回归风险 |
| 17.0 | 2024-05 | 年度大版本、配置体系收敛 | 清理到期作废的 CI/CD 接口,规则与变量体系行为更统一、报错更明确 |
| 17.8 | 2025-01 | 流水线编辑器与组件能力增强 | CI/CD 组件引用、编辑器可视化与校验能力持续迭代 |
| 18.0 | 2025-05 | 年度大版本 | 延续 CI/CD 组件生态与流水线编辑器演进,按期移除 17.x 期间到期废弃项 |
GitLab CI/CD 无 MMLU 类公开评测基准,版本差异以功能新增/移除衡量。选型建议:新项目直接采用当前 18.x 并全程使用 rules 语法;存量项目升级前先运行官方升级路径检查,重点处理已废弃的关键字与 API,避免大版本升级后流水线静默失效。
AI 应用场景
场景一:合并请求自动化验证门禁
阶段:持续集成 / 合并门禁(Merge Request Pipeline)
解决的问题:没有自动化验证时,代码合入主干后才暴露构建或测试问题,返工成本高。GitLab CI 在 MR 创建和更新时自动运行测试与静态检查,未通过的 MR 无法合并;合并结果流水线进一步模拟合并后的代码状态,提前发现冲突导致的失败。
具体案例:某后端团队将原先串行的 12 个验证 job 改为 3 层 DAG(每层 4 个并行 job),按官方 needs 并行模型,关键路径理论时长从 12 个 job 串行缩短到 3 个 job 串行(不含排队与资源等待);配合流水线编辑器的 CI Lint 校验,日常 YAML 调试时间下降为改动即校验。
场景二:环境追踪与一键回滚的持续交付
阶段:持续交付 / 部署管理
解决的问题:传统上线靠人肉 SSH 执行,发布记录散落在聊天记录里,出问题只能「凭记忆回滚」。GitLab 的 environment 关键字自动记录每次部署对应的提交、时间与操作者,部署历史与流水线绑定,回滚在界面上一键完成。
具体案例:SRE 团队为生产环境配置保护环境与部署审批,只有指定角色可点击 when: manual 的部署 job;线上故障时通过环境页面的回滚按钮恢复到上一成功部署,部署定位时间从「翻聊天记录」缩短到秒级(UI 点击即查)。
场景三:内置安全扫描作为流水线阶段
阶段:安全 CI / 制品门禁
解决的问题:密钥硬编码、依赖漏洞等问题在代码评审阶段难以人工发现,等上线后被安全团队扫描到往往为时已晚。GitLab 内置 SAST(静态应用安全测试)与 Secret Detection(密钥检测)等安全扫描器,以普通 CI job 形式接入流水线。
具体案例:团队在 MR 流水线中默认追加 Secret Detection job,向仓库推送含明文令牌的代码时,流水线在推送阶段即标记失败并阻止进入受保护分支,将密钥泄露从「事后审计」变为「事前阻断」,安全团队的人工排查工作量显著下降。
常见误区
误区我以为声明了三个 stage,流水线就会一个 stage 一个 stage 顺序跑完,和 Jenkins 的阶段一样。
正解默认模型是「阶段内 job 并行、阶段间串行」,且 needs 可以打破阶段边界:只要直接依赖完成,job 即可开始,不必等整个前序阶段结束,形成 DAG 加速;rules 还能让部分 job 完全不进入流水线。行为差异最终取决于这三个关键字的组合,而不是只看 stages。
为何常见:教程大多先讲「三个 stages」的最简模型,容易让人忽略同 stage 并行和 needs 的存在;实际大仓库流水线几乎没有纯串行的。
误区我在 build 里把编译产物放进了 cache,下一个 job 应该能直接用吧?
正解不能。cache 是 GitLab 尽力拉取的加速缓存,新 Runner、缓存过期或缓存被清理时文件不保证存在,语义上「不要依赖它」。job 间传递必需文件必须用 artifacts(受 dependencies 约束),两者定位一个是「依赖还原加速」,一个是「产物传递」。
为何常见:cache 与 artifacts 的中文译名(缓存/制品)边界模糊,官方文档也常并列出现,初学者极易把二者混为一谈。
误区我只想在某些分支上跑这个 job,用了 `only`,另一处又按官方推荐写了 `rules`,结果 job 有时跑有时不跑。
正解当同一个 job 同时使用 rules 与 only/except 时,GitLab 按固定规则合并两者(only/except 条件与 rules 逻辑并集/交集组合),行为非常隐蔽且难调试。官方文档明确推荐统一使用 rules,它覆盖了 only/except 的全部能力。
为何常见:老教程大量使用 only/except,而新官方文档全面转向 rules,搜索到的新旧资料混着抄就会踩中。
误区Runner 已经装好了,选 shell 最简单,直接在服务器上跑命令多方便。
正解shell executor 在每个 job 里直接操作宿主机,多个项目的 job 共享同一文件系统和系统环境,依赖相互污染、权限难收敛,还有「某 job 把宿主搞挂」的风险。生产环境应使用 docker 或 kubernetes executor,让每个 job 运行在独立容器/Pod 中,环境即代码、可复现。
为何常见:shell executor 配置最少、看起来「零成本」,教程示例又常以 Docker executor 演示但未说明隔离动机,实际踩坑往往在多个项目共用 Runner 之后才暴露。
误区数据库密码、云厂商密钥这种敏感信息,为了方便直接写进 `.gitlab-ci.yml` 的 variables 里。
正解.gitlab-ci.yml 是随仓库版本化的文件,写进去等于把密钥提交进代码库,任何有仓库访问权的人都能看见。敏感值应放在项目/组/实例变量中,启用「受保护变量」(仅受保护分支/标签可用)与「掩码变量」(日志打码),或接入 Vault 等外部密钥系统;跨 job 凭据传递使用最小权限的 CI_JOB_TOKEN。
为何常见:YAML 里写变量「立即可用、所见即所得」,而配置变量体系的入口在设置页深处,新手自然选择抄近路,直到密钥泄露审计时才意识到后果。
面试题
Q1. GitLab CI/CD 的配置文件默认路径与文件名是什么?
- A.
.gitlab-ci.yml,位于仓库根目录← 正确答案 - B.
.github/workflows/ci.yml,位于 .github 目录 - C.
Jenkinsfile,位于仓库根目录 - D.
.circleci/config.yml,位于 .circleci 目录
答案:A。GitLab CI/CD 默认读取仓库根目录下的 .gitlab-ci.yml。B 是 GitHub Actions 的约定,C 是 Jenkins 的约定,D 是 CircleCI 的约定,均为不同工具各自的配置文件。
Q2. 未显式声明 stages 时,GitLab CI 的默认阶段顺序是什么?
- A.build → test → deploy← 正确答案
- B.test → build → deploy
- C.deploy → test → build
- D.build → deploy → test
答案:A。GitLab 的默认阶段是 build、test、deploy,依次执行;同一阶段内的 job 并行运行。声明了 stages 后以声明顺序为准,因此默认顺序常被用作「不声明也符合直觉」的快速起点。
Q3. 关于 needs 关键字的作用,正确的是?
- A.让当前 job 等待流水线中所有其他 job 全部结束后再开始
- B.声明 job 的直接依赖,依赖完成后即可开始,无需等待同阶段其他 job,构成 DAG 加速← 正确答案
- C.用来定义各 stage 的执行顺序
- D.用来指定运行该 job 的 Runner 标签
答案:B。needs 使 job 只等待声明的直接依赖,跳过无关 job,从而把默认的阶段串行模型变成 DAG,显著缩短关键路径。A 是默认 stage 模型的行为,C 是 stages 的职责,D 是 tags 的职责。
Q4. artifacts 与 cache 的核心区别是什么?
- A.artifacts 在 job 间按依赖传递且可下载;cache 用于跨流水线加速依赖还原,不保证传递← 正确答案
- B.两者作用相同,可以互换使用
- C.cache 负责把文件从上个 job 传给下个 job
- D.artifacts 只能用于部署阶段,不能用于测试
答案:A。artifacts 是 GitLab 收集的构建产物,随流水线保存、可下载、按 dependencies 传给后续 job;cache 只是加速依赖安装的「尽力而为」缓存,可能被清理。C 是把 cache 误当传递通道的典型错误。
Q5. 关于 rules 与 only/except,以下说法正确的是?
- A.两者可以随意混用,行为完全等价
- B.官方推荐统一使用 rules,only/except 为遗留语法,混用会产生隐蔽的合并行为← 正确答案
- C.rules 是 only/except 的别名
- D.only/except 只在企业版可用
答案:B。rules 是官方推荐的现代化语法,覆盖 only/except 的能力;两者混用时 GitLab 会按固定规则合并条件,行为难调。A、C 均错误,D 说反了,only/except 所有版本均可用。
Q6. 关于 CI_JOB_TOKEN 的权限范围,正确的是?
- A.可以访问 GitLab 实例上的所有项目和全部 API
- B.默认只能访问当前项目,跨项目访问需在项目设置中显式授权(job token 权限)← 正确答案
- C.只能用于拉取容器镜像,不能调用任何 API
- D.永久有效,可替代个人访问令牌
答案:B。CI_JOB_TOKEN 是最小权限设计,默认仅能操作当前项目的仓库与 API,跨项目访问须在「设置 → CI/CD → Job token 权限」中按项目授权。A、C、D 均超出其真实能力边界,安全实践中应保持其默认最小范围。
Q7. 向 GitLab 实例注册一台新 Runner,应使用哪个命令?
- A.
gitlab-runner register← 正确答案 - B.
gitlab-runner start - C.
gitlab-runner install - D.
gitlab-runner verify
答案:A。gitlab-runner register 是交互式注册命令,需要提供 GitLab URL 与注册令牌并选择执行器。start/install 是系统服务管理,verify 是注册后检查 Runner 在线状态,均不能完成注册。
Q8. 以下哪项属于 GitLab CI 的预定义变量?
- A.
CI_COMMIT_SHA← 正确答案 - B.
CI_PIPELINE_ID - C.
GITHUB_SHA - D.
BUILD_NUMBER
答案:A。GitLab 预定义变量以 CI_ 前缀为主,包括 CI_COMMIT_SHA、CI_PIPELINE_ID 等。GITHUB_SHA 是 GitHub Actions 的变量,BUILD_NUMBER 是 Jenkins 的变量,二者不属于 GitLab CI。
Q9. 以下哪些方式可以触发 GitLab CI 流水线?
- A.向分支推送代码← 正确答案
- B.创建或更新合并请求← 正确答案
- C.按定时计划(Pipeline schedules)运行← 正确答案
- D.修改项目描述
答案:ABC。流水线可由 push、merge_request_event(MR 流水线)、schedule(定时)、api(外部 API 触发)、webhook 等来源触发,对应预定义变量 CI_PIPELINE_SOURCE。修改项目描述不会生成新的提交,也不触发任何流水线,D 错误。
Q10. 以下哪些是 GitLab Runner 支持的执行器(executor)类型?
- A.shell← 正确答案
- B.docker← 正确答案
- C.kubernetes← 正确答案
- D.virtualbox← 正确答案
答案:ABCD。GitLab Runner 官方支持 ssh、shell、docker、docker+machine、docker-windows、parallels、virtualbox、kubernetes、custom 等多类执行器,四个选项均为合法类型。执行器决定 job 的运行环境,生产常用 docker 与 kubernetes 以获得环境隔离。
参考来源
- webpage.gitlab-ci.yml 关键字参考每个配置关键字的语法与示例
- webpageGitLab 官方发布说明每月新功能、变更与升级公告