Jenkins中如何将环境变量作为参数传入pipeline调用的脚本
你遇到的报错根源是Groovy的块级作用域限制:你在wrap代码块内部用String user = env.BUILD_USER_ID定义的变量,作用域仅局限于wrap的大括号范围内,块外的sh步骤无法访问到这个变量,所以才会抛出groovy.lang.MissingPropertyException异常。
你能打印出user的值,说明你是在wrap块内部执行的打印操作,此时变量还处于有效作用域内,自然可以正常读取。
解决方法
有两种可行的修改方案:
方案1:提前声明变量,扩大作用域
在wrap块外部先完成变量声明,块内仅做赋值操作,这样块外也能正常读取变量值:
// 提前在块外声明变量 String user = "" wrap([$class: 'BuildUser']) { user = env.BUILD_USER_ID } sh "sshpass -p ${password} ssh -o StrictHostKeyChecking=no ${user}@${NODE} python3 git_handler.py ${user} ${password} ${remoteRepository} ${localDirectory} ${branch}"
方案2:把sh步骤移入wrap块内部
直接将需要用到user变量的逻辑都放在wrap块内,无需修改变量声明方式:
wrap([$class: 'BuildUser']) { String user = env.BUILD_USER_ID sh "sshpass -p ${password} ssh -o StrictHostKeyChecking=no ${user}@${NODE} python3 git_handler.py ${user} ${password} ${remoteRepository} ${localDirectory} ${branch}" }
额外安全提示
不要将明文密码作为命令行参数传递给脚本,主机上的其他用户可以通过ps等命令看到进程的完整启动参数,存在密码泄露风险,建议通过环境变量传递敏感信息。
内容的提问来源于stack exchange,提问作者Joel Pearce
相关产品推荐
相关产品推荐

