Jenkins Pipeline运行时如何向Shell脚本动态传参
Jenkins Pipeline向Shell脚本传参实现方案
核心注意事项
- 密码类敏感参数禁止直接明文拼接到执行命令中,否则会明文出现在构建日志造成泄露,必须使用Jenkins凭证能力做脱敏处理
- 不要将目录切换、脚本执行拆分为多个独立的
sh步骤:每个sh步骤会启动全新的Shell会话,前序步骤的cd操作、变量赋值不会跨步骤生效,关联操作要放在同一个sh块内
方案1:环境变量注入(推荐,兼容敏感参数场景)
这种方式是官方推荐的做法,敏感参数通过凭证绑定后会自动做日志脱敏,不会泄露明文。
第一步:提前配置凭证
在Jenkins凭证管理中新增Secret Text类型的凭证,存储你的密码值,记录下你设置的凭证ID(比如user-pass-cred)。
第二步:调整Pipeline代码
通过withCredentials块绑定敏感凭证为Shell环境变量,普通参数直接在sh块内赋值注入即可:
node('abc'){ stage('build'){ // 绑定敏感凭证为Shell环境变量,variable为Shell中读取的变量名 withCredentials([string(credentialsId: '你自己存储的密码凭证ID', variable: 'SHELL_PWD')]) { sh """ cd .. // 注入普通参数USER,这里可以替换为你Pipeline里的动态变量,比如params.userName export USER="需要传入的用户名值" // 注入敏感密码,注意前面加转义符\,避免Groovy提前解析变量 export password=\$SHELL_PWD chmod +x ./script.sh ./script.sh """ } } }
第三步:适配Shell脚本
脚本内直接读取注入的环境变量即可,不需要额外修改逻辑:
#!/usr/bin/env bash .... /some code .... # 直接读取Pipeline注入的环境变量,不需要手动赋值空值 export USER="${USER}" export password="${password}"
如果不想修改Shell脚本里的变量名,只要在
withCredentials绑定敏感变量时把variable值设为password,Pipeline里普通参数的变量名保持USER即可,脚本完全不用调整。
方案2:位置参数传递(仅适合非敏感参数场景)
这种方式通过脚本入参$1/$2的形式传值,禁止用来传递密码类敏感信息,否则参数值会明文打印在构建日志中。
第一步:调整Shell脚本读取位置参数
#!/usr/bin/env bash .... /some code .... # $1对应第一个入参(用户名),$2对应第二个入参(密码) export USER="$1" export password="$2"
第二步:Pipeline调用脚本时传入参数
node('abc'){ stage('build'){ sh """ cd .. chmod +x ./script.sh # 按顺序传入参数即可 ./script.sh "需要传入的用户名值" "非敏感的参数值" """ } }
内容的提问来源于stack exchange,提问作者kr_devops
相关产品推荐
相关产品推荐

