是否可以使用阶段名称而不是作业名称来使一个作业依赖于另一个作业?
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
Run Code Online (Sandbox Code Playgroud)
也就是说,我可以不使用“deploy-feature”来使用“deploy”来使测试用例作业同时依赖于deploy-feature和deploy-prod作业吗?我知道它在依赖项中不起作用,但是还有其他可以使用的东西吗?
PS我的动机是仅在任何一个部署功能或部署产品作业成功后才运行我的测试用例作业。目前,我的“部署”作业是手动的,而“测试”作业不是手动的,因此我的“测试用例”作业会提前执行。我也可以在测试用例作业中执行“when:manual”,并且可以在部署作业后手动运行它,但对我来说,这感觉像是一种解决方法,而不是解决方案。我有大约 17 个“测试”工作,因此为每个测试用例工作分配 2 个不同的工作也不是一个可行的想法。
编辑:虽然我已经接受了答案,但即使如此,如果有人有更多要添加的内容或任何不同的解决方案,请分享。
从 GitLab 14.3 开始,不,您不能在任何可以使用作业名称的关键字中使用阶段,但是听起来您的主要问题是您的test-cases作业在任一deploy-feature或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']
Run Code Online (Sandbox Code Playgroud)
这与您问题中的示例略有不同,因为我们将作业分为test-cases两部分,一个用于 'feature' 分支,另一个用于'main'。可以使用单个test-cases作业并让它“需要”两个部署作业,但这两个作业都必须完成,鉴于我们的规则集(基于您对onlyand的使用)这是不可能的except:我们不能有main分支不在同main一个管道中)。
我改变的一件事是 swaponly和exceptfor rules。规则为我们提供了更大的灵活性,因为我们可以定义实际if条件以及 OR 和 AND,并且可以定义具有不同结果的多个条件。例如,一个结果可能是when: always,另一个结果是when: manual,最后一个结果when: never都在同一份工作中。另请注意,根据文档:
*only* and *except* are not being actively developed. *rules* is the preferred keyword to control when to add jobs to pipelines.
Run Code Online (Sandbox Code Playgroud)
当使用这样的规则时,它不仅控制作业何时或为何手动或不手动,还控制哪些作业位于管道实例中。例如,对于阶段deploy,由于我们不能main在一个管道中拥有“非主”,因此单个管道实例中将只有一个部署作业。因此,如果我们的test-cases作业“需要”两个部署作业,则它会在运行时失败,因为它找不到一个或另一个部署作业。因此,我们必须test-case为两条管道路径分配一份工作。
| 归档时间: |
|
| 查看次数: |
5391 次 |
| 最近记录: |