yq介绍

在开始使用yq之前,我们首先需要安装它。当你在谷歌上搜索yq时,你会发现两个项目/存储库。

首先,在https://github.com/kislyuk/yq是jq(JSON处理器)的包装器。如果你已经熟悉jq,你可能想抓住这个,使用你已经知道的语法。

不过,在本文中,我们将使用https://github.com/mikefarah/yq 这个版本,这个版本没有100%匹配jq语法,但它的优点是它没有依赖性(不依赖于jq),有关差异的更多上下文,请参阅下面的GitHub问题。

https://github.com/mikefarah/yq/issues/193

mikefarah版本的yq的具体用法参见文档:https://mikefarah.gitbook.io/yq/

工作实践

业务需求

由于公司产品需要部署在无网环境,所以需要制作适配各个组件的离线安装源,包括rpm/apt之类的系统相关软件包,以及各个二进制/压缩包之类的离线文件,原来是做法是统一将所有的离线源统一整合到一个yml文件当中去,现在的做法是将一个名为packages.yaml的文件放到各个组件的工程里,通过git下载然后进行聚合生成最后的全量列表。

聚合之前,通过生成一个config.yaml来进行选择哪些组件的聚合,下面是全量的配置:

通过流水线传参,生成以分号为分隔符的参数,来自定义生成config_custom.yaml:

解析:

由于yq的contains不支持多个匹配,所以在这里用到了test来测试是否包含以‘|’分隔的多个字符

del的用法:

用del删除之前,先要能查询打印出需要删除的部分,才能进一步使用del删除,如:

如果选择了只生成middleware和paas-installer, 则先查出不包含middleware和paas-installer的部分:

然后调用del删除:

 

如果只选择了paas,nginx和redis,则需再次筛选, 只保留middleware大类下的小类,如’redis, nginx’:

 

 

 

 

    osInfo=$(awk ‘BEGIN{split(“‘${os_names}'”, arr, “,”);for(key in arr) if(arr[key] ~ “ubuntu”) print arr[key]”:apt”;else print arr[key]”:yum”}’)

最后生成的格式如下:

需要再次通过yq来进行提取过滤:

  • 提取不需要配repo的以及带arch=amd64/x86_64或不带key为arch的列表:

其中-o=j表示输出是json格式,-I=0代表sets indent level for output为0,默认是2,输出结果是:

  • 提取需要配repo的(带key为repo的)以及带arch=amd64/x86_64或不带key为arch的列表:

因为rhel 8的docker repo不同,聚合生成了好几个带repo的docker安装列表:

需要只提取rhel安装用的:

下面是构建过程中用的Dockerfile:

 

Categories: PROGRAMMING

0 Comments

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *