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
为什么原来的代码失效?
- 匹配规则问题:原始的
awk正则/repositoryName:/没考虑YAML字段前的缩进,万一AWS输出的缩进变化就会匹配失败,还存在误匹配其他位置同名字段的风险; - 结果处理错误:
tokenize().reverse()会把所有提取到的文本按空格拆分成单词再反转,单仓库情况下可能勉强生效,但多仓库场景下结果顺序会完全混乱,这显然不是你想要的。
备注:内容来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

