在Jenkins管道中使用sed命令的Groovy Shell脚本

时间:2018-08-14 13:01:17

标签: jenkins groovy jenkins-pipeline packer jenkins-groovy

因此,用基本的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

1 个答案:

答案 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