我们是否可以使用阶段名称而不是作业名称来使作业依赖于.gitlab-ci.yml文件中的另一个作业? [英] Can we use a stage name instead of a job name to make a job dependent on another job in .gitlab-ci.yml file?

查看:12
本文介绍了我们是否可以使用阶段名称而不是作业名称来使作业依赖于.gitlab-ci.yml文件中的另一个作业?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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&Quot;来使测试用例作业同时依赖于Deploy-Feature和Deploy-Prod作业,而不是使用&Quot;Deploy-Feature&Quot;呢?我知道它在依赖项中不起作用,但是有没有其他东西可以起作用?

附注:我的动机是仅在任何一个Deploy-Feature或Deploy-Prod作业成功之后才运行我的测试用例作业。与目前一样,我的&q;部署&q;作业是手动的,而&q;测试&q;作业不是这样的,因此我的&q;测试用例&作业不会事先执行。 我也可以在我的测试用例工作中执行手动(&QOOT;WHEN),并且可以在部署作业之后手动运行它,但对我来说,这感觉像是一种变通办法,而不是解决方案。 而且我大约有17个测试工作,所以每个测试用例工作有两个不同的工作也不是一个可行的想法。

编辑:虽然我已接受答案,但即使是这样,如果有人有更多要添加的内容或任何不同的解决方案,请务必分享。

推荐答案

从GitLab 14.3开始,不能在可以使用作业名称的任何keywords中使用阶段,但是听起来您的主要问题是您的test-cases作业在deploy-featuredeploy-prod完成之前开始。这是因为手动作业与处于挂起状态的作业的处理方式不同,因此只要到达阶段、运行人员可用或needs满足条件,手动作业之后的阶段作业就可以立即启动。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作业分为两个,一个用于‘Feature’分支,另一个用于'main'。可以使用单个test-cases作业并同时部署该作业和部署作业,但必须同时完成这两个作业,这在我们的规则集内是不可能的(这基于您对onlyexcept的使用:我们不能让一个分支既不是main又是main在同一管道中)。

我更改的一件事是将onlyexcept交换为rules。规则给了我们更大的灵活性,因为我们可以定义实际的if条件以及OR的AND和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和¬-main";,所以在单个管道实例中只有一个部署作业。因此,如果test-cases作业&需要&两个部署作业,它将在运行时失败,因为它找不到其中一个部署作业。因此,两个管道路径都必须有一个test-case作业。

这篇关于我们是否可以使用阶段名称而不是作业名称来使作业依赖于.gitlab-ci.yml文件中的另一个作业?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆