声明式管道Jenkinsfile:从sh调用导出变量

hjzp0vay  于 2023-04-19  发布在  Jenkins
关注(0)|答案(3)|浏览(164)

如何从sh块中导出一些变量,以便在以后的阶段中使用?
下面的代码没有给予我任何错误,但是这些值在后面的阶段中永远不会作为环境变量使用。

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)
          ${env.ACCESS_KEY_ID}=\$(echo \$ASSUME_ROLE_RESPONSE | jq --raw-output '.Credentials.AccessKeyId')
          ${env.SECRET_ACCESS_KEY}=\$(echo \$ASSUME_ROLE_RESPONSE | jq --raw-output '.Credentials.SecretAccessKey')
          ${env.SESSION_TOKEN}=\$(echo \$ASSUME_ROLE_RESPONSE | jq --raw-output '.Credentials.SessionToken')

          echo "AWS_ACCESS_KEY_ID=${ACCESS_KEY_ID},AWS_SECRET_ACCESS_KEY=${SECRET_ACCESS_KEY},AWS_SESSION_TOKEN=${SESSION_TOKEN}"
          printenv | sort
        """
      }
7cwmlq89

7cwmlq891#

我已经得到了这个工作,但我不能说它是优雅的,如果有人有一个更好的\清洁的答案,我会很乐意接受它。
以下是我的解决方案:

stage("Authenticate To Non-Prod Account") {
      steps {
        script {
          aws_credentials = sh(script: """
            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)
            ACCESS_KEY_ID=\$(echo \$ASSUME_ROLE_RESPONSE | jq --raw-output '.Credentials.AccessKeyId')
            SECRET_ACCESS_KEY=\$(echo \$ASSUME_ROLE_RESPONSE | jq --raw-output '.Credentials.SecretAccessKey')
            SESSION_TOKEN=\$(echo \$ASSUME_ROLE_RESPONSE | jq --raw-output '.Credentials.SessionToken')

            echo "AWS_ACCESS_KEY_ID=\$ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY=\$SECRET_ACCESS_KEY,AWS_SESSION_TOKEN=\$SESSION_TOKEN"
          """, returnStdout: true)

          env.ACCESS_KEY_ID = aws_credentials.split(',')[0].split('=')[1].trim()
          env.AWS_SECRET_KEY = aws_credentials.split(',')[1].split('=')[1].trim()
          env.SESSION_TOKEN = aws_credentials.split(',')[2].split('=')[1].trim()
        }
      }
    }

我回答说,因为我读了一堆帖子,这些帖子提出了对我不起作用的想法,所以就目前而言,这是我对AWS进行身份验证的最佳选择,并确保凭据在后续阶段可用。

g9icjywg

g9icjywg2#

要从sh中导出vars,请尝试使用以下命令:

env.var = sh (returnStdout: true, script: ''' SOME SH COMMAND ''').trim()

这将把你的bash值导出到groovy变量中,事实上,它可以把变量推送到环境中。

3htmauhk

3htmauhk3#

对于将来查看此线程的人,这对我有效并将其全局设置,只需将环境中的AWS_ASSUME_ROLE_ARN设置为您所需的“假定角色”:

script {
    def aws_credentials = readJSON text: sh (returnStdout: true, script: """ aws sts assume-role --role-arn ${AWS_ASSUME_ROLE_ARN} --role-session-name Session --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" --output json """).trim()
    env.AWS_ACCESS_KEY_ID = aws_credentials[0]
    env.AWS_SECRET_ACCESS_KEY = aws_credentials[1]
    env.AWS_SESSION_TOKEN = aws_credentials[2]
}

相关问题