首页 > 解决方案 > 在 Gitlab 管道中的条件手动阶段之后运行阶段

问题描述

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

我做了这个例子 .gitlab-ci.yml 来证明这一点。我正在处理三个阶段:

stages:
    - test
    - publish
    - create tag

测试阶段有一项工作

# Tests Stage
run tests:
    stage: test
    script:
        - run the tests

Publish 阶段的三个作业,都是手动的,仅在某些文件发生更改时才存在

.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

但据我所知,没有这样的事情。只有在 Publish 阶段的现有作业完成后,我才能运行 Create Tags 作业?

标签: gitlabgitlab-cigitlab-pipelines

解决方案


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

通过将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

此功能在问题 30680中引入。


推荐阅读