0

我正在编写一个 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)

我试过的东西:

  • 转义一些可疑的“$”符号,将双引号更改为单引号......没有任何帮助,我不断收到此错误。

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

4

2 回答 2

0

我已经设法修复了逃避自己的角色,这是固定的线:

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
于 2018-02-01T16:30:49.333 回答
0

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

于 2018-02-01T16:23:37.443 回答