Anchor是YAML原生复用机制,用&定义、*引用,适用于统一规则如only/except、variables、before_script等;不支持变量插值,需定义在引用前,与extends分工明确:Anchor复用字段值,extends复用作业结构。

在 Linux 环境下使用 GitLab CI 时,Anchor(锚点)语法是纯 YAML 层面的复用机制,无需额外工具或插件,直接靠 YAML 解析器支持即可生效。它适合复用结构相同、值一致的配置片段,比如统一的触发条件、环境变量约束或清理逻辑。
Anchor 语法的核心写法
YAML Anchor 使用 & + 名称 定义锚点,用 * + 名称 引用。GitLab Runner(基于 libyaml)完全兼容 YAML 1.2 的 Node Anchors 特性,无需开启特殊选项。
-
定义锚点:在任意合法 YAML 节点前加
&anchor_name -
引用锚点:用
*anchor_name替代整个节点内容,类型和嵌套结构必须完全匹配 - 锚点可跨层级复用,但不能跨文件 —— 若需跨文件复用,请改用
include+extends
典型复用场景与写法示例
以下是在 .gitlab-ci.yml 中高频使用的 Anchor 模式:
生成周报:读取本机 Git 仓库最近一周的提交记录,按项目分类提炼总结,生成标准周报格式,通过微信推送并返回给用户。触发词:周报、weekly report、git总结、提交记录总结、工作周报。
-
统一跳过 MR 合并流水线:
only: &skip_merge_requests- merge_requestsdeploy-prod:script: ./deploy.sh prodexcept: *skip_merge_requests -
共享环境变量约束:
variables_constraint: &env_tag_onlyvariables:- $CI_COMMIT_TAGbuild-linux:script: make linuxrules:- *env_tag_only- if: '$CI_PIPELINE_SOURCE == "schedule"' -
复用 before_script 清理逻辑:
cleanup_steps: &common_cleanup- rm -rf node_modules- rm -f yarn.locktest-unit:before_script: *common_cleanupscript: yarn test:unit
注意事项与避坑点
Anchor 是静态文本复用,不是模板引擎,不支持变量插值或条件展开:
- 不能在锚点内写
$VAR再期望不同引用处动态替换值 —— 所有引用都得到完全相同的字面量 - 锚点定义必须出现在引用之前(YAML 自上而下解析),否则报错
undefined anchor - 不推荐用 Anchor 复用含
script的整段作业 —— 更清晰的做法是用extends抽取可继承的作业模板 - 调试时可用 GitLab 的 CI Lint 工具验证语法,它会原样显示解析后的完整 YAML,便于确认锚点是否正确展开
Anchor 和 extends 的分工建议
两者不互斥,但职责不同:
-
Anchor:复用「字段值」,比如
only、except、variables、rules的某组固定规则 -
extends:复用「作业结构」,比如一组通用的
image、before_script、artifacts配置,再被多个作业继承并微调 - 实际项目中常组合使用:用 Anchor 定义规则片段,再在
extends模板里引用这些片段

















