由于字符转义问题,Jenkins 管道中出现 MultipleCompilationErrorsException,您能找到问题所在吗?

MultipleCompilationErrorsException in Jenkins pipeline because of a character escaping issue, can you find the issue?

我正在编写一个 Jenkins 管道,它在 AWS ECS 上构建一个 docker 主机。

在build.gradle中我有以下几行:

imageSettings['Worker'] = [dockerImageName: 'ubi-celery-worker',   dockerImageTag: 'latest', inputDir: dockerWorkerOutputDir]
imageSettings['Flower'] = [dockerImageName: 'ubi-celery-flower',   dockerImageTag: 'latest', inputDir: dockerFlowerOutputDir]
imageSettings['Online'] = [dockerImageName: 'ubi-online-services', dockerImageTag: 'latest', inputDir: dockerOnlineOutputDir]

job配置了一个默认的环境参数dev,然后这三行是正确的。

我的任务是让这个作业能够部署到所有环境。

在 gradle 任务开始 运行ning 之前,如果环境名称不是 "dev",我需要更改这 3 行以向 [=53] 添加前缀=]ImageName.

示例:

这个值:"ubi-celery-worker"需要修改为:"product-env-ubi-celery-worker"

这是管道中我更改行的代码的相关部分:

sh("""
    sed -i "s|awsAccountId.*|awsAccountId=$AWS_ACCOUNT_ID|g" gradle.properties
    sed -i "s|awsRegion.*|awsRegion=$AWS_DEFAULT_REGION|g" gradle.properties
    for line in $(grep "\[dockerImageName" ubi-py-server/build.gradle | awk '{print $4}'| tr -d "\'\|,"); do imgname="product-${ENV}-${line}" ; echo $imgname ; sed -i "s|dockerImageName: '$line|dockerImageName: '$imgname|g" ubi-py-server/build.gradle ;done
""")

我说的是 sh 语句中的第三行。

$line 是 "for loop" 迭代器。

$ENV 是一个 groovy 参数。

如果我在 Jenkins 服务器的终端中 运行 它,它会正确编辑行并添加所需的前缀。

但是如果我通过 Jenkins 作业 运行 它,我会收到以下错误:

Started by user itai ganot

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 74: unexpected char: '\' @ line 74, column 32.
                                        for line in $(grep "\[dockerImageName" ubi-py-server/build.gradle | awk '{print $4}'| tr -d "\'\|,"); do imgname="atime-${ENV}-${line}" ; echo $imgname ; sed -i "s|dockerImageName: '$line|dockerImageName: '$imgname|g" ubi-py-server/build.gradle ;done
                                  ^

1 error

    at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
    at org.codehaus.groovy.control.ErrorCollector.addFatalError(ErrorCollector.java:150)
    at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:120)
    at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:132)

我试过的东西:

你能找到我哪里缺少正确的转义吗?

(没有 post 的代表作为评论。) 我发现将像这样的长而复杂的字符串分成更小的部分,然后使用字符串连接将它们组合成一个字符串以传递给 sh(或 bat)步骤很有帮助。

我已经成功修复了自己逃脱的角色,这是修复的行:

for line in $(grep "\[dockerImageName" ubi-py-server/build.gradle | awk '{print $4}'| tr -d "\'\|,"); do imgname="product-$ENV-$line" ; echo $imgname ; sed -i "s|dockerImageName: '$line|dockerImageName: '$imgname|g" ubi-py-server/build.gradle ;done