关于如何通过
curl
发布JSON有很多问题。我可以将一个单词作为 json 发送,但不能发送整个文本。
我的要求是当我们的 GitLab CI 中的一项作业失败时评论合并请求。
# From .gitlab-ci.yaml
after_script:
- report=$(find services/ -name '*_latest_failure.md')
- comment="Job failed.\n\n$(cat "$report")"
- if [[ "${CI_JOB_STATUS}" == "failed" ]] ; then bash -c "source .gitlab-ci/gitlab.sh; gitlab-comment_merge_request "$comment"" ; fi
# From .gitlab-ci/gitlab.sh
function gitlab-comment_merge_request() {
url="https://$CI_SERVER_HOST/api/v4/projects/$CI_MERGE_REQUEST_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID/notes"
comment="$1"
curl -v --location -X POST "$url" \
--header "PRIVATE-TOKEN: $GITLAB_CI_TOKEN" \
--header "Content-Type: application/json" \
--data '{"body": "'"$comment"'"}'
}
不幸的是,创建的评论仅包含第一个单词,Job。
我尝试了很多技术来构建和发送 JSON 有效负载。但所有结果都相同。
所以我认为在我的
$comment
中创建.gitlab-ci.yaml
变量时可能是一个错误。但是,同一文件中的 echo $comment
给出了正确的内容。
现在,我迷路了。你知道为什么不发送应该包含大文本(带有标题、副标题和列表的 Markdown 文本)的
$comment
变量吗?
谢谢
其简化版本如下所示:
nl='
'
comment="Job failed.${nl}${nl}$(find services/ -name '*_latest_failure.md' -exec cat -- {} +)"
if [ "${CI_JOB_STATUS}" = "failed" ] ; then
source .gitlab-ci/gitlab.sh
gitlab-comment_merge_request "$comment"
fi
注:
find
的输出传递给 cat
之前引用了它,所以 cat
正在寻找一个以 所有文件名连接在一起 作为名称的文件。不要那样做。使用 find -exec
可以正确处理带有空格的名称,而不会产生新的错误。==
更改为 =
,将 [[
更改为 [
。bash -c
的使用以及它所暗示的父子进程之间的 exec 边界。如果我们没有这样做,我们需要export comment