将参数传递给 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()
}
}
}
在 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()
}
}
}