【问题标题】:Running a stage after conditional manual stage in a Gitlab pipeline在 Gitlab 管道中的条件手动阶段之后运行阶段
【发布时间】:2021-12-07 07:33:30
【问题描述】:

我正在尝试运行一个管道,其中最后阶段取决于前一个阶段,其中的作业是有条件的手动的。

我做了这个例子 .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 使 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

但据我所知,没有这样的事情。 只有在发布阶段的现有作业完成后才能运行创建标签作业?

【问题讨论】:

    标签: gitlab gitlab-ci gitlab-pipelines


    【解决方案1】:

    您要查找的是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 作业仅在管道用于分支(而不是标签、合并请求等)并且分支名称与项目的默认分支相同时运行。如果不是这种情况,则该作业根本不会添加到管道中,因此我们需要确保 needsrspec 作业是可选的。

    通过将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 中引入的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-26
      • 2016-11-19
      • 2021-03-25
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多