将参数传递给 Jenkinsfile 中的 shell 脚本时替换错误

Bad substitution when passing parameter to shell script in Jenkinsfile

在 Jenkinsfile 中,我试图通过设置 shell 脚本的 stdOut 来设置环境变量。该脚本包含一个 AWS 命令​​,该命令 returns 一个 InstanceID:

stage('Set InstanceID') {
         steps {
             script {
           env.IID = sh (script: 'scripts/get-node-id.sh "${params.ENVIRONMENT}" "${params.NODE}"', returnStdout: true).trim()
             }
          }
    }

无论我做什么或使用多少反斜杠来转义引号,都无济于事。我得到一个错误的替换错误。我也试过没有双引号。

如果我在 shell 脚本参数中进行硬编码,它运行良好。

如果我想在此处使用参数值,如何使它工作?

我设法解决了这个问题,上面@yong 的评论几乎是我所需要的。我需要三个双引号并取消引用变量:

stage('Set InstanceID') {
     steps {
         script {
       env.IID = sh (script: """scripts/get-node-id.sh ${params.ENVIRONMENT} ${params.NODE}""", returnStdout: true).trim()
         }
      }
}

Groovy(Jenkinsfile 的语言)和 Bash 共享相同的替换语法。当您在示例代码中使用单引号时,Groovy 替换不起作用(请参阅 https://groovy-lang.org/syntax.html#_single_quoted_string)。所以 Bash 将尝试进行替换,但不知道这些变量,因为它们是 Jenkins 参数值。

所以解决这个你需要为你的脚本使用双引号并转义其中的双引号(或使用单引号):

stage('Set InstanceID') {
    steps {
        script {
            env.IID = sh (script: "scripts/get-node-id.sh \"${params.ENVIRONMENT}\" \"${params.NODE}\"", returnStdout: true).trim()
        }
    }
}