如何 运行 gitlab 中的特定作业 CI
How to run a specific job in gitlab CI
我们面临一个问题,我们需要 运行 在 gitlab CI 中完成一项特定的工作。我们目前不知道如何解决这个问题。我们在 .gitlab-ci.yml
中定义了多个作业,但我们只需要 运行 管道中的一个作业。我们怎么能只 运行 一份工作呢? job1
还是 job2
?我们不能在我们的环境中使用 tags
或 branches
作为软件开关。
.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",假设 运行 job1
或 job2
取决于分支名称或标签,那么您应该查看 only
和 except
关键字:https://docs.gitlab.com/ce/ci/yaml/README.html#only-and-except
我们过去也遇到过同样的问题,现在与您分享我们的解决方案。
#备注#
- 我看了Jawad的回答,我觉得很好,我们遇到问题的时候也试过了。
- 我的意见是添加
when: manual
将始终显示管道中的所有工作。
- 因此,如果您在大型团队中工作,则无法阻止其他协作者误点击或误点击您不想启动的工作。
#继续之前我的假设#
- 假设您有 4 份工作。
- 您需要始终 运行(手动或自动)
job 1
、job 2
和 job 4
但不是 job3
.
- 您只想在特定情况下 运行
job 3
或者当您决定 运行 时
#思路是#
我们仅针对匹配正则表达式的标签启动第 3 个作业。
在下面的示例中,它针对 helloTag.1
、helloTag.2
、helloTag.3
...等标签启动
如果我们在develop
或master
(或其他分支),我们将有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 似乎无法使用其他答案中提供的 tags
或 branches
以外的其他软件开关。
由于 GitLab CI 的限制太多,我们最终切换到另一个 "real" CI。 GitLab CI 如果你想 运行 在不同的过程中进行一些自定义作业,那么 GitLab CI 是不灵活的。我真的很感激这里的两个答案。我相信他们会帮助其他用户管理这些东西。不幸的是,在我们的例子中,我们无法使用 tags
、commit messages
或 branches
作为软件开关。
我们仍在寻找这方面的答案。请随意提供其他方法来解决此问题。一旦命中,我会标记正确答案。此外,关于这个问题的悬赏也没有得到正确的答案。
您可以使用 gitlab variable expression 和 only/except 如下所示,然后根据需要将变量传递到管道执行中。
此示例默认为 运行 两个作业,但如果为“firstJobOnly”传递 'true',则它仅运行第一个作业。
旧方法 -- (从 gitlab 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 文件。
提交消息
根据我的经验,使用正则表达式提交消息的作业规则是一个非常简单灵活的解决方案。
- 像这样设置你的 .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.*/
'
- 使用这样的提交消息推送
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
中设置
- 像这样设置你的 .gitlab-ci.yml
job1:
...
rules:
- if: $JOB1
job2:
...
rules:
- if: $JOB2
- 这样推
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
我们面临一个问题,我们需要 运行 在 gitlab CI 中完成一项特定的工作。我们目前不知道如何解决这个问题。我们在 .gitlab-ci.yml
中定义了多个作业,但我们只需要 运行 管道中的一个作业。我们怎么能只 运行 一份工作呢? job1
还是 job2
?我们不能在我们的环境中使用 tags
或 branches
作为软件开关。
.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",假设 运行 job1
或 job2
取决于分支名称或标签,那么您应该查看 only
和 except
关键字:https://docs.gitlab.com/ce/ci/yaml/README.html#only-and-except
我们过去也遇到过同样的问题,现在与您分享我们的解决方案。
#备注#
- 我看了Jawad的回答,我觉得很好,我们遇到问题的时候也试过了。
- 我的意见是添加
when: manual
将始终显示管道中的所有工作。 - 因此,如果您在大型团队中工作,则无法阻止其他协作者误点击或误点击您不想启动的工作。
#继续之前我的假设#
- 假设您有 4 份工作。
- 您需要始终 运行(手动或自动)
job 1
、job 2
和job 4
但不是job3
. - 您只想在特定情况下 运行
job 3
或者当您决定 运行 时
#思路是#
我们仅针对匹配正则表达式的标签启动第 3 个作业。
在下面的示例中,它针对
helloTag.1
、helloTag.2
、helloTag.3
...等标签启动如果我们在
develop
或master
(或其他分支),我们将有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 似乎无法使用其他答案中提供的 tags
或 branches
以外的其他软件开关。
由于 GitLab CI 的限制太多,我们最终切换到另一个 "real" CI。 GitLab CI 如果你想 运行 在不同的过程中进行一些自定义作业,那么 GitLab CI 是不灵活的。我真的很感激这里的两个答案。我相信他们会帮助其他用户管理这些东西。不幸的是,在我们的例子中,我们无法使用 tags
、commit messages
或 branches
作为软件开关。
我们仍在寻找这方面的答案。请随意提供其他方法来解决此问题。一旦命中,我会标记正确答案。此外,关于这个问题的悬赏也没有得到正确的答案。
您可以使用 gitlab variable expression 和 only/except 如下所示,然后根据需要将变量传递到管道执行中。
此示例默认为 运行 两个作业,但如果为“firstJobOnly”传递 'true',则它仅运行第一个作业。
旧方法 -- (从 gitlab 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 文件。
提交消息
根据我的经验,使用正则表达式提交消息的作业规则是一个非常简单灵活的解决方案。
- 像这样设置你的 .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.*/
'
- 使用这样的提交消息推送
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
中设置- 像这样设置你的 .gitlab-ci.yml
job1:
...
rules:
- if: $JOB1
job2:
...
rules:
- if: $JOB2
- 这样推
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