问题:
在将一个在Jenkinsfile中声明的variables传递给shsh并在远程主机上执行的sh命令中,variables内容不会保留在远程主机上。
内置的Jenkinsvariables在本地和远程主机上保持良好状态。 我定义的variables在本地工作正常,但不在远程主机上转换
虽然这个问题引用了docker,但实际上它是100%的Jenkins Pipeline,因为它可以适用于有或没有docker的任何示例
背景:
我试图根据当前的构build标签dynamic地创build一个图像名称,并将该名称放入一个variables。
然后,我将这个variables传递给sh步骤,远程执行一个docker主机并运行一个构build步骤。
Jenkinsfile的适用部分的片段…
// below stage just echo's out some stuff into a file dockerimgname.jenkins.out stage ('Construct Img name') { sh '''echo ${BUILD_TAG} | awk '{print tolower($0)}' | sed 's/jenkins-//' > dockerimgname.jenkins.out''' } // This stage reads that file from previous stage and puts the value into variable. // The variable is echo'd locally which works perfectly. Then ssh is called to execute command on remote host. That's where the variable value doesn't work. stage ('Build Target Container') { def jobBaseName = readFile 'dockerimgname.jenkins.out' echo "${jobBaseName}" sh 'ssh -i ~/ssh_keys/key.key user@somehost "cd /dockerdata/build/${BUILD_TAG} && docker build -t localrepo/${jobBaseName}:${BUILD_NUMBER} ."' }
通常我会假设,因为它是一个远程主机,它没有variables..但是奇怪的是${BUILD_NUMBER}和${BUILD_TAG}翻译和工作正常的远程主机,为什么不${jobBaseName} ?? (在远程主机上显示为空/空)
既然不能保证你的各个阶段将运行在同一个执行者节点上(除非你的阶段包含在同一个node块中),使用文件在阶段之间共享信息将是不可靠的。 而是使用variables:
def jobBaseName stage ('Construct Img name') { jobBaseName = sh( script: "echo ${BUILD_TAG} | awk '{print tolower($0)}' | sed 's/jenkins-//'", returnStdout: true, ) } stage ('Build Target Container') { sh "ssh -i ~/ssh_keys/key.key user@somehost 'cd /dockerdata/build/${BUILD_TAG} && docker build -t localrepo/${jobBaseName}:${BUILD_NUMBER} .'" }
顺便说一下,我还build议使用sshAgent和Jenkins的内置凭证存储来pipe理SSH密钥,而不是手动将-i标志传递给SSH。