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 意味着具备把「能跑的代码/模型」变成「可发布、可回滚、可观测的生产服务」的核心交付能力。

目录
  1. 为什么需要 GitLab CI/CD:CI 与 CD 一体化,无需独立 CI 服务器
  2. 安装与环境配置:4 步就绪(GitLab.com 免安装)
  3. 快速上手:10 分钟跑通第一个流水线
  4. 核心能力详解:6 大支柱
  5. 生产部署与监控:从上线到运维
  6. 版本迭代
  7. AI 应用场景
  8. 常见误区
  9. 面试题
  10. 参考来源
工具类型
CI/CD 平台(内置于 GitLab 代码托管平台)
开发商
GitLab Inc.(美国)
开源协议
CE 核心 MIT;EE 功能专有(商业订阅)
主要语言
Ruby(GitLab 主应用)/ Go(GitLab Runner)
当前版本
18.0(2025-05 发布,按月迭代)
安装方式
GitLab.com 免安装;自托管用 Omnibus/Docker/Helm
官方文档
上手难度
★★★☆☆(中等,YAML 规则较多)
适合人群
DevOps/平台工程师、后端团队 CI/CD 负责人、MLOps 工程师
同类工具
GitHub Actions、Jenkins、CircleCI
托管服务
GitLab.com(官方 SaaS,免费与付费档)

速览卡是工具类内容的固定首屏模块: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 的提交触发冒烟流水线。

bash17 行
# 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 行为一致。

yaml25 行
# .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>

bash5 行
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/CDGitHub ActionsJenkinsCircleCI
定位与 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 + 自托管 runnerController + Agent 主从架构云执行环境 + 自托管 Runner
编排模型stages 串行 + needs 实现 DAG + rules 条件jobs + needs,workflow 事件驱动声明式 stage/node 或脚本自由编排workflows + jobs + orbs 可复用组合
生态集成GitLab MR/环境/容器仓库/安全扫描内建GitHub Action 市场最丰富,社区量大插件生态庞大(1800+),定制能力最强orb 市场,云服务集成友好
生产部署内置 environments、回滚、审批、保护环境内置 environments、审批与保护规则回滚/审批需插件组合,自建成本高内置环境管理与审批,云优先
LicenseCE(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.02022-05流水线编辑器正式推出在 UI 中编写、校验、查看 `.gitlab-ci.yml`,显著降低 YAML 配置出错成本
16.02023-05合并请求结果流水线 GA在 MR 中直接验证「合并后」代码状态,减少合入主干的回归风险
17.02024-05年度大版本、配置体系收敛清理到期作废的 CI/CD 接口,规则与变量体系行为更统一、报错更明确
17.82025-01流水线编辑器与组件能力增强CI/CD 组件引用、编辑器可视化与校验能力持续迭代
18.02025-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 的配置文件默认路径与文件名是什么?

单选题 · easy

  • 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 的默认阶段顺序是什么?

单选题 · easy

  • 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 关键字的作用,正确的是?

单选题 · mid

  • 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 的核心区别是什么?

单选题 · mid

  • A.artifacts 在 job 间按依赖传递且可下载;cache 用于跨流水线加速依赖还原,不保证传递← 正确答案
  • B.两者作用相同,可以互换使用
  • C.cache 负责把文件从上个 job 传给下个 job
  • D.artifacts 只能用于部署阶段,不能用于测试

答案:A。artifacts 是 GitLab 收集的构建产物,随流水线保存、可下载、按 dependencies 传给后续 job;cache 只是加速依赖安装的「尽力而为」缓存,可能被清理。C 是把 cache 误当传递通道的典型错误。

Q5. 关于 rules 与 only/except,以下说法正确的是?

单选题 · mid

  • 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 的权限范围,正确的是?

单选题 · hard

  • A.可以访问 GitLab 实例上的所有项目和全部 API
  • B.默认只能访问当前项目,跨项目访问需在项目设置中显式授权(job token 权限)← 正确答案
  • C.只能用于拉取容器镜像,不能调用任何 API
  • D.永久有效,可替代个人访问令牌

答案:B。CI_JOB_TOKEN 是最小权限设计,默认仅能操作当前项目的仓库与 API,跨项目访问须在「设置 → CI/CD → Job token 权限」中按项目授权。A、C、D 均超出其真实能力边界,安全实践中应保持其默认最小范围。

Q7. 向 GitLab 实例注册一台新 Runner,应使用哪个命令?

单选题 · mid

  • 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 的预定义变量?

单选题 · mid

  • 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 流水线?

多选题 · hard

  • A.向分支推送代码← 正确答案
  • B.创建或更新合并请求← 正确答案
  • C.按定时计划(Pipeline schedules)运行← 正确答案
  • D.修改项目描述

答案:ABC。流水线可由 push、merge_request_event(MR 流水线)、schedule(定时)、api(外部 API 触发)、webhook 等来源触发,对应预定义变量 CI_PIPELINE_SOURCE。修改项目描述不会生成新的提交,也不触发任何流水线,D 错误。

Q10. 以下哪些是 GitLab Runner 支持的执行器(executor)类型?

多选题 · easy

  • 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 以获得环境隔离。

参考来源