Bash变量在Jenkinsfile

时间:2017-06-18 06:56:02

标签: bash curl github jenkins

我正在尝试以下方法:

sh '''
    changelog=$(git log `git describe --tags --abbrev=0 HEAD^`..HEAD --oneline)
    curl --data '{"\tag_name\": \\"v0.0.${BUILD_NUMBER}\\",\"target_commitish\": \"master\",\"name\": \\"Release v0.0.$BUILD_NUMBER\\",\"body\": \\"$changelog\\",\"draft\": false,\"prerelease\": false}' https://****/api/v3/repos/****/****/releases?access_token=$JENKINS_ACCESS_TOKEN_PSW
'''

基本上我想包括"动态"使用Jenkins内部版本号(tag)获取的namebody$BUILD_NUMBER以及包含git log {{{}结果的bash变量的值1}})。

我已经制作了各种单引号和双引号以及其他逃避的更改,我不确定它应该如何。

目前未能通过:

  

curl:(6)无法解析主机:变量
  卷曲:(6)无法解析主持人:逃避
  卷曲:(6)无法解析主持人:9a21d71
  卷曲:(6)无法解决主持人:更多
  卷曲:(6)无法解析主持人:逃避
  卷曲:(6)无法解析主持人:尝试
  卷曲:(6)无法解析主持人:708ed0f
  卷曲:(6)无法解决主持人:更多
  curl:(6)无法解析主持人:转义'

它无法处理changelog变量中的内容。

1 个答案:

答案 0 :(得分:4)

这里的挑战不仅仅是在动态生成字符串时正确地转义引号,还要确保结果是有效的JSON。例如,在您的情况下,changelog可能包含换行符和引号,并且当它扩展到POST数据的"body": "$changelog"部分时,必须正确转义这些字符。

为此,使用jq实用程序生成POST JSON数据,如answer中对类似question所述:

sh '''
    changelog=$(git log `git describe --tags --abbrev=0 HEAD^`..HEAD --oneline)
    jq -n --arg tagname "v0.0.$BUILD_NUMBER"      \
          --arg name "Release v0.0.$BUILD_NUMBER" \
          --arg body "$changelog"                 \
          '{"tag_name": $tagname, "target_commitish": "master", "name": $name, "body": $body, "draft": false, "prerelease": false}'  |
    curl -d@- https://****/api/v3/repos/****/****/releases?access_token=$JENKINS_ACCESS_TOKEN_PSW
'''