GitLab CI 如何使用此处的文档将 JSON 数据发布到 CI 作业中的 url?

ano*_*spp 3 gitlab gitlab-ci

希望有人能帮忙。我在使用来自 gitlab CI 作业的 JSON 数据发出 curl POST 请求时遇到困难。

curl 请求在本地终端会话中工作正常,(注意我没有在终端会话中使用双引号)。如果我没有在 gitlab CI yaml 中转义双引号,我会收到错误curl: (3) [globbing] nested brace in column 112

如果我在 GitLab CI 作业中转义双引号,如下所示,我会收到错误消息: curl: (3) [globbing] unmatched brace in column 1

在所有情况下,我都收到错误 /bin/bash: line 134: warning: here-document at line 134 delimited by end-of-file (wanted `EOF')

是否可以使用来自 GitLab CI 作业的 here-documents POST JSON 数据?

.gitlab-ci.yml 作业摘录

release:
  image: node:12-stretch-slim
  stage: release
  before_script:
    - apt-get update && apt-get install -y curl git jq
  script:
    - version=$(git describe --tags | cut -d'-' -f 1 | sed 's/^v*//')
    - echo "generating release for version ${version}"
    - npm pack
    # - >
    #   url=$(curl
    #   --header "Private-Token: $API_TOKEN"
    #   -F "file=@${CI_PROJECT_DIR}/objectdetection-plugin-${version}.tgz" "https://gitlab.com/api/v4/projects/${CI_PROJECT_ID}/uploads"
    #   |
    #   jq '.url')
    - url="http://www.example.com"
    - echo "Retrieved url from file upload as ${url}"
    - echo "The full url would be ${CI_PROJECT_URL}/${url}"
    - >
      curl -X POST https://requestbin.io/1f84by61
      --header 'Content-Type: application/json; charset=utf-8'
      --data-binary @- << EOF
      {
        \"name\": \"Release v${version}\",
        \"tag_name\": \"v${version}\",
        \"ref\": \"v${version}\",
        \"description\": \"Test\",
        \"assets\": {
          \"links\": [
            {
              \"name\": \"objectdetection-plugin-source\",
              \"url\": \"CI_PROJECT_URL/${url}\",
              \"filepath\": \"${url}\",
              \"link_type\": \"other\"
            }
          ]
        }
      }
      EOF
  when: manual
  only:
    - /^release-.*$/
Run Code Online (Sandbox Code Playgroud)

ano*_*spp 5

看完这篇就解决了

Using|-在命令中保留换行符,并且不会在命令字符串的末尾附加换行符。使用这个原理将JSON数据保存到一个变量中,然后在后续的curl命令中引用该变量。

下面我已经包含了脚本:

release:
  image: node:12-stretch-slim
  stage: release
  before_script:
    - apt-get update && apt-get install -y curl git jq
  script:
    - git fetch --prune --unshallow
    - version=$(git describe --tags | cut -d'-' -f 1 | sed 's/^v*//')
    - npm pack
    - >
      url=$(curl --silent --show-error
      --request POST
      --header "Private-Token: $API_TOKEN"
      -F "file=@${CI_PROJECT_DIR}/objectdetection-plugin-${version}.tgz" "https://gitlab.com/api/v4/projects/${CI_PROJECT_ID}/uploads"
      |
      jq --raw-output --monochrome-output '.url')
    - |-
      PAYLOAD=$(cat << JSON
      {
        "name": "Release v$version",
        "tag_name": "v$version",
        "ref": "v$version",
        "description": "$(sed -zE 's/\r\n|\n/\\n/g' < CHANGELOG.md)",
        "assets": {
          "links": [
            {
              "name": "objectdetection-plugin-source",
              "url": "$CI_PROJECT_URL$url",
              "filepath": "$url",
              "link_type": "other"
            }
          ]
        }
      }
      JSON
      )
    - echo "$PAYLOAD"
    - >
      http_response=$(curl --silent --show-error --write-out "%{http_code}" -o response.txt
      --request POST "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/releases"
      --header 'Content-Type: application/json'
      --header 'Accept: application/json'
      --header "Private-Token: ${API_TOKEN}"
      --data-binary "${PAYLOAD}")
    - |-
      if [ $http_response != "201" ]; then
        exit 1
      else
        echo "Server returned:"
        cat response.txt    
      fi
  when: manual
  allow_failure: false
  only:
    - /^release-.*$/
Run Code Online (Sandbox Code Playgroud)