Jenkinsfile - 使用换行符从 shell 脚本创建输出
Jenkinsfile - Creating output from shell script with newlines
我目前正尝试在 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);
将失败并出现错误
illegal string body character after dollar sign;
好的,这个很简单。我可以避开美元符号,但不幸的是,事情并没有就此结束。然后我会得到错误
sed: -e expression #1, char 10: unterminated `s' command
我可以继续尝试转义所有内容两次,这将使 sed 停止失败,但输出没有 \n,只是再次出现常规换行符。
关于如何在我的 sh 方法中正确使用此正则表达式的任何想法?
所以,3 个主要变体:
- 使用
\
转义所有特殊符号(在你的例子中是$
和\
)
def b = sh(script: "cat ./certs/mycert.pem | base64 | sed ':a;N;$!ba;s/\n/\\n/g'", returnStdout: true)
- 使用dollar-slashy string quotation。在您的情况下,它无需额外的符号转义即可工作。
def b = sh(script: $/cat ./certs/mycert.pem | base64 | sed ':a;N;$!ba;s/\n/\n/g'/$, returnStdout: true)
- 在groovy
中写入需要的功能
def b = new File('./certs/mycert.pem').bytes.encodeBase64().toString()
不需要替换\n
因为encodeBase64()
returns单行base64值
我目前正尝试在 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);
将失败并出现错误
illegal string body character after dollar sign;
好的,这个很简单。我可以避开美元符号,但不幸的是,事情并没有就此结束。然后我会得到错误
sed: -e expression #1, char 10: unterminated `s' command
我可以继续尝试转义所有内容两次,这将使 sed 停止失败,但输出没有 \n,只是再次出现常规换行符。
关于如何在我的 sh 方法中正确使用此正则表达式的任何想法?
所以,3 个主要变体:
- 使用
\
转义所有特殊符号(在你的例子中是
$
和\
)
def b = sh(script: "cat ./certs/mycert.pem | base64 | sed ':a;N;$!ba;s/\n/\\n/g'", returnStdout: true)
- 使用dollar-slashy string quotation。在您的情况下,它无需额外的符号转义即可工作。
def b = sh(script: $/cat ./certs/mycert.pem | base64 | sed ':a;N;$!ba;s/\n/\n/g'/$, returnStdout: true)
- 在groovy 中写入需要的功能
def b = new File('./certs/mycert.pem').bytes.encodeBase64().toString()
不需要替换\n
因为encodeBase64()
returns单行base64值