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

这样,我就可以避免 触发因素 的并发症。如果需要,请索取完整代码。