5

我有一个PROJECT_A通过 webhook 触发的项目 (),并希望设置变量$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>

我通过来自其他项目(包括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中提供。

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

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

我发现了关于使用 webhook 有效负载进行参数化 Jenkins 构建的讨论,包括这个相关问题。Gitlab 论坛里也有类似的问题,没有任何答案。

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

4

1 回答 1

0

如果您compgen -v在 UI 中触发管道时运行以显示环境变量(没有 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在一个临时目录中,后缀为 suffixed .tmp,重新运行管道并将其打印出来 ( cat) 表明它包含有效负载,在我的情况下是 JSON。

于 2021-09-21T12:55:00.153 回答