在 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=<...>&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 有效负载的主要内容,如果未能解决你的问题,请参考以下文章