我有一个 Azure Release 管道,它只需将微服务的 Helm Chart 部署到 k8s 集群。我正在尝试使用 sed 命令通过模式匹配来修改请求和限制的值。我已经在本地测试了它,它可以工作,甚至在 bash 任务中运行它,并且
cat
在 helm 升级任务之前检查文件,并且它已正确完成。
例如,如果values.yaml 文件有此块
resources:
limits:
cpu: 4000m
memory: 4000Mi
requests:
cpu: 2000m
memory: 1500Mi
我运行这个:
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
事情是,在
helm upgrade
任务之后,我尝试再次 cat 该文件,发现它没有更改,并且原始版本仍然存在。我检查了所有任务中的路径,它是正确的。
我尝试使用多个 echo 命令
echo -e "resources:" >> values.yaml
echo -e " limits: \n cpu: 2000m\n memory: 2000Mi" >> values.yaml
echo -e " requests: \n cpu: 900m\n memory: 900Mi" >> values.yaml
令人惊讶的是它有效吗?我不知道为什么!
sed 命令在 Azure 发布管道中无法正常工作有什么原因吗?
编辑: 需要使用
-i
标志并且效果很好!
向社区发布解决方案和解释
将
-i
标志与 sed
命令一起使用是就地修改文件并确保后续 helm upgrade
任务拾取更改的正确方法。
-i
标志告诉sed
就地编辑文件,这意味着更改直接对文件进行,而不是输出到控制台。如果没有 -i
标志,sed
所做的更改只会输出到控制台,不会保存到文件中。
因此解决办法是
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
标志用于就地修改values.yaml
文件。然后使用 sed
命令修改文件的 cpu
和 memory
部分的 limits
和 requests
值。