Groovy shell 在 Jenkins 管道中使用 sed 命令的脚本
Groovy shell script with a sed command in a Jenkins Pipeline
所以用基本的 shell 脚本编写 Groovy 似乎比实际应该的要困难得多。
我有一个管道需要在 运行 加壳命令之后替换文件中的条目。在与 packer 命令相同的 shell 脚本中执行此操作似乎是明智的,因为变量在 shell 脚本之外不可用,即使在导出时也是如此。
问题是 sed 命令需要一次又一次地转义,但仍然不起作用。所以这就是 Jenkins 管道语法生成器的建议:
parallel (
"build my-application" : {
sh '''#!/bin/bash
export PATH=$PATH:~/bin
cd ${WORKSPACE}/platform/packer
packer build -machine-readable template.json | tee packer.out
AMI_APP=$(grep amazon-ebs,artifact,0,id,eu-west-2:ami- packer.out | awk -F: \'{ print $NF }\')
[[ ! ${AMI_APP} ]] && exit 1
sed -i.bak \'s!aws_ami_app = \".*\"!aws_ami_app = \"\'"${AMI_APP}"\'\"!\' ${WORKSPACE}/platform/terraform/env-${ENV}/env.auto.tfvars
'''
},
"build some-more-apps" : {
sh ''' *** same again different name ***
'''
}
)
获取变量的正确方法是在 groovy 中的 bash 脚本 运行 中使用 sed 命令?
关于 Jenkins、groovy 和 bash 的正确语法的任何提示 - 任何实际有用的文档?
编辑
在 Jenkins 作业 shell 中 运行 的原始 sed 命令是:
sed -i.bak 's!aws_ami_app = \".*\"!aws_ami_app = \"'"${AMI_APP}"'\"!' ${WORKSPACE}/platform/terraform/env-${ENV}/env.auto.tfvars
因为您将 shell 脚本放在 '''
中,不会触发 Groovy String interpolation。
所以你不需要转义任何字符,当你输入 Shell cmd window.
时编写脚本
示例如下:
sh '''#!/bin/bash +x
echo "aws_ami_app = docker.xy.com/xy-ap123/conn:7et45u.1.23" > test.txt
echo "cpu = 512" >> test.txt
cat test.txt
AMI_APP=docker.xy.com/xy-ap123/conn:7et45u.1.25
sed -i 's,aws_ami_app.*,aws_ami_app = '"$AMI_APP"',' test.txt
cat test.txt
'''
jenkins 控制台中的输出:
[Pipeline] sh
[poc] Running shell script
aws_ami_app = docker.xy.com/xy-ap123/conn:7et45u.1.23
cpu = 512
aws_ami_app = docker.xy.com/xy-ap123/conn:7et45u.1.25
cpu = 512
所以用基本的 shell 脚本编写 Groovy 似乎比实际应该的要困难得多。
我有一个管道需要在 运行 加壳命令之后替换文件中的条目。在与 packer 命令相同的 shell 脚本中执行此操作似乎是明智的,因为变量在 shell 脚本之外不可用,即使在导出时也是如此。
问题是 sed 命令需要一次又一次地转义,但仍然不起作用。所以这就是 Jenkins 管道语法生成器的建议:
parallel (
"build my-application" : {
sh '''#!/bin/bash
export PATH=$PATH:~/bin
cd ${WORKSPACE}/platform/packer
packer build -machine-readable template.json | tee packer.out
AMI_APP=$(grep amazon-ebs,artifact,0,id,eu-west-2:ami- packer.out | awk -F: \'{ print $NF }\')
[[ ! ${AMI_APP} ]] && exit 1
sed -i.bak \'s!aws_ami_app = \".*\"!aws_ami_app = \"\'"${AMI_APP}"\'\"!\' ${WORKSPACE}/platform/terraform/env-${ENV}/env.auto.tfvars
'''
},
"build some-more-apps" : {
sh ''' *** same again different name ***
'''
}
)
获取变量的正确方法是在 groovy 中的 bash 脚本 运行 中使用 sed 命令?
关于 Jenkins、groovy 和 bash 的正确语法的任何提示 - 任何实际有用的文档?
编辑
在 Jenkins 作业 shell 中 运行 的原始 sed 命令是:
sed -i.bak 's!aws_ami_app = \".*\"!aws_ami_app = \"'"${AMI_APP}"'\"!' ${WORKSPACE}/platform/terraform/env-${ENV}/env.auto.tfvars
因为您将 shell 脚本放在 '''
中,不会触发 Groovy String interpolation。
所以你不需要转义任何字符,当你输入 Shell cmd window.
示例如下:
sh '''#!/bin/bash +x
echo "aws_ami_app = docker.xy.com/xy-ap123/conn:7et45u.1.23" > test.txt
echo "cpu = 512" >> test.txt
cat test.txt
AMI_APP=docker.xy.com/xy-ap123/conn:7et45u.1.25
sed -i 's,aws_ami_app.*,aws_ami_app = '"$AMI_APP"',' test.txt
cat test.txt
'''
jenkins 控制台中的输出:
[Pipeline] sh
[poc] Running shell script
aws_ami_app = docker.xy.com/xy-ap123/conn:7et45u.1.23
cpu = 512
aws_ami_app = docker.xy.com/xy-ap123/conn:7et45u.1.25
cpu = 512