gitlab - 在 Gitlab 管道中的条件手动阶段之后运行阶段
问题描述
我正在尝试运行一个管道,其中最后阶段取决于前一个阶段,其作业是有条件的和手动的。
我做了这个例子 .gitlab-ci.yml 来证明这一点。我正在处理三个阶段:
stages:
- test
- publish
- create tag
测试阶段有一项工作
# Tests Stage
run tests:
stage: test
script:
- run the tests
Publish 阶段的三个作业,都是手动的,仅在某些文件发生更改时才存在
.publish:
stage: publish
script:
- publish x
rules:
- changes:
- $DIR/**/*
when: manual
# Publish Stage
publish package a:
variables:
DIR: a
extends:
- .publish
publish package b:
variables:
DIR: b
extends:
- .publish
publish package c:
variables:
DIR: c
extends:
- .publish
最后是创建标签阶段,我只想在其中一个发布作业完成后运行。
# Create Tag Stage
create tag with all packages:
stage: create tag
script:
- git tag
通常我可以needs
用来使 Create Tag 作业依赖于发布作业。但是,例如,如果我只在 a/ 目录中进行更改,我将收到以下错误,因为只存在“发布包 a”:
needs:
- "publish package a"
- "publish package b"
- "publish package c"
我真正想要的是
needs:
- "publish package a" if exists
- "publish package b" if exists
- "publish package c" if exists
但据我所知,没有这样的事情。只有在 Publish 阶段的现有作业完成后,我才能运行 Create Tags 作业?
解决方案
您正在寻找的是Optional Needs
在 13.10 版本中引入了功能标志,并在 14.0 中被提升(可在没有功能标志的情况下使用)。这使您可以从事这样的工作:
build:
stage: build
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
rspec:
stage: test
needs:
- job: build
optional: true
在此示例中,build
作业仅在管道用于分支(而不是标签、合并请求等)并且分支名称与项目的默认分支相同时运行。如果不是这种情况,则根本不会将这个作业添加到管道中,因此我们需要确保我们的needs
forrspec
作业是可选的。
通过将optional: true
属性添加到我们的needs
数组中,我们告诉 Gitlab 该rspec
作业需要该build
作业(如果存在)。
因此,对于您的示例:
stages:
- test
- publish
- create tag
# Tests Stage
run tests:
stage: test
script:
.publish:
stage: publish
script:
- publish x
rules:
- changes:
- $DIR/**/*
when: manual
# Publish Stage
publish package a:
variables:
DIR: a
extends:
- .publish
publish package b:
variables:
DIR: b
extends:
- .publish
publish package c:
variables:
DIR: c
extends:
- .publish
# Create Tag Stage
create tag with all packages:
stage: create tag
needs:
- job: "publish package a"
optional: true
- job: "publish package b"
optional: true
- job: "publish package c"
optional: true
script:
- git tag
此功能在问题 30680中引入。
推荐阅读
- r - 其他变量条件下的第一个和最后一个非缺失时间点的值。条件合并 (dplyr)
- amazon-web-services - 部署不在 nodeSelector Kubernetes 中
- android - 参数类型“void Function(GoogleMapController)”不能分配给参数类型“void Function()”
- bash - curl:(3) URL 使用错误/非法格式或缺少 URL Bash 脚本
- flutter - 加载信息的时间延迟颤振火力基地
- c# - 按下播放按钮时 Unity 冻结
- import - 从 psql 中提取数据时,Sqoop 导入作业失败
- javascript - 谁能告诉我我做错了什么
- vue.js - 如何在 vue-test-utils 和 jest 中模拟 $nuxt 对象
- python - C和Python中的浮点数问题