在我的 Groovy 脚本化 Jenkins 管道中,我有以下功能:
def getEarliestLaunchTime(asg_name, aws_region) {
def asg_instance_ids = sh (
script: "aws --region $aws_region autoscaling describe-auto-scaling-instances --query 'AutoScalingInstances[?AutoScalingGroupName==`$asg_name`]' | jq -r '.[].InstanceId'",
returnStdout: true
).trim().split('\n')
print "ASG Instance IDs: $asg_instance_ids"
for (instance_id in asg_instance_ids) {
print "instance_id: ${instance_id}"
def instance_launch_time = sh(script: '''
launch_time=$(aws --region "${aws_region}" ec2 describe-instances --instance-ids "${instance_id}" --query 'Reservations[].Instances[].LaunchTime' --output text)
launch_time_sec=$(date -d "$launch_time" +%s)
echo "$launch_time,$launch_time_sec"
''', returnStdout: true).trim().split(',')
// other commands
}
// other commands
}
以下是该函数的控制台日志:
23:38:36 [Pipeline] sh
23:38:37 + aws --region us-east-1 autoscaling describe-auto-scaling-instances --query AutoScalingInstances[?AutoScalingGroupName==`dev-fo-energy-bkr-blue-asg`]
23:38:37 + jq -r .[].InstanceId
23:38:38 [Pipeline] echo
23:38:38 ASG Instance IDs: [i-03fb5a1504a7ffb91, i-042f40358287d1745]
23:38:38 [Pipeline] echo
23:38:38 instance_id: i-03fb5a1504a7ffb91
23:38:38 [Pipeline] sh
23:38:38 + aws --region us-east-1 ec2 describe-instances --instance-ids --query Reservations[].Instances[].LaunchTime --output text
23:38:39
23:38:39 An error occurred (MissingParameter) when calling the DescribeInstances operation: The request must contain the parameter InstanceId
23:38:39 + launch_time=
从日志中,我可以看到
istance_id
正在从数组instance_ids
获取值,但在shell脚本命令def instance_launch_time = sh(script: '''... ...''')
内它显示为空。这个 shell 脚本使用了传递给函数的另一个变量 aws_region
,但没有任何问题。
这里出了什么问题,我怎样才能让它工作?
语法
'''
表示多行文字字符串。您需要一个多行插值字符串,由 """
语法表示:
def instance_launch_time = sh(script: """
launch_time=$(aws --region "${aws_region}" ec2 describe-instances --instance-ids "${instance_id}" --query 'Reservations[].Instances[].LaunchTime' --output text)
launch_time_sec=$(date -d "$launch_time" +%s)
echo "$launch_time,$launch_time_sec"
""", returnStdout: true).trim().split(',')