如何将Jenkins sh块中的变量导出供后续Stage使用?
问题:Jenkins中如何将sh块内的变量传递到后续Stage?
你当前代码的核心问题是:sh块运行在独立的shell进程中,直接给${env.xxx}赋值完全不生效——Jenkins的env变量属于Groovy执行上下文,shell进程无法直接修改它;同时shell内的变量默认仅在当前shell会话有效,没法自动传递到Jenkins全局环境。
以下是几种可行的解决方案:
方案1:通过文件中转传递变量
在sh块里把凭证写入临时文件,再用Groovy代码读取文件内容并设置到Jenkins环境变量:
steps { sh """ ASSUME_ROLE_RESPONSE=\$(aws sts assume-role --role-arn "arn:aws:iam::${env.NON_PROD_ACCOUNT_ID}:role/${env.AWS_ROLE}" --role-session-name "${env.AWS_ROLE_SESSION}" --duration-seconds 3600) # 将凭证写入临时文件 echo \$(echo \$ASSUME_ROLE_RESPONSE | jq --raw-output '.Credentials.AccessKeyId') > access_key.txt echo \$(echo \$ASSUME_ROLE_RESPONSE | jq --raw-output '.Credentials.SecretAccessKey') > secret_key.txt echo \$(echo \$ASSUME_ROLE_RESPONSE | jq --raw-output '.Credentials.SessionToken') > session_token.txt """ script { # 读取文件内容并设置到Jenkins全局环境 env.AWS_ACCESS_KEY_ID = readFile('access_key.txt').trim() env.AWS_SECRET_ACCESS_KEY = readFile('secret_key.txt').trim() env.AWS_SESSION_TOKEN = readFile('session_token.txt').trim() } }
方案2:直接捕获sh命令输出(更简洁)
跳过shell内的变量赋值,用Groovy直接调用sh命令并捕获输出,直接设置到env:
steps { script { def assumeRoleOutput = sh( script: """aws sts assume-role --role-arn "arn:aws:iam::${env.NON_PROD_ACCOUNT_ID}:role/${env.AWS_ROLE}" --role-session-name "${env.AWS_ROLE_SESSION}" --duration-seconds 3600""", returnStdout: true ).trim() // 解析输出并设置环境变量 env.AWS_ACCESS_KEY_ID = sh( script: "echo '${assumeRoleOutput}' | jq --raw-output '.Credentials.AccessKeyId'", returnStdout: true ).trim() env.AWS_SECRET_ACCESS_KEY = sh( script: "echo '${assumeRoleOutput}' | jq --raw-output '.Credentials.SecretAccessKey'", returnStdout: true ).trim() env.AWS_SESSION_TOKEN = sh( script: "echo '${assumeRoleOutput}' | jq --raw-output '.Credentials.SessionToken'", returnStdout: true ).trim() } }
方案3:仅同Stage后续shell使用的临时方案
如果只是同一个Stage里的后续sh块需要用这些变量,可以写入.env文件再source,但跨Stage不生效:
steps { sh """ ASSUME_ROLE_RESPONSE=\$(aws sts assume-role --role-arn "arn:aws:iam::${env.NON_PROD_ACCOUNT_ID}:role/${env.AWS_ROLE}" --role-session-name "${env.AWS_ROLE_SESSION}" --duration-seconds 3600) # 生成环境变量文件 cat > aws_credentials.env << EOF export AWS_ACCESS_KEY_ID=\$(echo \$ASSUME_ROLE_RESPONSE | jq --raw-output '.Credentials.AccessKeyId') export AWS_SECRET_ACCESS_KEY=\$(echo \$ASSUME_ROLE_RESPONSE | jq --raw-output '.Credentials.SecretAccessKey') export AWS_SESSION_TOKEN=\$(echo \$ASSUME_ROLE_RESPONSE | jq --raw-output '.Credentials.SessionToken') EOF """ sh """ # 加载变量后使用 source aws_credentials.env aws s3 ls """ }
关键注意点
- 跨Stage传递变量必须通过Jenkins的
env对象或其他全局存储方式(如参数、stash),shell本地变量无法跨进程/Stage传递。 - 处理命令输出时记得用
.trim()去除多余换行符,避免变量包含无效字符。
内容的提问来源于stack exchange,提问作者berimbolo
相关产品推荐
相关产品推荐

