从 Jenkins Groovy 脚本中的数组迭代的变量未在 shell 命令中显示其值

问题描述 投票:0回答:1

在我的 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
,但没有任何问题。

这里出了什么问题,我怎样才能让它工作?

shell jenkins groovy jenkins-pipeline jenkins-groovy
1个回答
0
投票

语法

'''
表示多行文字字符串。您需要一个多行插值字符串,由
"""
语法表示:

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(',')
© www.soinside.com 2019 - 2024. All rights reserved.