当另一个作业包含“仅”时,在管道中显示 GitLab 作业

Posted

技术标签:

【中文标题】当另一个作业包含“仅”时,在管道中显示 GitLab 作业【英文标题】:Show GitLab job in the pipeline when another job contains 'only' 【发布时间】:2022-01-20 00:54:06 【问题描述】:

我需要设置.gitlab-ci.yml 管道,以便在任何地方都执行一些作业(没有 only 和 except),而有些作业(例如 Deploy 步骤)仅在 master 分支上执行。但是当我添加到 Deploy only: 时,如果没有为它们指定 only: 属性,我的其他作业将变得不可见。例如 - Test 作业将到处隐藏。

有没有办法配置 GitLab 以在任何地方显示测试作业而无需仅/除了配置?

---
stages:
  - Tests
  - Build
  - Deploy

Test:
  stage: Tests

Build:
  stage: Build
  only:
    - master
    - merge_requests

Deploy:
  stage: Deploy
  only:
    - master

管道中所需的作业可见性:

工作分支(和任何其他管道):Tests 合并请求:Tests, Build 主分支:TestsBuildDeploy

【问题讨论】:

【参考方案1】:

您观察到的行为是由于为您的项目创建了合并请求的管道。

您正在观察的缺少作业的管道是合并请求管道。只有only: - merge_requests 的作业才会在合并请求管道中运行。

您会注意到在您的管道列表中有一个分支管道,它可能或多或少地按照您的预期运行。但是,此管道不会显示在合并请求 UI 中——在 MR UI 中,仅考虑合并请求管道

要解决此问题,您可以将以下内容添加到测试作业:

Test:
  # ...
  only:
    - pushes
    - schedules
    - api
    - web
    - triggers
    - merge_requests # enable pipelines for merge requests

或者更简单地使用rules:

Test:
  rules: # enable pipelines for merge requests
    - when: on_succes

如果您想继续使用管道进行合并请求并避免在测试作业中使用only/except,则需要改用rules:。使用管道进行合并请求时,无法避免以某种方式为此配置测试作业。

或者,您可以避免配置Test 作业,如果您可以避免合并请求功能的管道并使用rules:(或等效的only/except)来获得您想要的行为,但有一些注意事项.

include: # disable pipelines for merge requests
  - template: 'Workflows/Branch-Pipelines.gitlab-ci.yml'

Test:
  stage: test
  # ...

Build:
  rules: # run when merge requests are open
    - if: $CI_OPEN_MERGE_REQUESTS
      when: on_success
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      when: on_success  # run when on default branch
    - when: never # otherwise, do not run

Deploy:
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      when: on_success
    - when: never

注意事项:要捕获CI_OPEN_MERGE_REQUESTS 规则,合并请求必须在管道启动之前存在,或者必须在创建 MR 后触发。这显然也排除了使用合并请求管道功能。

【讨论】:

谢谢。它真的很有帮助。现在我使用only: 的组合 - 用于导入的作业,rules: 与我自己的作业的变量。

以上是关于当另一个作业包含“仅”时,在管道中显示 GitLab 作业的主要内容,如果未能解决你的问题,请参考以下文章

如何顺序运行Azure管道生成

如何让 Gitlab CI 管道始终运行一些作业,而其他作业仅在合并请求上运行?

当另一个任务完成时Linux计划任务

Webi - 当另一列值为空时隐藏中断中的列

当另一个视图控制器显示在它上面时,UIPresentationController 会改变大小

如何在jenkins中启动另一个作业时获取内部错误消息