如何在gitlab CI中运行特定的工作

时间:2017-03-23 20:29:38

标签: continuous-integration gitlab gitlab-ci

我们正面临一个问题,我们需要在gitlab CI中运行一个特定的工作。我们目前还不知道如何解决这个问题。我们在.gitlab-ci.yml中定义了多个作业,但我们只需要在管道中运行一个作业。我们怎么能只运行一份工作,例如job1job2?我们无法在我们的环境中使用tagsbranches作为软件切换。

.gitlab-ci.yml:

before_script:
  - docker info

job1:
  script:
    - do something

job2:
  script:
    - do something

5 个答案:

答案 0 :(得分:6)

我们过去遇到过同样的问题,并且我与您分享了我们的解决方案。

备注

  • 我读了 Jawad 的答案,我发现它很好,我们在面对这个问题时已经尝试过了。
  • 我的意思是,添加when: manual将始终显示您正在管理的所有工作。
  • 因此,如果您在大型团队中工作,则无法阻止其他协作者在您不希望启动的工作中因错误或错误点击。

在继续

之前我想要的是什么
  • 让我们说你有4份工作。
  • 您需要始终(手动或自动)job 1job 2job 4但不是job3
  • 您只想在特定情况下运行job 3,或者只是在您决定运行它时。

想法是

  • 我们仅针对正则表达式的标签启动第3个作业。
  • 在下面的示例中,针对helloTag.1helloTag.2helloTag.3等标记推出了该文件。
  • 如果我们在developmaster(或其他分支),我们将有3个阶段(阶段1,阶段2,阶段4)

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

    enter image description here

  • 转到"存储库" - > "标签" - > "新标签"

    为代码指定一个与正则表达式相同的名称

    enter image description here

  • 如果我们的标签名称以" helloTag开头。",我们将有1个阶段(第3阶段)

    请注意此处不存在其他阶段

    enter image description here

.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.*$/

希望这会对你有所帮助。

答案 1 :(得分:5)

只需将"Could not find any executable java binary. Please install java in your PATH or set JAVA_HOME"添加到您不想运行的工作中。

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

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

如果您正在寻找更多"可编程",请说运行when: manualjob1,具体取决于分支名称或标记,那么您应该查看job2only个关键字:https://docs.gitlab.com/ce/ci/yaml/README.html#only-and-except

答案 2 :(得分:4)

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

由于对GitLab CI的限制太多,我们最终切换到了另一个“真正的”CI。如果您想在不同的过程中运行一些自定义作业,GitLab CI是不可复制的。我真的很欣赏这两个答案。我相信他们会帮助其他用户管理这些东西。很遗憾,在我们的案例中,我们无法使用tagscommit messagesbranches作为软件切换。

我们仍在寻找答案。随意提供另一种方法来解决这个问题。一旦碰到,我会给出正确的答案。对这个问题的赏金也没有得到正确答案。

答案 3 :(得分:4)

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

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

variables:
  firstJobOnly: 'false'

before_script:
  - docker info

job1:
  script:
    - do something

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

答案 4 :(得分:0)

原始问题询问如何在不使用分支名称或标签的情况下触发作业。这样一来,提交消息和环境变量就可以作为可行的来源,并且都不需要为每次推送都编辑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. 用这样的提交消息推送
testing conditional job triggers for gitlab-ci based on branch names and commit messages
run job1

您会注意到,这还使您可以通过如下消息运行两个作业

testing all jobs
run all

环境变量

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

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

job2:
  ...
  rules:
    - if: $JOB2
  1. 像这样
git push -o ci.variable="JOB1=anythingAtAll"

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