GitLab-CI 作业在依赖于以前的手动作业时失败
GitLab-CI job fail when having a dependency on a previous manual job
情况
考虑以下 .gitlab-ci.yml
示例:
build:
stage: build
script: echo "Building..."
build-doc:
stage: build
when: manual
script:
- echo "Building doc..."
- echo "build result" > output.txt
artifacts:
name: "%CI_BUILD_NAME%_%CI_BUILD_ID%"
expire_in: 1 week
paths:
- "output.txt"
deploy-doc:
stage: deploy
only:
- master
dependencies:
- build-doc
script:
- echo "Deploying doc..."
- type output.txt
结果
这条管道在 master
分支上的结果是:
deploy-doc
作业的日志显示:
$ echo "Deploying doc..."
"Deploying doc..."
$ type output.txt
The system cannot find the file specified.
ERROR: Build failed: exit status 1
结论
即使 deploy-doc
明确依赖于手动 build-doc
作业工件,build-doc
也不会被触发导致 [=15= 失败] 工作。
问题
我怎样才能正确地实现这个行为?也就是说,当 自动 作业依赖于他时,手动作业会被触发?
上下文
我只想在master
分支自动构建和部署文档,其他分支只能手动构建文档来下载生成的文档。
解决方案
在已接受答案的附录中,请参阅我自己的答案 。
最简单的方法是使用 trigger。将 deploy-doc
作业定义为:
only:
- triggers
使用yaml anchors做两份build-doc
一份声明为
only:
- master
另一个为
when:
- manual
让 build-doc
在结束时调用触发器。这将重建整个管道,因此您可以将 build
作业定义为
except:
- triggers
或者使用 $CI_JOB_MANUAL
变量并且只在 master 和触发器上使用 deploy-doc
运行 所以至少在 master 上它不会重建所有东西。
感谢 Jackub Kania 的回答,它为我指明了正确的方向,我最终使用 yaml 锚点来解决我的问题。
我只是将实际的 build-doc
修改为 .build-doc-template
锚定作业(只是删除了 manual
条件)并创建了两个版本的 build-doc
作业,如下所示:
build-doc:
<<: *build-doc-template
only:
- master
build-doc-manual:
<<: *build-doc-template
when: manual
except:
- master
这样,我就可以避免 触发因素 的并发症。如果需要,请索取完整代码。
情况
考虑以下 .gitlab-ci.yml
示例:
build:
stage: build
script: echo "Building..."
build-doc:
stage: build
when: manual
script:
- echo "Building doc..."
- echo "build result" > output.txt
artifacts:
name: "%CI_BUILD_NAME%_%CI_BUILD_ID%"
expire_in: 1 week
paths:
- "output.txt"
deploy-doc:
stage: deploy
only:
- master
dependencies:
- build-doc
script:
- echo "Deploying doc..."
- type output.txt
结果
这条管道在 master
分支上的结果是:
deploy-doc
作业的日志显示:
$ echo "Deploying doc..."
"Deploying doc..."
$ type output.txt
The system cannot find the file specified.
ERROR: Build failed: exit status 1
结论
即使 deploy-doc
明确依赖于手动 build-doc
作业工件,build-doc
也不会被触发导致 [=15= 失败] 工作。
问题
我怎样才能正确地实现这个行为?也就是说,当 自动 作业依赖于他时,手动作业会被触发?
上下文
我只想在master
分支自动构建和部署文档,其他分支只能手动构建文档来下载生成的文档。
解决方案
在已接受答案的附录中,请参阅我自己的答案
最简单的方法是使用 trigger。将 deploy-doc
作业定义为:
only:
- triggers
使用yaml anchors做两份build-doc
一份声明为
only:
- master
另一个为
when:
- manual
让 build-doc
在结束时调用触发器。这将重建整个管道,因此您可以将 build
作业定义为
except:
- triggers
或者使用 $CI_JOB_MANUAL
变量并且只在 master 和触发器上使用 deploy-doc
运行 所以至少在 master 上它不会重建所有东西。
感谢 Jackub Kania 的回答,它为我指明了正确的方向,我最终使用 yaml 锚点来解决我的问题。
我只是将实际的 build-doc
修改为 .build-doc-template
锚定作业(只是删除了 manual
条件)并创建了两个版本的 build-doc
作业,如下所示:
build-doc:
<<: *build-doc-template
only:
- master
build-doc-manual:
<<: *build-doc-template
when: manual
except:
- master
这样,我就可以避免 触发因素 的并发症。如果需要,请索取完整代码。