我正在编写一个 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]
该作业配置了一个默认的环境参数dev,那么这三行是正确的。
我的任务是使这项工作能够部署到所有环境。
在 gradle 任务开始运行之前,如果环境名称不是“dev”,我需要更改这 3 行以向 dockerImageName 添加前缀。
例子:
此值:“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 clouse 中的第三行。
$line 是“for 循环”迭代器。
$ENV 是一个时髦的参数。
如果我在 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)
我试过的东西:
- 转义一些可疑的“$”符号,将双引号更改为单引号......没有任何帮助,我不断收到此错误。
你能找到我在哪里缺少正确的转义吗?