因此,用基本的shell脚本编写Groovy似乎比实际困难得多。
我有一条管道,需要在运行打包程序命令后替换文件中的条目。在与packer命令相同的shell脚本中执行此操作似乎是明智的做法,因为即使在导出脚本时,变量也不会在shell脚本之外提供。
问题是sed命令需要在转义时转义,但仍然无法正常工作。因此,这就是詹金斯管道语法生成器的建议:
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 Job shell中运行的原始sed命令是:
sed -i.bak 's!aws_ami_app = \".*\"!aws_ami_app = \"'"${AMI_APP}"'\"!' ${WORKSPACE}/platform/terraform/env-${ENV}/env.auto.tfvars
答案 0 :(得分:1)
因为您将Shell脚本放入了'''
内,所以不会触发Groovy String interpolation。
因此,您无需转义任何字符,就像在Shell cmd窗口中键入时一样编写脚本。
下面是示例:
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