从 jenkinsfile 执行 shell 命令
execution of shell command from jenkinsfile
我正在尝试从 jenkinsfile 执行一组命令。
问题是,当我尝试将 stdout 的值分配给它不起作用的变量时。
我尝试了双引号和单引号的不同组合,但到目前为止没有成功。
这里我用最新版本的 jenkinsfile 和旧版本执行了脚本。将 shell 命令放在 """ """ 中不允许创建新变量并给出错误,如 client_name 命令不存在。
String nodeLabel = env.PrimaryNode ? env.PrimaryNode : "slave1"
echo "Running on node [${nodeLabel}]"
node("${nodeLabel}"){
sh "p4 print -q -o config.yml //c/test/gradle/hk/config.yml"
def config = readYaml file: 'devops-config.yml'
def out = sh (script:"client_name=${config.BasicVars.p4_client}; " +
'echo "client name: $client_name"' +
" cmd_output = p4 clients -e $client_name" +
' echo "out variable: $cmd_output"',returnStdout: true)
}
我想将命令 p4 clients -e $client_name 的标准输出分配给变量 cmd_output。
但是当我执行代码时抛出的错误是:
NoSuchPropertyException: client_name is not defined at line cmd_output = p4 clients -e $client_name
我在这里错过了什么?
你的问题是,当字符串在双引号中时,所有的 $ 都会被 jenkins 解释。所以前 2 次没有问题,因为第一个变量来自 jenkins,第二次是单引号字符串。
第三个变量在双引号字符串中,因此 jenkins 尝试用它的值替换该变量,但找不到它,因为它仅在执行 shell 脚本时生成。
解决方法是转义$client_name中的$(或者在环境块中定义client_name)。
我重写了块:
String nodeLabel = env.PrimaryNode ? env.PrimaryNode : "slave1"
echo "Running on node [${nodeLabel}]"
node("${nodeLabel}"){
sh "p4 print -q -o config.yml //c/test/gradle/hk/config.yml"
def config = readYaml file: 'devops-config.yml'
def out = sh (script: """
client_name=${config.BasicVars.p4_client}
echo "client name: $client_name"
cmd_output = p4 clients -e $client_name
echo "out variable: $cmd_output"
""", returnStdout: true)
}
我正在尝试从 jenkinsfile 执行一组命令。 问题是,当我尝试将 stdout 的值分配给它不起作用的变量时。 我尝试了双引号和单引号的不同组合,但到目前为止没有成功。
这里我用最新版本的 jenkinsfile 和旧版本执行了脚本。将 shell 命令放在 """ """ 中不允许创建新变量并给出错误,如 client_name 命令不存在。
String nodeLabel = env.PrimaryNode ? env.PrimaryNode : "slave1"
echo "Running on node [${nodeLabel}]"
node("${nodeLabel}"){
sh "p4 print -q -o config.yml //c/test/gradle/hk/config.yml"
def config = readYaml file: 'devops-config.yml'
def out = sh (script:"client_name=${config.BasicVars.p4_client}; " +
'echo "client name: $client_name"' +
" cmd_output = p4 clients -e $client_name" +
' echo "out variable: $cmd_output"',returnStdout: true)
}
我想将命令 p4 clients -e $client_name 的标准输出分配给变量 cmd_output。
但是当我执行代码时抛出的错误是:
NoSuchPropertyException: client_name is not defined at line cmd_output = p4 clients -e $client_name
我在这里错过了什么?
你的问题是,当字符串在双引号中时,所有的 $ 都会被 jenkins 解释。所以前 2 次没有问题,因为第一个变量来自 jenkins,第二次是单引号字符串。 第三个变量在双引号字符串中,因此 jenkins 尝试用它的值替换该变量,但找不到它,因为它仅在执行 shell 脚本时生成。
解决方法是转义$client_name中的$(或者在环境块中定义client_name)。
我重写了块:
String nodeLabel = env.PrimaryNode ? env.PrimaryNode : "slave1"
echo "Running on node [${nodeLabel}]"
node("${nodeLabel}"){
sh "p4 print -q -o config.yml //c/test/gradle/hk/config.yml"
def config = readYaml file: 'devops-config.yml'
def out = sh (script: """
client_name=${config.BasicVars.p4_client}
echo "client name: $client_name"
cmd_output = p4 clients -e $client_name
echo "out variable: $cmd_output"
""", returnStdout: true)
}