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