【问题标题】:Jenkinsfile - Creating output from shell script with newlinesJenkinsfile - 使用换行符从 shell 脚本创建输出
【发布时间】:2019-12-31 10:02:03
【问题描述】:

我目前正在尝试在 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);

将因错误而失败

美元符号后面的非法字符串主体字符;

好的,这很容易。我可以逃脱美元符号,但不幸的是事情并没有在这里结束。然后我会得到错误

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


【解决方案1】:

因此,3 个主要变体:

  1. 使用\ 转义所有特殊符号(在您的情况下为$\
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 中编写所需的功能
def b = new File('./certs/mycert.pem').bytes.encodeBase64().toString()

无需替换\n,因为encodeBase64()返回单行base64值

【讨论】:

  • Variant 3 实际上似乎是最干净的,不幸的是,在 Jenkinsfile 中默认允许使用这些 java 方法:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多