While using assignment of Jenkins env variables in shell block I've noticed that it doesn't work if I'm substituting multiple variables in a string, or if there's an _. For example, this works
script {
def formattedDate = sh(script: "date +'%Y-%m-%d %H:%M:%S'", returnStdout: true).trim()
sh """
mkdir customization
mkdir customization/nemo
mkdir customization/memo
mkdir customization/pemo
echo "BuildNum=${currentBuild.number}" > DevOpsReleaseInfo.properties
echo "ReleaseNum=${VERSION}" >> DevOpsReleaseInfo.properties
echo "DevOpsReleaseNum=${VERSION}" >> DevOpsReleaseInfo.properties
echo "BuildTime=$formattedDate" >> DevOpsReleaseInfo.properties
version="${env.VERSION}"
build_num="${currentBuild.number}"
for dir in customization/*; do
[ -f \$dir ] && continue
customer=\$(basename \$dir)
mkdir customization/\$customer/\$version-db-\$build_num
done
"""
}
I get the output
+ version=6.12.0-SNAPSHOT
+ build_num=28
+ '[' -f customization/memo ]
+ basename customization/memo
+ customer=memo
+ mkdir customization/memo/6.12.0-SNAPSHOT-db-28
+ '[' -f customization/nemo ]
+ basename customization/nemo
+ customer=nemo
+ mkdir customization/nemo/6.12.0-SNAPSHOT-db-28
+ '[' -f customization/pemo ]
+ basename customization/pemo
+ customer=pemo
+ mkdir customization/pemo/6.12.0-SNAPSHOT-db-28
but this doesn't
script {
def formattedDate = sh(script: "date +'%Y-%m-%d %H:%M:%S'", returnStdout: true).trim()
sh """
mkdir customization
mkdir customization/nemo
mkdir customization/memo
mkdir customization/pemo
echo "BuildNum=${currentBuild.number}" > DevOpsReleaseInfo.properties
echo "ReleaseNum=${VERSION}" >> DevOpsReleaseInfo.properties
echo "DevOpsReleaseNum=${VERSION}" >> DevOpsReleaseInfo.properties
echo "BuildTime=$formattedDate" >> DevOpsReleaseInfo.properties
version="${env.VERSION}"
build_num="${currentBuild.number}"
for dir in customization/*; do
[ -f \$dir ] && continue
customer=\$(basename \$dir)
mkdir customization/\$customer/\$version_db_\$build_num
done
"""
}
notice that I'm using \$version_db_\$build_num instead of \$version-db-\$build_num
+ version=6.12.0-SNAPSHOT
+ build_num=29
+ '[' -f customization/memo ]
+ basename customization/memo
+ customer=memo
+ mkdir customization/memo/29
+ '[' -f customization/nemo ]
+ basename customization/nemo
+ customer=nemo
+ mkdir customization/nemo/29
+ '[' -f customization/pemo ]
+ basename customization/pemo
+ customer=pemo
+ mkdir customization/pemo/29
This has to do with bash variable naming conventions.
When combining variables and strings, the correct approach is to use curly braces ( {} ) to separate the variables from the strings.
Underscores ( _ ) are allowed in variable names in bash, whereas Hypens ( - ) are not.
So, $version_db_$build_num just contains 2 variables - $version_db_ and $build_num
The value for '$version_db_' is empty as it is never defined. This is shown in output '29'.
In case of $version-db-$build_num, it contains 2 variables and a string - $version, -db-, $build_num.
So it is shown as '6.12.0-SNAPSHOT-db-28'.
Using when using curly braces, ${version}_db_${build_num} should work.