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

时间:2019-08-27 08:53:56

标签: regex shell jenkins groovy jenkins-declarative-pipeline

我目前正在尝试在Jenkins的声明式管道内部执行以下操作。我在文件中有一个证书,并且试图将其放入kubernetes秘密中。现在我的问题是以下。

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

  1. 捕获文件并将其通过管道传输到
  2. base64
  3. 放置\ n而不是换行符。

现在在外壳中,它可以正常工作

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表达式#1,字符10:未终止的“ s”命令

我可以继续尝试两次逃避所有操作,这将使sed停止失败,但是输出没有\ n,而只是常规换行符。

有什么想法可以在我的sh方法中正确使用此正则表达式吗?

1 个答案:

答案 0 :(得分:2)

因此,有3种主要变体:

  1. 使用drf转义所有特殊符号(在您的情况下为$\
\
  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编写所需的功能
def b = sh(script: $/cat ./certs/mycert.pem | base64 | sed ':a;N;$!ba;s/\n/\\n/g'/$, returnStdout: true)

无需替换def b = new File('./certs/mycert.pem').bytes.encodeBase64().toString() ,因为encodeBase64()返回单行base64值