Azure发布流水线中sed修改values.yaml后Helm upgrade未生效
Azure Release Pipeline中sed修改Helm values.yaml后未持久化的问题解决
问题场景
在Azure Release Pipeline中部署微服务Helm Chart到K8s集群时,使用sed命令匹配模式修改values.yaml内的resources请求和限制值:
- 本地测试sed命令有效
- Pipeline的Bash任务执行后,用cat检查文件显示修改正确
- 但helm upgrade任务执行后,文件恢复为原版本,路径验证无误
- 改用echo方式修改文件则能正常生效
原values.yaml配置块
resources: limits: cpu: 4000m memory: 4000Mi requests: cpu: 2000m memory: 1500Mi
执行的原始sed命令
sed -e '/limits:/,/requests:/ s/\(cpu: \)[^ ]*/\12000m/' \ -e '/limits:/,/requests:/ s/\(memory: \)[^ ]*/\12000Mi/' \ -e '/requests:/,/limits:/ {s/\(cpu: \)[^ ]*/\1900m/; s/\(memory: \)[^ ]*/\1900Mi/;}' values.yaml
期望修改结果
resources: limits: cpu: 2000m memory: 2000Mi requests: cpu: 900m memory: 900Mi
问题原因
sed命令默认仅将修改结果输出到标准输出,不会直接修改原文件。本地测试时可能习惯添加-i参数,但Pipeline中的命令遗漏了该参数,导致修改仅在临时输出中生效,并未写入原文件,因此helm upgrade读取的仍是未修改的原始配置。
解决方法
给sed命令添加-i参数(原地编辑文件的参数),修改后的命令如下:
sed -i -e '/limits:/,/requests:/ s/\(cpu: \)[^ ]*/\12000m/' \ -e '/limits:/,/requests:/ s/\(memory: \)[^ ]*/\12000Mi/' \ -e '/requests:/,/limits:/ {s/\(cpu: \)[^ ]*/\1900m/; s/\(memory: \)[^ ]*/\1900Mi/;}' values.yaml
添加-i后,sed会直接修改values.yaml文件,修改结果被持久化,后续helm upgrade即可读取到正确的配置。
内容的提问来源于stack exchange,提问作者Ahmed Samir
相关产品推荐
相关产品推荐

