如何将Pipeline中的变量值传递给Shell脚本?含多环境任务场景
刚好帮你解决过类似的Jenkins Pipeline传参问题,这里给你几种靠谱的方法,结合你的场景来讲解:
方法1:直接利用Groovy双引号插值
Groovy的双引号字符串会自动解析其中的变量,你可以直接把Pipeline中的Ajob/Bjob变量嵌入到Shell脚本的双引号里,非常适合简单场景:
// 先定义你的任务名变量 def Ajob = "ProjectBuild_ABD_${TARGET_PLATFORM.toUpperCase()}_fe" def Bjob = "ProjectBuild_ABD_${TARGET_PLATFORM.toUpperCase()}_be" // 直接在sh脚本的双引号中引用变量 def feBuildNum = sh( returnStdout: true, script: "curl -s 'http://你的Jenkins地址/job/${Ajob}/lastBuild/buildNumber'" ).trim() // 记得trim去掉换行符,避免后续处理出问题 def beBuildNum = sh( returnStdout: true, script: "curl -s 'http://你的Jenkins地址/job/${Bjob}/lastBuild/buildNumber'" ).trim() echo "FE任务构建号:${feBuildNum}" echo "BE任务构建号:${beBuildNum}"
这种方法的核心是:Groovy会先把${Ajob}替换成实际的任务名字符串,再把完整的命令传给Shell执行。
方法2:通过环境变量传递
如果你的Shell逻辑比较复杂,或者需要多次使用这些变量,可以先把Pipeline变量注入到Jenkins的环境变量中,然后在Shell里直接用$变量名访问:
def Ajob = "ProjectBuild_ABD_${TARGET_PLATFORM.toUpperCase()}_fe" def Bjob = "ProjectBuild_ABD_${TARGET_PLATFORM.toUpperCase()}_be" // 将Pipeline变量存入环境变量 env.FE_JOB_NAME = Ajob env.BE_JOB_NAME = Bjob // Shell脚本用单引号,避免Groovy提前插值,直接读取环境变量 def feBuildNum = sh( returnStdout: true, script: 'curl -s "http://你的Jenkins地址/job/$FE_JOB_NAME/lastBuild/buildNumber"' ).trim() def beBuildNum = sh( returnStdout: true, script: 'curl -s "http://你的Jenkins地址/job/$BE_JOB_NAME/lastBuild/buildNumber"' ).trim()
这种方法更安全,尤其是当变量包含空格、特殊字符时,Jenkins会自动处理转义问题。
方法3:作为命令行参数传递
如果你的Shell脚本是多行复杂逻辑,可以把Pipeline变量作为位置参数传给Shell,代码结构更清晰:
def Ajob = "ProjectBuild_ABD_${TARGET_PLATFORM.toUpperCase()}_fe" def feBuildNum = sh( returnStdout: true, script: """ #!/bin/bash # 第一个参数就是传入的任务名 TARGET_JOB=\$1 # 执行逻辑 curl -s "http://你的Jenkins地址/job/\$TARGET_JOB/lastBuild/buildNumber" """, args: Ajob // 把Ajob作为参数传给Shell脚本 ).trim()
额外优化:直接用Jenkins API(无需Shell)
其实在Jenkins Pipeline里,你完全可以跳过Shell,直接用Groovy调用Jenkins内部API获取构建号,效率更高还不用处理网络请求:
def Ajob = "ProjectBuild_ABD_${TARGET_PLATFORM.toUpperCase()}_fe" // 获取Jenkins实例和目标任务 def jenkinsInstance = Jenkins.instance def feJob = jenkinsInstance.getItem(Ajob) // 直接获取最新构建号 def feBuildNum = feJob.lastBuild.number echo "FE任务构建号:${feBuildNum}"
注意:这种方法需要确保你的Pipeline有足够的权限访问Jenkins内部API,如果遇到权限问题,可以在Jenkins全局安全配置中调整权限策略。
内容的提问来源于stack exchange,提问作者sudhir
相关产品推荐
相关产品推荐

