Jenkinsfile - 使用换行符从 shell 脚本创建输出

Jenkinsfile - Creating output from shell script with newlines

我目前正尝试在 Jenkins 的声明性管道中执行以下操作。我在一个文件中有一个证书,我想把它放在一个 kubernetes 秘密中。现在我的问题如下。

由于文件包含换行符,将其作为参数传递给 kubectl 将在那里结束输入,命令将失败。所以我需要逃避换行符。我的做法如下

  1. cat 文件并将其通过管道传输到
  2. base64
  3. 放置 \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);

将失败并出现错误

illegal string body character after dollar sign;

好的,这个很简单。我可以避开美元符号,但不幸的是,事情并没有就此结束。然后我会得到错误

sed: -e expression #1, char 10: unterminated `s' command

我可以继续尝试转义所有内容两次,这将使 sed 停止失败,但输出没有 \n,只是再次出现常规换行符。

关于如何在我的 sh 方法中正确使用此正则表达式的任何想法?

所以,3 个主要变体:

  1. 使用\
  2. 转义所有特殊符号(在你的例子中是$\
def b = sh(script: "cat ./certs/mycert.pem | base64 | sed ':a;N;$!ba;s/\n/\\n/g'", returnStdout: true)
  1. 使用dollar-slashy string quotation。在您的情况下,它无需额外的符号转义即可工作。
def b = sh(script: $/cat ./certs/mycert.pem | base64 | sed ':a;N;$!ba;s/\n/\n/g'/$, returnStdout: true)
  1. 在groovy
  2. 中写入需要的功能
def b = new File('./certs/mycert.pem').bytes.encodeBase64().toString()

不需要替换\n因为encodeBase64()returns单行base64值