【问题标题】:Use jenkins environment variable in SH script with multiple quote在带有多个引号的 SH 脚本中使用 jenkins 环境变量
【发布时间】:2022-08-22 08:51:57
【问题描述】:

我想将 jenkins env 变量与 SH 一起使用,但在 curl 的多个引号内。

例子:

script {
  container(\'deployer\') {
    sh \"curl -X POST --data-urlencode \\\"payload={\'channel\': \'#notification-test-devops\', \'username\': \'Jenkins Build\', \'text\': \'[Blocked Production] ${env.JOB_BASE_NAME} (${env.BRANCH_NAME} #${BUILD_NUMBER}) <${BUILD_URL}|View Build>\', \'icon_emoji\': \':jenkins:\'}\\\" https://hooks.slack.com/services/XXX/XXX/XXX\"
  }
}

当前结果似乎未呈现:

[Blocked Staging] ${env.JOB_BASE_NAME} (${env.BRANCH_NAME} #${BUILD_NUMBER}) <${BUILD_URL}|View Build>

Screenshot

期待: jenkins 环境变量将在 Slack 消息中呈现。

    标签: shell jenkins jenkins-pipeline pipeline


    【解决方案1】:

    你必须反斜杠你的变量。

    改变${env.BRANCH_NAME}经过${env.BRANCH_NAME}

    例子 :

    script {
      container('deployer') {
        sh "curl -X POST --data-urlencode \"payload={'channel': '#notification-test-devops', 'username': 'Jenkins Build', 'text': '[Blocked Production] ${env.JOB_BASE_NAME} (${env.BRANCH_NAME} #${BUILD_NUMBER}) <${BUILD_URL}|View Build>', 'icon_emoji': ':jenkins:'}\" https://hooks.slack.com/services/XXX/XXX/XXX"
      }
    }
    

    成为:

    script {
      container('deployer') {
        sh "curl -X POST --data-urlencode \"payload={'channel': '#notification-test-devops', 'username': 'Jenkins Build', 'text': '[Blocked Production] \${env.JOB_BASE_NAME} (\${env.BRANCH_NAME} #${BUILD_NUMBER}) <${BUILD_URL}|View Build>', 'icon_emoji': ':jenkins:'}\" https://hooks.slack.com/services/XXX/XXX/XXX"
      }
    }
    

    【讨论】:

    • 它不工作/home/jenkins/agent/workspace/XXX_master@tmp/durable-d97a4e9d/script.sh: 1: Bad substitution
    【解决方案2】:

    您需要将消息文本放入双引号中以检测变量。还要给你的 shell 块三个双引号,以免干扰 shell 块内的其他双引号"

    script {
      container('deployer') {
        sh """
            curl -X POST --data-urlencode \"payload={'channel': '#notification-test-devops', 'username': 'Jenkins Build', 'text': "[Blocked Production] ${env.JOB_BASE_NAME} (${env.BRANCH_NAME} Build number: ${BUILD_NUMBER}) <${BUILD_URL}|View Build>", 'icon_emoji': ':jenkins:'}\" https://hooks.slack.com/services/XXX/XXX/XXX
        """
    
      }
    }
    

    【讨论】:

    • 它似乎在错误输出上呈现,但有一个错误:Shell Script -- curl -X POST --data-urlencode "payload={'channel': '#notification-test-devops', 'username': 'Jenkins Build', 'text': "[Blocked Production] master (master #16) &lt;https://jenkins.XXX.net/job/XXX/job/master/16/|View Build&gt;", 'icon_emoji': ':jenkins:'}" https://hooks.slack.com/services/XXX/XXX/XXX (self time 589ms) /home/jenkins/agent/workspace/XXX_master@tmp/durable-6305c906/script.sh: 2: Syntax error: "(" unexpected
    • 似乎“#”引起了问题。在没有我的编辑的情况下尝试它。
    【解决方案3】:

    所以经过几次尝试,这是可行的。

    container('deployer') {
        wrap([$class: 'BuildUser']) {
            sh """
                curl -X POST --data-urlencode \"payload={'channel': '#notification-test-devops', 'username': 'Jenkins Build', 'text': \\\"[Blocked Production] ${env.JOB_NAME} #${BUILD_NUMBER}\nCommit ID: ${GIT_COMMIT}\nCommit Message: ${GIT_COMMIT_MSG}\n<${BUILD_URL}|View Build>\\\", 'icon_emoji': ':jenkins:'}\" https://hooks.slack.com/services/XXX/XXX/XXX
            """
        }
    }
    

    你可以忽略包装,因为我只用build-user-vars-plugin

    【讨论】:

      猜你喜欢
      • 2019-09-24
      • 2015-04-30
      • 2017-02-03
      • 2013-06-08
      • 1970-01-01
      • 2020-12-24
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多