由于字符转义问题,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
我正在编写一个 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