如何在 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 中触发特定作业的主要内容,如果未能解决你的问题,请参考以下文章

如何排除 gitlab-ci.yml 更改触发作业

我如何在Gitlab中安排不同时间的作业

如何将值传递给 Gitlab CI 作业

如何在 Jenkins 作业中获取 MR 的所有 GitLab 评论

如何使用 gitlab-ci 作业推送到 gitlab 存储库?

如何使用不同的 yml 文件在 gitlab ci 中触发下游管道?