【问题标题】:Bash variable escaping in a JenkinsfileJenkinsfile 中的 Bash 变量转义
【发布时间】:2017-11-20 14:28:57
【问题描述】:

我正在尝试以下方法:

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
'''

基本上,我想包含 tagnamebody 的“动态”值,这些值是使用 Jenkins 内部版本号 ($BUILD_NUMBER) 和包含 git log 的结果的 bash 变量 (@ 987654327@).

我已经做了各种单引号和双引号以及其他我不知道应该如何进行的转义更改。

目前失败:

curl:(6)无法解析主机:变量
curl:(6)无法解析主机:转义
curl:(6)无法解析主机:9a21d71
curl:(6)无法解析主机:更多
curl:(6)无法解析主机:转义
curl:(6)无法解析主机:尝试
curl:(6)无法解析主机:708ed0f
curl:(6)无法解析主机:更多
curl:(6)无法解析主机:转义'

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

【问题讨论】:

    标签: bash curl github jenkins


    【解决方案1】:

    这里的挑战不仅仅是在动态生成字符串时正确地转义引号,还要确保结果是有效的 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
    '''
    

    【讨论】:

    • 嗯...这对我来说效果不佳,它因“解析 JSON 的问题”而失败。在此处查看 Jenkins 的结果:pastebin.com/kSVd57Zc
    • @IdanAdar 究竟是什么不起作用?我很难从提供的数据中猜测出来。
    • 好吧,由于解析 JSON 失败,这是我得到的唯一结果。 pastebin 显示了执行的命令。
    • 我能看到的唯一问题是body 的内容包含一个未转义的换行符。请直接尝试此命令并告诉我它是否有效:curl --data '{"tag_name": "v0.0.39", "target_commitish": "master", "name": "Release v0.0.39", "body": "b8898d1 add missing quotes\nbe0ab22 attempt with curldata", "draft": false, "prerelease": false}' 'https://****/api/v3/repos/****/****/releases?access_token=****'
    • 那么,由于changelog 可以包含换行符,因此必须将它们替换为转义序列。我会尽快更新答案。
    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2021-12-02
    相关资源
    最近更新 更多