运行 Gitlab 管道中条件手动阶段之后的一个阶段
Running a stage after conditional manual stage in a Gitlab pipeline
我正在尝试 运行 一个管道,其中最后阶段取决于前一个阶段,该阶段的作业是有条件的 和 手动。
我做了这个例子 .gitlab-ci.yml 来证明这一点。我正在处理三个阶段:
stages:
- test
- publish
- create tag
有一个工作在测试阶段
# Tests Stage
run tests:
stage: test
script:
- run the tests
发布阶段的三个作业,都是手动的,只有在某些文件发生变化时才会存在
.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
使创建标签作业依赖于发布作业。但是,例如,如果我只在 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
但据我所知还没有这样的。只有当 发布阶段的现有作业已完成时,我才能运行 创建标签作业?
您要查找的是 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
作业仅在管道用于分支(而不是标记、合并请求等)并且分支名称与项目的默认分支相同时运行.如果不是这种情况,则此作业根本不会添加到管道中,因此我们需要确保 rspec
作业的 needs
是可选的。
通过将 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
此功能是在 Issue 30680 中引入的。
我正在尝试 运行 一个管道,其中最后阶段取决于前一个阶段,该阶段的作业是有条件的 和 手动。
我做了这个例子 .gitlab-ci.yml 来证明这一点。我正在处理三个阶段:
stages:
- test
- publish
- create tag
有一个工作在测试阶段
# Tests Stage
run tests:
stage: test
script:
- run the tests
发布阶段的三个作业,都是手动的,只有在某些文件发生变化时才会存在
.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
使创建标签作业依赖于发布作业。但是,例如,如果我只在 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
但据我所知还没有这样的。只有当 发布阶段的现有作业已完成时,我才能运行 创建标签作业?
您要查找的是 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
作业仅在管道用于分支(而不是标记、合并请求等)并且分支名称与项目的默认分支相同时运行.如果不是这种情况,则此作业根本不会添加到管道中,因此我们需要确保 rspec
作业的 needs
是可选的。
通过将 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
此功能是在 Issue 30680 中引入的。