Jenkins pipeline Groovy向sh字符串传函数参数为空解决方法
问题根因
s3_folder 解析为空是Groovy字符串插值规则和Jenkins sh步骤变量作用域不匹配导致的:
- 三单引号
'''包裹的Groovy字符串不会触发Groovy层的变量替换,内容会被原封不动传给shell执行 - shell执行环境仅能识别Jenkins注入的内置/全局环境变量(也就是你能正常解析的
WORKSPACE/BUCKET_NAME/PROFILE),而s3_folder是Groovy函数的入参,属于Groovy层变量,shell环境根本感知不到这个变量的存在,自然解析为空 - 直接写
${s3_folder}也不会生效,因为单引号字符串里Groovy不会处理这个占位符,传到shell后shell找不到对应变量,只能返回空值。
修复方案
二选一即可:
方案1:双引号字符串+转义Shell变量
把sh步骤的三单引号换成三双引号,对所有需要shell解析的环境变量加反斜杠转义,告诉Groovy不要替换这部分内容,仅替换Groovy层的s3_folder变量:
def s3Deploy_func(String s3_folder) { sh """ aws s3 cp "\$WORKSPACE/" s3://\${BUCKET_NAME}/$s3_folder --profile \${PROFILE} --recursive """ }
替换后传给shell的命令里,$s3_folder会被提前替换为你传入的codebase或者new_codebase,其余带转义符的变量会去掉反斜杠,交给shell正常解析环境变量。
方案2:通过sh步骤的environment参数注入变量(推荐)
不需要调整引号,直接把Groovy层的变量通过sh的environment参数注入到shell执行环境里,shell就能像识别普通环境变量一样读取到s3_folder,完全不用处理转义逻辑,变量多的时候不容易出错:
def s3Deploy_func(String s3_folder) { sh( script: ''' aws s3 cp "$WORKSPACE/" s3://${BUCKET_NAME}/$s3_folder --profile ${PROFILE} --recursive ''', environment: [s3_folder: s3_folder] ) }
内容的提问来源于stack exchange,提问作者Javier Lopez Tomas
相关产品推荐
相关产品推荐

