当我传递在 jenkins Groovy 脚本中声明的变量的值时,其值不会保留在远程服务器上运行的“for”循环中。奇怪的是,我能够在 for 循环之外访问远程服务器上的相同值。
这是我正在尝试使用的示例代码
#!/usr/bin/env groovy
def config
def COMMANDS_TO_CHECK='curl grep hello awk tr mkdir bc'
pipeline {
agent {
label "master"
}
stages {
stage ('Validation of commands') {
steps {
script {
sh """
#!/bin/bash
/usr/bin/sshpass -p passwrd ssh user@host << EOF
hostname
echo $COMMANDS_TO_CHECK ---> This is printed
for CURRENT_COMMAND in \$COMMANDS_TO_CHECK
do
echo ${CURRENT_COMMAND} ---> Why This is not printed?
echo \${CURRENT_COMMAND} ----> Why This is not printed?
done
hostname
EOF
exit
"""
}
}
}
}
}
输出
[workspace@3] Running shell script
+ /usr/bin/sshpass -p passwrd ssh user@host
Pseudo-terminal will not be allocated because stdin is not a terminal.
illinsduck01
curl grep hello awk tr mkdir bc
illinsduck01
+ exit
答案1
删除 前面的反斜杠$COMMANDS_TO_CHECK
,因此:
for CURRENT_COMMAND in $COMMANDS_TO_CHECK
这是因为COMMANDS_TO_CHECK
它是一个 Groovy 变量并且将被 Groovy 在双引号字符串内解释。
前面也要使用反斜杠$CURRENT_COMMAND
,因此:
echo \${CURRENT_COMMAND}
这是因为CURRENT_COMMAND
它是一个 shell 变量,而不是 Groovy 变量,所以您不希望它在双引号字符串内被 Groovy 解释。