Jenkins
Jenkins Pipeline File - 將 Jenkinsfile 變數傳遞給進一步的命令
問題:
在將 Jenkinsfile 中聲明的變數傳遞給
sh
ssh 並在遠端主機上執行的命令時,變數內容不會保留在遠端主機上。內置的 Jenkins 變數在本地和遠端主機上都可以很好地保留。我定義的變數在本地可以正常工作,但不能在遠端主機上轉換。
雖然這個問題引用了 Docker,但這實際上是 100% 基於 Jenkins 管道的,因為它可以適用於任何有或沒有 Docker 的範例。
背景:
我正在嘗試根據目前建構標籤動態創建圖像名稱並將該名稱放入變數中。
然後我將該變數傳遞到
sh
遠端到 Docker 主機的步驟中,並使用定義的名稱執行建構步驟。Jenkinsfile 適用部分的片段…
// The 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} ."' }
通常我會假設它沒有變數,因為它是遠端主機……但是奇怪的是
${BUILD_NUMBER}
,${BUILD_TAG}
在遠端主機上翻譯和工作正常。為什麼沒有${jobBaseName}
??(它在遠端主機上顯示為空/null)。
由於不能保證您的各個階段將在同一個執行程序節點上執行(除非您將階段包裝在同一個
node
塊中),因此使用文件在階段之間共享資訊將是不可靠的。而是使用變數: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} .'" }
順便說一句,我還建議使用
sshAgent
Jenkins 的內置憑證儲存來管理 SSH 密鑰,而不是手動將-i
標誌傳遞給 SSH。