【发布时间】:2019-12-31 10:02:03
【问题描述】:
我目前正在尝试在 Jenkins 的声明性管道中执行以下操作。我在一个文件中有一个证书,我试图把它放在一个 kubernetes 秘密中。现在我的问题如下。
由于文件包含换行符,将其作为参数传递给 kubectl 将在此处结束输入,命令将失败。所以我需要逃避换行符。我的方法如下
- cat 文件并将其通过管道传输到
- base64
- 用 \n 代替换行符。
现在在 shell 中,这可以很好地工作
cat ./certs/mycert.pem | base64 | sed ':a;N;$!ba;s/\n/\\n/g'
但是试图在 Jenkinsfile 中使用它
sh(script: "cat ./certs/key.pem | base64 | sed ':a;N;$!ba;s/\n/\\n/g'", returnStdout: true);
将因错误而失败
美元符号后面的非法字符串主体字符;
好的,这很容易。我可以逃脱美元符号,但不幸的是事情并没有在这里结束。然后我会得到错误
sed: -e expression #1, char 10: unterminated `s' command
我可以继续尝试两次转义所有内容,这将使 sed 停止失败,但输出随后没有 \n 而只是常规换行符。
任何想法如何在我的 sh 方法中正确使用这个正则表达式?
【问题讨论】:
-
你必须逃脱
'$',并且每个'\'标志。奇怪的是,您尝试使用 base64 对 pem 文件进行编码,因为 pem-file 已经具有 base64 编码的内容。 ps:你可以用 groovy 代码替换它 -
另一种使用美元斜杠字符串的方法:docs.groovy-lang.org/latest/html/documentation/…。
$/cat ./certs/mycert.pem | base64 | sed ':a;N;$!ba;s/\n/\\n/g'/$。它应该适用于您的情况 -
为什么要将 pem 文件(已经是 base64 编码)转换为 base64?
-
这是因为在 Kubernetes 中,您需要在创建密钥时将值作为 base64 编码传递。即使它是一个证书(例如 -----BEGIN CERTIFICATE.. 没有编码)
-
非常感谢美元的大幅上涨。这正是我所需要的。您想将其添加为答案吗?我会接受的;)
标签: regex shell jenkins groovy jenkins-declarative-pipeline