Jenkins: Pipeline sh bad substitution error
This turned out to be a syntax issue. Wrapping the command in '
's caused ${env.BUILD_NUMBER
to be passed instead of its value. I wrapped the whole command in "
s and escaped the nested. Works fine now.
sh "curl -v --user user:password --data-binary ${buildDir}package${env.BUILD_NUMBER}.tar -X PUT \"http://artifactory.mydomain.com/artifactory/release-packages/package${env.BUILD_NUMBER}.tar\""
In order to Pass groovy parameters into bash scripts in Jenkins pipelines (causing sometimes bad substitions) You got 2 options:
The triple double quotes way [ " " " ] OR the triple single quotes way [ ' ' ' ]
- In triple double quotes you can render the normal parameter from groovy using
${someVariable}
,if it's environment variable${env.someVariable}
, if it's parameters injected into your job${params.someVariable}
example:
def YOUR_APPLICATION_PATH= "${WORKSPACE}/myApp/" sh """#!/bin/bash cd ${YOUR_APPLICATION_PATH} npm install """
- In triple single quotes things getting little bit tricky, you can pass the parameter to environment parameter and using it by
"\${someVaraiable}"
or concating the groovy parameter using''' + someVaraiable + '''
examples:
def YOUR_APPLICATION_PATH= "${WORKSPACE}/myApp/" sh '''#!/bin/bash cd ''' + YOUR_APPLICATION_PATH + ''' npm install '''
OR
pipeline{ agent { node { label "test" } } environment { YOUR_APPLICATION_PATH = "${WORKSPACE}/myapp/" } continue... continue... continue... sh '''#!/bin/bash cd "\${YOUR_APPLICATION_PATH}" npm install ''' //OR sh '''#!/bin/bash cd "\${env.YOUR_APPLICATION_PATH}" npm install '''
Actually, you seem to have misunderstood the env
variable. In your sh
block, you should access ${BUILD_NUMBER}
directly.
Reason/Explanation: env
represents the environment inside the script. This environment is used/available directly to anything that is executed, e.g. shell scripts.
Please also pay attention to not write anything to env.*
, but use withEnv{}
blocks instead.