cat 和curl 来自 gitlab ci 的大 JSON 值

问题描述 投票:0回答:1

关于如何通过

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
变量吗?

谢谢

json bash curl gitlab cat
1个回答
0
投票

其简化版本如下所示:

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 的语法:将
    ==
    更改为
    =
    ,将
    [[
    更改为
    [
  • 我们删除了
    bash -c
    的使用以及它所暗示的父子进程之间的 exec 边界。如果我们没有这样做,我们需要
    export comment
© www.soinside.com 2019 - 2024. All rights reserved.