【问题标题】:Sed failing to replace string in quotes during Gitlab CI在 Gitlab CI 期间 Sed 无法替换引号中的字符串
【发布时间】:2018-05-17 00:29:28
【问题描述】:

我正在尝试在我的 Dockerrun.aws.json 文件中动态设置 AWS Elastic Beanstalk 的图像名称和标签:

"Image": {
  "Name": "IMAGETAG",
  "Update": "true"
}

在我的 GitLab CI 文件中使用以下 sed 命令作为脚本:

sed -i.bak "s|IMAGETAG|$CONTAINER_TEST_IMAGE|" Dockerrun.aws.json && rm Dockerrun.aws.json.bak; eb deploy Production

其中$CONTAINER_TEST_IMAGE 是经过验证的良好环境变量(通过将echo $CONTAINER_TEST_IMAGE 作为脚本进行测试)。 $CONTAINER_TEST_IMAGE 包含以下内容的结构(其中 ... 是完整的 id):

gitlab.company.com:123/my-group/my-project:core_7de09851...8f_testing

我面临的问题是 sed 在 CI 管道期间不起作用。我不明白为什么考虑如果我在本地设置环境变量并运行相同的命令,它将成功地将 Name 的值替换为相同的结构 URL。此测试是在 Macbook 上完成的。

我知道它没有更新文件,因为 Gitlab CI 日志报告

WARN: Failed to pull Docker image IMAGETAG:latest, retrying...

我尝试了一些不起作用的方法:

  • 将sed 和eb deploy 命令作为单独的脚本运行(CI 文件中的两行不同)
  • 将我要在 Dockerrun.aws.json 中替换的变量切换为 <IMAGE>
  • 当它在 <IMAGE> 时,运行 sed -i='' "s|<IMAGE>|$CONTAINER_RELEASE_IMAGE|" Dockerrun.aws.json 而不是执行 .bak 然后 rm'ing (我在某处读到 sed 在 OSX 上与 -i='' 版本不一致)

有人对问题可能是什么以及如何解决有任何想法吗?

【问题讨论】:

  • 我面临着完全相同的问题。我正在尝试替换 gitlab ci 中的 java 文件中的一行。同样的作品在当地绝对没问题。您找到解决方案了吗?
  • @DineshKumar 我刚刚发布了解决方案,希望对您有所帮助!

标签: bash sed gitlab amazon-elastic-beanstalk gitlab-ci


【解决方案1】:

这有两个方面出了问题:

  1. sed 命令未在运行器上正确执行,但在本地运行
  2. eb deploy 忽略了更新的文件

对于第 1 部分,他的工作 sed 命令是:

sed -ri "s|\"IMAGETAG\"|\"$1\"|" Dockerrun.aws.json

Dockerrun.aws.json 中的行是 "Name": "IMAGETAG",。 sed 在这里仍然让我感到困惑,所以我无法解释为什么这个命令与原始命令相比有效。

对于第 2 部分,显然eb deploy 将始终查看最新提交(如果可以),而不是当前工作目录。有道理,我猜。为了解决这个问题,以eb deploy --staged 运行命令。您可以在 AWS's site 上阅读有关此标志的更多信息。

另外,请注意,我的 .gitlab-ci.yml 只是调用一个脚本来运行所有这些,而不是在那里执行。

- chmod +x ./scripts/ebdeploy.sh
- ./scripts/ebdeploy.sh $CONTAINER_TEST_IMAGE

【讨论】:

    猜你喜欢
    • 2017-06-07
    • 1970-01-01
    • 2015-02-26
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多