You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Groovy脚本解析ECR YAML输出中repositoryName值失败的修复咨询

Groovy脚本解析ECR YAML输出中repositoryName值失败的修复咨询

嗨,我来帮你排查这个问题!你的脚本没正确拿到test-registry,主要有两个潜在问题:一是用awk直接处理YAML格式的输出太脆弱,YAML的缩进、换行变化很容易让正则匹配失效;二是你最后用tokenize().reverse()的操作可能把结果搞乱了。

下面给你两个靠谱的修复方案,你可以根据需求选择:

方案一:用YAML解析库(推荐,最可靠)

直接用Groovy可以调用的SnakeYAML库来解析完整的YAML输出,这是处理YAML格式的标准方式,不会因为输出格式的小变化出错。

@Grab('org.yaml:snakeyaml:2.0')
import org.yaml.snakeyaml.Yaml

def profile = "ecr"
def region = "us-east-1"

// 执行AWS命令并获取完整的YAML输出
def cmd = "aws ecr describe-repositories --profile $profile --region $region --output yaml".execute()
cmd.waitFor() // 等待命令执行完成
def yamlOutput = cmd.in.text

// 解析YAML内容为Groovy对象
def yamlParser = new Yaml()
def ecrData = yamlParser.load(yamlOutput)

// 从解析后的对象中提取所有仓库名称
def repoNames = ecrData.repositories.collect { it.repositoryName }

return repoNames

这个方案的好处是完全贴合YAML的结构,不管AWS输出的缩进怎么变,都能准确拿到repositoryName的值,而且如果有多个仓库,也能一次性全部提取出来。

方案二:调整awk命令(如果坚持用文本处理)

如果你不想引入额外的库,可以修改awk的匹配规则,同时去掉不必要的reverse()操作:

def profile = "ecr"
def region = "us-east-1"

def cmd_output = "aws ecr describe-repositories --profile $profile --region $region --output yaml".execute()
// 调整正则,匹配带缩进的repositoryName行,避免误匹配其他位置的字段
def awk_cmd_output = cmd_output | ['awk', '/^\\s*repositoryName:/ {print $2}'].execute()
awk_cmd_output.waitFor()
// 按换行分割,去掉空白行,得到干净的仓库名称列表
def repo_names = awk_cmd_output.text.trim().split("\n").findAll { it }

return repo_names

为什么原来的代码失效?

  1. 匹配规则问题:原始的awk正则/repositoryName:/没考虑YAML字段前的缩进,万一AWS输出的缩进变化就会匹配失败,还存在误匹配其他位置同名字段的风险;
  2. 结果处理错误:tokenize().reverse()会把所有提取到的文本按空格拆分成单词再反转,单仓库情况下可能勉强生效,但多仓库场景下结果顺序会完全混乱,这显然不是你想要的。

备注:内容来源于stack exchange,提问作者Peter Penzov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 13:50:30