【问题标题】:GitLab-CI job fail when having a dependency on a previous manual job依赖于以前的手动作业时,GitLab-CI 作业失败
【发布时间】:2017-03-09 08:12:29
【问题描述】:

情况

考虑以下.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 也不会被触发,从而导致 deploy-doc 作业失败。

问题

如何正确实现此行为?即,当 自动 作业依赖于他时,会触发手动作业?

上下文

我只想自动构建master分支部署doc,其他分支只能手动构建doc下载生成的doc。

解决方案

在已接受答案的附录中,请参阅我自己的答案 below

【问题讨论】:

    标签: continuous-integration gitlab gitlab-ci


    【解决方案1】:

    最简单的方法是使用trigger。将deploy-doc 作业定义为:

    only:
      - triggers
    

    使用 yaml 锚点复制两份 build-doc 一份声明为

    only:
      - master
    

    另一个是

    when:
      - manual
    

    build-doc 在触发器结束时调用它。这将重建整个管道,因此您可以将 build 作业定义为

    except:
      - triggers
    

    或者使用$CI_JOB_MANUAL 变量并让deploy-doc 仅在master 和触发器上运行,因此至少在master 上它不会重建所有内容。

    【讨论】:

    • 嗨@Jakub,是否可以使用阶段名称而不是工作名称来使工作依赖于另一个工作?也就是说,我可以使用“build”而不是使用“build-doc”吗?谢谢。
    • @VibhavChaddha 我不确定您在问什么以及它与这个问题的关系。但是,只有在上一阶段完成后,下一阶段的工作才会继续,所以我认为您不必更改任何内容。
    • 很抱歉,但我也将其作为一个单独的问题提出。我希望这可以帮助您更好地理解它。谢谢。 stackoverflow.com/questions/69278440/…
    【解决方案2】:

    感谢 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
    

    这样,我可以避免 triggers 的复杂性。如果需要,请索取完整代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 2021-01-14
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      相关资源
      最近更新 更多