代码之家  ›  专栏  ›  技术社区  ›  SnazzyBootMan

Jenkins管道中带有sed命令的Groovy shell脚本

  •  -1
  • SnazzyBootMan  · 技术社区  · 6 年前

    因此,用基本的shell脚本编写Groovy似乎比实际要困难得多。

    问题是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命令获得变量的正确方法是什么?

    编辑

    sed -i.bak 's!aws_ami_app = \".*\"!aws_ami_app = \"'"${AMI_APP}"'\"!' ${WORKSPACE}/platform/terraform/env-${ENV}/env.auto.tfvars
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   yong    6 年前

    因为你把外壳脚本放进去了 ''' Groovy String interpolation .

    下面是示例:

        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
        '''
    

    詹金斯控制台输出:

    [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