Jenkins 管道文件 - 将 Jenkinsfile 变量传递到进一步的命令中

emm*_*dee 5 jenkins jenkins-multibranch

问题:

在将 Jenkinsfile 中声明的变量传递给shssh 并在远程主机上执行的命令时,变量内容不会保留在远程主机上。

内置 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} ."'
}
Run Code Online (Sandbox Code Playgroud)

通常我会假设它没有变量,因为它是远程主机......但是很奇怪,${BUILD_NUMBER}并且${BUILD_TAG}在远程主机上翻译和工作正常。为什么不行${jobBaseName}??(它在远程主机上显示为空/空)。

jay*_*ren 4

由于不能保证您的各个阶段将在同一个执行器节点上运行(除非您将阶段包装在同一个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} .'"
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我还建议使用sshAgentJenkins 的内置凭据存储来管理 SSH 密钥,而不是手动将-i标志传递给 SSH。