如何在jenkinsfile中循环运行AWS CLI命令



我正在尝试创建一个jenkins作业,当触发时将更新所有具有特定标签的Elasticache Redis复制组。

主要的工作流程是,我找到所有的Redis复制组在一个地区,例如us-east-1

def findAllRedisReplicationGroups(label, region) {
query = "ReplicationGroups[*].{arn: ARN}"
output = sh(
script: "aws --region ${region} elasticache describe-replication-groups --query '${query}' --output text",
label: label,
returnStdout: true
)
return output
}

输出将是一个字符串示例

String a = """
arn:aws:elasticache:us-west-2:AccountID:replicationgroup:application-2-test
arn:aws:elasticache:us-west-2:AccountID:replicationgroup:application-1-test
"""

然后将字符串拆分为一个列表,每个arn代表一个元素。然后使用for循环,我将遍历所有Redis复制组并获得它们的标签,如果标签像Environment: test,那么Redis复制组的arn将被添加到arn

列表中。
def findCorrectEnvReplicationGroups(label, region, environment, redis_arns){
def arn_list = redis_arns.split();
def correct_env_arn_list = [];
for( def arn : arn_list) {
def redisTags = getRedisTags(label, region, arn)
def jsonSlurper = new groovy.json.JsonSlurper()
def object = jsonSlurper.parseText(redisTags)
EnvironmentFromTag = object.TagList.find { it.Key == "Environment"}
if (EnvironmentFromTag.Value == environment) {
correct_env_arn_list.add(arn)
}
break
}
return correct_env_arn_list
}
def getRedisTags(label, region, arn) {
output = sh(
script: "aws --region ${region} elasticache list-tags-for-resource --resource-name ${arn} --output json",
label: label,
returnStdout: true
)
return output
}

我通过了1个循环。通过在每个循环中打印出arn进行测试,但当试图再次在getRedisTags方法中运行脚本时,它会崩溃。

输出应该是标签匹配

的武器列表。有没有人遇到这样的错误或有groovy的经验,可以帮助当我试图在循环中运行aws cli命令时,为什么jenkinsfile会崩溃

多谢

仍然不完全确定为什么它不工作,但使用groovy-s内置迭代器我使它工作

  1. 首先我得到所有Redis复制组的列表
  2. 然后将其插入findEnvironmentReplicationGroups,其中我使用.findAll将武器逐个输入getRedisTags方法,每次返回我一个地图(示例=[Environment: "test"])
  3. 然后我将输出[Environment: "test"]存储到变量tags中,并检查它是否与方法给出的环境相匹配。
  4. 如果匹配,则添加到correctArns,最终返回
def findAllRedisReplicationGroups(region) {
def query = "ReplicationGroups[*].ARN"
def output = sh(
script: "aws --region ${region} elasticache describe-replication-groups --query '${query}' --output json",
label: "Find all Redis Replication groups in the region",
returnStdout: true
)
readJSON(text: output)
}
def findEnvironmentReplicationGroups(region, environment, listOfRedisArns){
def correctArns = listOfRedisArns.findAll { arn ->
def tags = getRedisTags(region, arn).collectEntries { [it.Key, it.Value] }
tags.Environment == environment
}
correctArns
}
def getRedisTags(region, arn) {
def query = "TagList[?Key==`Environment`]"
def output = sh(
script: "aws --region ${region} elasticache list-tags-for-resource --resource-name ${arn} --query '${query}' --output json",
label: "Get tags for a Redis replication group",
returnStdout: true
)
readJSON(text: output)
}

最新更新