在 Gitlab CI 中读取 webhook 有效负载

Posted

技术标签:

【中文标题】在 Gitlab CI 中读取 webhook 有效负载【英文标题】:Read webhook payload in Gitlab CI 【发布时间】:2019-06-22 11:55:46 【问题描述】:

我有一个通过 webhook 触发的项目 (PROJECT_A),并希望设置变量 $PRODUCT。它的值用于触发构建中的某个路径。 .gitlab-ci.yml 文件中的作业如下所示:

deploy:
  stage: publish
  script:
    - ./generate_doc.sh $PRODUCT

webhook 调用如下所示:

http://<GITLAB_URL>/api/v4/projects/710/ref/master/trigger/pipeline?token=<TOKEN>&variables[PRODUCT]=<PRODUCT>

我通过来自其他项目的 webhook 调用此触发器,包括 PROJECT_B。 所以我在各自的 webhook 中手动填写了所需的值,例如对于PROJECT_B

http://<GITLAB_URL>/api/v4/projects/710/ref/master/trigger/pipeline?token=<TOKEN>&variables[PRODUCT]=PROJECT_B

PROJECT_A 中的管道被触发时,$PRODUCT 的值为PROJECT_B,正如预期的那样。

我想进一步参数化管道,并考虑到提交消息等。我需要的所有信息显然都在webhook payload 中提供。

是否有一种内置方法可以在 pipeline 中读取此有效负载?或者,将有效负载的内容放入 webhook 中的变量中,如下所示:

http://<GITLAB_URL>/api/v4/projects/710/ref/master/trigger/pipeline?token=<TOKEN>&variables[COMMIT_REF]=???

我发现 discussions 关于使用 webhook 有效负载执行 parameterized Jenkins builds,包括 this related question。还有一个similar question in the Gitlab forum,没有任何答案。

有没有办法在 Gitlab CI 管道中访问该有效负载?我可能可以通过jq 调用来提取提供的值,但是我如何才能首先获得 Json?

【问题讨论】:

解决这个问题成功了吗? 不,我无法进一步参数化。这些变量现在在 Webhook 调用中得到修复,例如http://.../ref/master/trigger/pipeline?token=&lt;...&gt;&amp;variables[PRODUCT]=PROJECT_A。触发的项目有一个处理变量值的脚本。 【参考方案1】:

如果您在 UI 中触发管道时运行 compgen -v 以显示环境变量(没有 JSON 有效负载),您的作业日志中的行数将比POST使用 JSON 有效负载时少 3 行。

附加变量是:

CI_BUILD_TRIGGERED CI_PIPELINE_TRIGGERED TRIGGER_PAYLOAD

如果您将它们的值打印出来并重新运行管道:

echo CI_BUILD_TRIGGERED=$CI_BUILD_TRIGGERED
echo CI_PIPELINE_TRIGGERED=$CI_PIPELINE_TRIGGERED
echo TRIGGER_PAYLOAD=$TRIGGER_PAYLOAD

你得到(对于用户名 YOUR_USER_NAME 和仓库名称 YOUR_REPO_NAME)

CI_BUILD_TRIGGERED=true
CI_PIPELINE_TRIGGERED=true
TRIGGER_PAYLOAD=/builds/YOUR_USER_NAME/YOUR_REPO_NAME.tmp/TRIGGER_PAYLOAD

如您所见,有效负载以TRIGGER_PAYLOAD 的形式存储在后缀为.tmp 的临时目录中,重新运行管道并将其打印出来 (cat) 表明它包含有效负载,在我的情况下是JSON。

【讨论】:

以上是关于在 Gitlab CI 中读取 webhook 有效负载的主要内容,如果未能解决你的问题,请参考以下文章

[后端]gitlab之gitlab-ci自动部署

CI/CD之jenkins

CI/CD之jenkins

从资源中读取文件在 gitlab CI 中不起作用

jenkins-pipeline配置简介

在 Gitlab 中添加 webhook