如何从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
"""
}
我已经得到了这个工作,但我不能说它是优雅的,如果有人有一个更好的干净的答案,我会很高兴接受它。
这是我的解决方案:
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身份验证的最佳选择,并确保后续阶段的凭据可用。
要从sh文件中导出变量,请尝试使用以下命令:
env.var = sh (returnStdout: true, script: ''' SOME SH COMMAND ''').trim()
这将把您的bash值导出为groovy变量,实际上它可以将这些变量推送到环境中。
对于将来看到这个线程的人来说,这对我有用,并在全局设置它,只需在环境中设置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]
}