我们可以使用阶段名称而不是作业名称来使作业依赖于 .gitlab-ci.yml 文件中的另一个作业吗?

2023-11-22

是否可以使用阶段名称而不是作业名称来使一个作业依赖于另一个作业?

stages:
  - build
  - deploy
  - tests

build-job:
  stage: build

deploy-feature:
  stage: deploy
  except:
    - master
  when: manual

deploy-prod:
  stage: deploy
  only:
    - master
  when: manual

test-cases:
  stage: tests
  dependencies: deploy-feature

也就是说,我可以不使用“deploy-feature”来使用“deploy”来使测试用例作业同时依赖于deploy-feature和deploy-prod作业吗?我知道它在依赖项中不起作用,但是还有其他可以使用的东西吗?

P.S.我的动机是仅在任何一个部署功能或部署产品作业成功后才运行我的测试用例作业。目前,我的“部署”作业是手动的,而“测试”作业不是手动的,因此我的“测试用例”作业会提前执行。 我也可以在测试用例作业中执行“when:manual”,并且可以在部署作业后手动运行它,但对我来说,这感觉像是一种解决方法,而不是解决方案。 我有大约 17 个“测试”工作,因此为每个测试用例工作分配 2 个不同的工作也不是一个可行的想法。

Edit:尽管我已经接受了答案,但即使如此,如果有人有更多要添加的内容或任何不同的解决方案,请分享。


从 GitLab 14.3 开始,不,您不能在任何keywords您可以在其中使用作业名称,但是听起来您的主要问题是您的test-cases作业在任一之前开始deploy-feature or deploy-prod结束。这是因为手动作业与处于待处理状态的作业的处理方式不同,因此手动作业之后的阶段中的作业可以在到达该阶段、运行程序可用时立即启动,或者needs都满足了。

您可以使用以下命令控制此行为needs关键词。

stages:
  - build
  - deploy
  - tests

build-job:
  stage: build

deploy-feature:
  stage: deploy
  rules:
    - if: $CI_COMMIT_REF_NAME == 'main'
      when: never
  when: manual

deploy-prod:
  stage: deploy
  rules:
    - if: $CI_COMMIT_REF_NAME == 'main'
      when: manual

feature-test-cases:
  stage: tests
  rules:
    - if: $CI_COMMIT_REF_NAME == 'main'
      when: never
  needs: ['deploy-feature']

prod-test-cases:
  stage: tests
  rules:
    - if: $CI_COMMIT_REF_NAME == 'main'
      when: manual
  needs: ['deploy-prod']

这与您问题中的示例略有不同,因为我们将test-cases将工作分为两个,一个用于“功能”分支,另一个用于'main'。可以使用单个test-cases作业并让它“需要”两个部署作业,但两者都必须完成,鉴于我们的规则集(基于您对only and except:我们不能有一个分支不是main and be main在同一管道中)。

我改变的一件事是交换only and except for rules。规则给了我们更多的灵活性,因为我们可以定义实际的if条件与 OR 和 AND 一起使用,我们可以定义具有不同结果的多个条件。例如,一个结果可能是when: always, 其他when: manual,以及最后一个when: never都在同一份工作中。另请注意,根据docs:

*only* and *except* are not being actively developed. *rules* is the preferred keyword to control when to add jobs to pipelines.

当使用这样的规则时,它不仅控制作业何时或为何手动或不手动,还控制哪些作业位于管道实例中。例如,对于deploy阶段,因为我们不能拥有main和“非主要”在一个管道中,只有一个部署作业将位于单个管道实例中。因此,如果我们的test-cases如果作业“需要”两个部署作业,则它会在运行时失败,因为它找不到一个或另一个部署作业。所以我们必须有一个test-case两条管道路径的作业。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我们可以使用阶段名称而不是作业名称来使作业依赖于 .gitlab-ci.yml 文件中的另一个作业吗? 的相关文章

随机推荐