我们正面临一个问题,我们需要在gitlab CI中运行一个特定的工作。我们目前还不知道如何解决这个问题。我们在.gitlab-ci.yml
中定义了多个作业,但我们只需要在管道中运行一个作业。我们怎么能只运行一份工作,例如job1
或job2
?我们无法在我们的环境中使用tags
或branches
作为软件切换。
before_script:
- docker info
job1:
script:
- do something
job2:
script:
- do something
答案 0 :(得分:6)
我们过去遇到过同样的问题,并且我与您分享了我们的解决方案。
when: manual
将始终显示您正在管理的所有工作。job 1
,job 2
和job 4
但不是job3
。job 3
,或者只是在您决定运行它时。helloTag.1
,helloTag.2
,helloTag.3
等标记推出了该文件。如果我们在develop
或master
(或其他分支),我们将有3个阶段(阶段1,阶段2,阶段4)
请注意管道中不存在第三个作业
转到"存储库" - > "标签" - > "新标签"
为代码指定一个与正则表达式相同的名称
如果我们的标签名称以" 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.*$/
希望这会对你有所帮助。
答案 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: manual
或job1
,具体取决于分支名称或标记,那么您应该查看job2
和only
个关键字:https://docs.gitlab.com/ce/ci/yaml/README.html#only-and-except
答案 2 :(得分:4)
tags
或branches
之外的其他软件开关。由于对GitLab CI的限制太多,我们最终切换到了另一个“真正的”CI。如果您想在不同的过程中运行一些自定义作业,GitLab CI是不可复制的。我真的很欣赏这两个答案。我相信他们会帮助其他用户管理这些东西。很遗憾,在我们的案例中,我们无法使用tags
,commit messages
或branches
作为软件切换。
我们仍在寻找答案。随意提供另一种方法来解决这个问题。一旦碰到,我会给出正确的答案。对这个问题的赏金也没有得到正确答案。
答案 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文件。
根据提交的经验,带有提交消息正则表达式的作业规则是一个非常简单且灵活的解决方案。
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.*/
'
testing conditional job triggers for gitlab-ci based on branch names and commit messages
run job1
您会注意到,这还使您可以通过如下消息运行两个作业
testing all jobs
run all
在对自己的问题的回答中的其他地方,添加了一个约束:不能使用提交消息。可以在git cli中设置环境变量
job1:
...
rules:
- if: $JOB1
job2:
...
rules:
- if: $JOB2
git push -o ci.variable="JOB1=anythingAtAll"
参考:https://docs.gitlab.com/ee/user/project/push_options.html