仅限 Gitlab CI:不能按预期使用锚点和 .extends

Posted

技术标签:

【中文标题】仅限 Gitlab CI:不能按预期使用锚点和 .extends【英文标题】:Gitlab CI only: does not work as expected with anchors and .extends 【发布时间】:2022-01-19 13:19:29 【问题描述】:

我目前正在使用 Gitlab-CI,但遇到了奇怪的行为。

我目前正在尝试这样的事情:

.when-to-use: &WhenToUse
 - merge_requests
 - master
 - main
 - develop
 - /.*/
 - tags

job1:
  only:
    *WhenToUse
    variables: [ $JACOCO == "true" ]

我的预期行为是,唯一的块包含 WhenToUse 列表以及变量块。

无论我如何尝试它都不起作用(如果有人知道我如何做到这一点,那将非常感激)但这实际上并不是我发现的奇怪行为。

然后我将此 .yml 更改为:

.when-to-use: &WhenToUse
  - merge_requests
  - master
  - main
  - develop
  - /.*/
  - tags


.testWrapper:
  stage: test
  only:
    *WhenToUse

job1:
  extends: .testWrapper

job2:
  extends: .testWrapper
  only: 
    variables: [ $JACOCO == "true" ]

现在根据这个documentation,这应该会导致行为,job1s only: 包含.whenToUse 列表(它确实如此),job2s only: 包含.whenToUse 列表(它没有)+ variables: [ $JACOCO == "true" ](确实如此),这意味着它实际上并没有被扩展而是被覆盖。

有谁知道为什么会发生这种行为,甚至可能如何解决它?

缩进都是正确的,因为管道已执行,但与我预期的方式不同。

【问题讨论】:

【参考方案1】:

事实证明,问题在于我在技术上覆盖了only

问题的解决方法如下:

.when-to-use: &WhenToUse
  - merge_requests
  - master
  - main
  - develop
  - /.*/
  - tags


.testWrapper:
  stage: test
  only:
    refs:
      *WhenToUse

job1:
  extends: .testWrapper

job2:
  extends: .testWrapper
  only: 
    variables: [ $JACOCO == "true" ]

添加refs:(我认为无论如何都是正确的方法)意味着没有任何部分被覆盖并且检查都正确执行。

【讨论】:

以上是关于仅限 Gitlab CI:不能按预期使用锚点和 .extends的主要内容,如果未能解决你的问题,请参考以下文章

按文件gitlab-CI通过CI亚军

如何使用 GITLAB 功能标志在 CI yml 文件中按顺序运行同一阶段的作业

gitlab ci 不能在脚本中使用变量

关于gitlab ci在include中使用变量

PS钢笔工具尖角锚点和圆角锚点的区别

如何在Gitlab CI脚本中删除符号链接的目标?