为何要使用Azure DevOps YAML的extends关键字?
相比直接在stages中引用模板,使用extends关键字主要有以下几个关键优势:
1. 继承顶层流水线配置
使用extends时,模板中的顶层配置项(如trigger、pool、variables、resources等)会被主流水线直接继承。例如,如果你的基础模板定义了公司统一的触发规则、代理池配置,所有继承该模板的流水线无需重复编写这些配置,自动沿用模板设定。而直接引用stages模板时,模板中的顶层配置不会生效,主流水线只能继承模板内的stages内容,顶层配置仍需自行定义。
2. 清晰的基础流水线语义
extends的核心语义是基于一个基础流水线进行扩展,非常适合打造企业级通用流水线模板。比如你可以定义包含标准构建、测试、部署流程的基础模板,各个项目的流水线通过extends继承该模板后,再按需添加或修改专属步骤。这种"父模板+子流水线"的模式,比零散引用stages模板更易维护,语义上也更直观,一眼就能看出该流水线是基于标准流程定制的。
3. 全局参数的统一管理
extends支持在模板顶层定义parameters,主流水线可通过extends块传递参数覆盖默认值,实现全局配置的灵活定制。例如基础模板中默认buildConfiguration: 'Release',项目流水线继承时可传递buildConfiguration: 'Debug'来修改全局构建配置。而直接引用stages模板时,参数只能在引用stages的局部位置传递,无法实现顶层全局参数的统一管控。
4. 顶层元素的自动合并
当主流水线与extends模板包含同名顶层元素(如variables)时,系统会自动合并两者内容,且主流水线的元素优先级更高。比如模板定义var1: 'foo',主流水线定义var2: 'bar',最终流水线会同时拥有这两个变量;若存在同名变量,主流水线的值会覆盖模板的值。而直接引用stages模板时,主流水线的顶层元素与模板内的局部元素(如stages/job内的variables)相互独立,不会自动合并。
内容的提问来源于stack exchange,提问作者Frédéric De Lène Mirouze

