在 jenkinsfile 的 shell 执行步骤中访问 groovy 变量
Accessing groovy variable in shell execution step in jenkinsfile
在我的 Jenkinsfile
中,我定义了一个 groovy 变量,我想在下面的 shell 命令中使用该值:
ret
是命令 1 shell execution
版本值为 7.0.1.0.284 的变量
command1 = """curl -s "https://abc/maven-metadata.xml" | grep "<version>.*</version>" | sort | uniq | sed -e "s#\(.*\)\(<version>\)\(.*\)\(</version>\)\(.*\)#\3#g"| grep 7.0.1.0 | tail -n1"""
ret = sh(script: command1 , returnStdout: true)
command2 = "wget --quiet --no-check-certificate --no-proxy https://abc-nexus.com/nexus/content/repositories/item/$ret/item-portal-rpm-$ret-idp-portal.rpm -P /var/jenkins/workspace/abc/item/RPMBUILD/RPMS"
此命令的输出:
wget --quiet --no-check-certificate --no-proxy https://abc-nexus.com/nexus/content/repositories/item//item-portal-rpm--idp-portal.rpm -P /var/jenkins/workspace/abc/item/RPMBUILD/RPMS
它是空白的,如果我这样使用它:
command2 = "wget --quiet --no-check-certificate --no-proxy https://abc-nexus.com/nexus/content/repositories/item/$ret/item-portal-rpm-$ret-idp-portal.rpm -P /var/jenkins/workspace/abc/item/RPMBUILD/RPMS"
输出为:
wget --quiet --no-check-certificate --no-proxy https://abc-nexus.com/nexus/content/repositories/item/7.0.1.0.284
+item-portal-rpm-7.0.1.0.284
它进入下一行,不被视为单行执行。
您的第一次尝试是使用 \
转义 $
。这在 shell 解释器中被解释为 shell 变量,因为它以这种方式传递给 Jenkins Pipeline sh
方法。您的第二次尝试更接近正确的语法,但使用方括号更安全:
command2 = "wget --quiet --no-check-certificate --no-proxy https://abc-nexus.com/nexus/content/repositories/item/${ret}/item-portal-rpm-${ret}-idp-portal.rpm -P /var/jenkins/workspace/abc/item/RPMBUILD/RPMS"
你在评估的第二个命令中有一个换行符的原因是因为第一个命令的 shell 解释器的标准输出 return 在它的末尾有一个换行符定界符。您需要使用 trim
方法删除此换行符,如下所示:
ret = sh(script: command1 , returnStdout: true).trim()
这会让你得到你想要的结果。
在我的 Jenkinsfile
中,我定义了一个 groovy 变量,我想在下面的 shell 命令中使用该值:
ret
是命令 1 shell execution
command1 = """curl -s "https://abc/maven-metadata.xml" | grep "<version>.*</version>" | sort | uniq | sed -e "s#\(.*\)\(<version>\)\(.*\)\(</version>\)\(.*\)#\3#g"| grep 7.0.1.0 | tail -n1"""
ret = sh(script: command1 , returnStdout: true)
command2 = "wget --quiet --no-check-certificate --no-proxy https://abc-nexus.com/nexus/content/repositories/item/$ret/item-portal-rpm-$ret-idp-portal.rpm -P /var/jenkins/workspace/abc/item/RPMBUILD/RPMS"
此命令的输出:
wget --quiet --no-check-certificate --no-proxy https://abc-nexus.com/nexus/content/repositories/item//item-portal-rpm--idp-portal.rpm -P /var/jenkins/workspace/abc/item/RPMBUILD/RPMS
它是空白的,如果我这样使用它:
command2 = "wget --quiet --no-check-certificate --no-proxy https://abc-nexus.com/nexus/content/repositories/item/$ret/item-portal-rpm-$ret-idp-portal.rpm -P /var/jenkins/workspace/abc/item/RPMBUILD/RPMS"
输出为:
wget --quiet --no-check-certificate --no-proxy https://abc-nexus.com/nexus/content/repositories/item/7.0.1.0.284
+item-portal-rpm-7.0.1.0.284
它进入下一行,不被视为单行执行。
您的第一次尝试是使用 \
转义 $
。这在 shell 解释器中被解释为 shell 变量,因为它以这种方式传递给 Jenkins Pipeline sh
方法。您的第二次尝试更接近正确的语法,但使用方括号更安全:
command2 = "wget --quiet --no-check-certificate --no-proxy https://abc-nexus.com/nexus/content/repositories/item/${ret}/item-portal-rpm-${ret}-idp-portal.rpm -P /var/jenkins/workspace/abc/item/RPMBUILD/RPMS"
你在评估的第二个命令中有一个换行符的原因是因为第一个命令的 shell 解释器的标准输出 return 在它的末尾有一个换行符定界符。您需要使用 trim
方法删除此换行符,如下所示:
ret = sh(script: command1 , returnStdout: true).trim()
这会让你得到你想要的结果。