Jenkinsfile 中的转义 sed-statement



我正在尝试在 jenkins 中编写管道脚本来构建 docker 映像并通过 helm 将其部署到 kubernetes。 图表和 docker-image 的版本号是一个 SemVer,附加了 git commit-hash 的缩写形式。 版本存储在 env VERSION 中,提交哈希存储在 env GIT_COMMIT_SHORT 中。

我想使用 sed 编辑 helm 图表的Chart.yamlvalues.yaml以匹配 docker 映像和图表版本的标签,例如 2.7.1-9fa6sof8 .

我试图在$VERSION$GIT_COMMIT_SHORT周围戴上大括号,但这没有成功。我试图用逃离$,但它不会解释环境。

用于编辑Chart.yaml的 sed 语句:

sh """sed -i 's/^version: .*$/version: $VERSION-$GIT_COMMIT_SHORT/' $CHART_NAME/Chart.yaml"""

我在 Jenkins 中看到的错误是:

sed -i s/^版本: .*$/版本: 2.7.1-9fa6sof8/ $CHART_NAME/Chart.yaml

sed:-e 表达式 #1,字符 39:未终止的"s"命令

我需要带有正确转义的语句。

您可以在三重单引号中使用 sed 命令,如下所示:

'''sed -i "s/^version: .*/version: $VERSION-$GIT_COMMIT_SHORT/" $CHART_NAME/Chart.yaml'''

通常,要在sed命令中插值变量,请使用双引号。不使用引号时,应将所有空格都引号括起来,并且可能需要添加其他更改(取决于选项、上下文等(。

.*与该行的所有其余部分匹配,此处的$是多余的。

试试 GNU sed

 sed -Ei 's!^(version: ).*$!12.7.1-9fa6sof8!' $CHART_NAME/Chart.yaml

我不知道真正的问题,-i可能会在 sh"...

最新更新