You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:36:25