Jenkins: Pipeline sh bad substitution error Jenkins: Pipeline sh bad substitution error jenkins jenkins

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

  1. 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      """
  1. 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.