如何 运行 gitlab 中的特定作业 CI

How to run a specific job in gitlab CI

我们面临一个问题,我们需要 运行 在 gitlab CI 中完成一项特定的工作。我们目前不知道如何解决这个问题。我们在 .gitlab-ci.yml 中定义了多个作业,但我们只需要 运行 管道中的一个作业。我们怎么能只 运行 一份工作呢? job1 还是 job2?我们不能在我们的环境中使用 tagsbranches 作为软件开关。

.gitlab-ci.yml:

before_script:
  - docker info

job1:
  script:
    - do something

job2:
  script:
    - do something

只需在您不想 运行 的工作中添加 when: manual

这些作业仍会出现在您的管道中,但不会 运行,除非有人 "manually" 通过 Web 界面启动它们,因此得名。

有关此内容的更多信息:https://docs.gitlab.com/ce/ci/yaml/README.html#when

如果您正在寻找更多 "programmable",假设 运行 job1job2 取决于分支名称或标签,那么您应该查看 onlyexcept 关键字:https://docs.gitlab.com/ce/ci/yaml/README.html#only-and-except

我们过去也遇到过同样的问题,现在与您分享我们的解决方案。

#备注#

  • 我看了Jawad的回答,我觉得很好,我们遇到问题的时候也试过了。
  • 我的意见是添加 when: manual 将始终显示管道中的所有工作。
  • 因此,如果您在大型团队中工作,则无法阻止其他协作者误点击或误点击您不想启动的工作。

#继续之前我的假设#

  • 假设您有 4 份工作。
  • 您需要始终 运行(手动或自动)job 1job 2job 4 但不是 job3.
  • 您只想在特定情况下 运行 job 3 或者当您决定 运行 时

#思路是#

  • 我们仅针对匹配正则表达式的标签启动第 3 个作业。

  • 在下面的示例中,它针对 helloTag.1helloTag.2helloTag.3...等标签启动

  • 如果我们在developmaster(或其他分支),我们将有3个阶段(阶段1,阶段2,阶段4)

    请注意管道中不存在第 3 个作业

  • 转到“存储库”-->“标签”-->“新标签”

    给标签起一个符合正则表达式的名字

  • 如果我们在名称以“helloTag.”开头的标签中,我们将有 1 个阶段(阶段 3)

    请注意此处未显示其他阶段

#.gitlab-ci 文件的例子#

stages:
    - myStage1
    - myStage2
    - myStage3
    - myStage4

This is my first stage:
    stage: myStage1
    before_script:
        - echo "my stage 1 before script"
    script:
         - echo "my stage 1 script"
    except:
        - /^helloTag.*$/

This is my second stage:
    stage: myStage2
    before_script:
        - echo "my stage 2 before script"
    script:
         - echo "my stage 2 script"
    except:
        - /^helloTag.*$/

This is my third stage:
    stage: myStage3
    before_script:
        - echo "my stage 3 before script"
    script:
         - echo "my stage 3 script"
    only:
        - /^helloTag.*$/

This is my fourth stage:
    stage: myStage4
    before_script:
        - echo "my stage 4 before script"
    script:
         - echo "my stage 4 script"
    except:
        - /^helloTag.*$/

希望对您有所帮助。

> 目前,GitLab CI 似乎无法使用其他答案中提供的 tagsbranches 以外的其他软件开关。

由于 GitLab CI 的限制太多,我们最终切换到另一个 "real" CI。 GitLab CI 如果你想 运行 在不同的过程中进行一些自定义作业,那么 GitLab CI 是不灵活的。我真的很感激这里的两个答案。我相信他们会帮助其他用户管理这些东西。不幸的是,在我们的例子中,我们无法使用 tagscommit messagesbranches 作为软件开关。

我们仍在寻找这方面的答案。请随意提供其他方法来解决此问题。一旦命中,我会标记正确答案。此外,关于这个问题的悬赏也没有得到正确的答案。

您可以使用 gitlab variable expression 和 only/except 如下所示,然后根据需要将变量传递到管道执行中。

此示例默认为 运行 两个作业,但如果为“firstJobOnly”传递 'true',则它仅运行第一个作业。

旧方法 -- (从 gi​​tlab 13.8 开始仍然有效) - only/except

variables:
  firstJobOnly: 'false'

before_script:
  - docker info

job1:
  script:
    - do something

job2:
  script:
    - do something
  except:
    variables:
      - $firstJobOnly =~ /true/i

更新方法 - rules

虽然上面的方法仍然有效,但现在最好的方法是使用 rules 语法。下面是一个类似于我的原始回复的简单示例。

如果您探索规则语法中的选项,根据具体的项目限制,可以通过多种方式实现。

variables:
  firstJobOnly: 'false'

job1:
  script: 
    - do something

job2:
  script: 
    - do something
  rules:
    - if: '$firstJobOnly == "true"'
      when: never
    - when: always

原来的问题问的是如何在不使用 branch-names 或标签的情况下触发作业。这使得提交消息和环境变量成为可行的来源,并且不需要为每次推送编辑您的 yaml 文件。

提交消息

根据我的经验,使用正则表达式提交消息的作业规则是一个非常简单灵活的解决方案。

  1. 像这样设置你的 .gitlab-ci.yml
job1:
  ...
  rules:
    - if: '
      $CI_COMMIT_MESSAGE =~ /.*run job1.*/ ||
      $CI_COMMIT_MESSAGE =~ /.*run all.*/
      '

job2:
  ...
  rules:
    - if: '
      $CI_COMMIT_MESSAGE =~ /.*run job2.*/ ||
      $CI_COMMIT_MESSAGE =~ /.*run all.*/
      '
  1. 使用这样的提交消息推送
git commit --allow-empty -m "testing conditional job triggers for gitlab-ci based on branch names and commit messages. run job1"
git push

您会注意到这还允许您运行 两个作业都带有这样的消息

git commit --allow-empty -m "testing all jobs. run all"
git push

环境变量

在您对自己问题的回答的其他地方添加了一个约束:不能使用提交消息。环境变量可以在git cli

中设置
  1. 像这样设置你的 .gitlab-ci.yml
job1:
  ...
  rules:
    - if: $JOB1

job2:
  ...
  rules:
    - if: $JOB2
  1. 这样推
git commit --allow-empty -m "triggering job1 with ci variables"
git push -o ci.variable="JOB1=anythingAtAll"

参考:https://docs.gitlab.com/ee/user/project/push_options.html