如何在 gitlab 中触发特定作业
Posted
技术标签:
【中文标题】如何在 gitlab 中触发特定作业【英文标题】:How to trigger a specific job in gitlab 【发布时间】:2019-11-04 02:12:16 【问题描述】:我想在管道中运行一个特定的作业,我认为为该作业分配一个标签,然后在 post 方法中再次指定这个标签将满足我的需求。问题是当我使用 api(post) 触发时,管道中的所有作业都是触发事件,尽管只有其中一个标记为 .
gitlab-ci.yml:
工作1: 脚本: - 回声“你好世界!” 标签:[myTag]
工作2: 脚本: - 回声“你好 gitlab!”
API 调用: curl -X POST -F token="xxx" -F ref="myTag" https://gitlab.com/api/v4/projects/12345678/trigger/pipeline
【问题讨论】:
【参考方案1】:向您的触发器 api 调用添加一个变量,如下所示:
https://docs.gitlab.com/ee/ci/triggers/#making-use-of-trigger-variables
然后使用only
属性
在您的 gitlab.yml
文件中
如图所示:
https://docs.gitlab.com/ee/ci/variables/#environment-variables-expressions
那么只有当变量存在时才会执行作业
例如
job1:
script: echo "HELLO"
only:
variables:
- $variables[API_CALL]=true
【讨论】:
非常感谢,但我真正想要的是从 api 中选择工作(将其作为参数传递)。 据我所知这是不可能的。 按照docs.gitlab.com/ee/ci/variables/…应该是only: variables: - API_CALL == "true"
取决于你的 gitlab 版本,答案差不多一年了
嘿,如何为 curl 请求定义可变变量?【参考方案2】:
GitLab 中的更改可能使上述答案不起作用。
only:
variables:
- $variables[....]
语法触发 CI Lint。
对于像我一样来到这里的其他人,这是我触发特定工作的方式:
job1:
script:
- echo "HELLO for job1"
- "curl
--request POST
--form token=$CI_JOB_TOKEN
--form ref=master
--form variables[TRIGGER_JOB]=job2
https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/trigger/pipeline"
except:
- pipelines
job2:
script: echo "HELLO for job2"
only:
variables:
- $TRIGGER_JOB == "job2"
⚠️ 请注意 job1 中的 except - pipelines
,否则,您将进入无限子管道循环!
【讨论】:
【参考方案3】:通过使用变量你可以做到:
使用此 curl 命令通过变量触发管道
curl --request POST --form token=$TOKEN --form ref=master --form "variables[TRIGERRED_JOB]=job1" "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/trigger/pipeline"
当然你必须相应地设置变量。
用适当的变量定义你的工作:
job1:
script: echo "HELLO for job1"
only:
variables:
- $variables[TRIGERRED_JOB] == "JOB1"
job2:
script: echo "HELLO for job2"
only:
variables:
- $variables[TRIGERRED_JOB] == "JOB2"
如果您从另一个/相同的作业中运行 curl,您可以使用 $CI_JOB_TOKEN 而不是 $TOKEN 和
https://docs.gitlab.com/ee/ci/triggers/#making-use-of-trigger-variables
【讨论】:
以上是关于如何在 gitlab 中触发特定作业的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Jenkins 作业中获取 MR 的所有 GitLab 评论