在Gitlab CI期间,Sed无法替换引号中的字符串

时间:2018-05-17 00:29:28

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

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

// Start: Code Chunk A
function CustomError(foo, message, fileName, lineNumber) {
  var instance = new Error(message, fileName, lineNumber);
  instance.foo = foo;
  Object.setPrototypeOf(instance, Object.getPrototypeOf(this));
  if (Error.captureStackTrace) {
    Error.captureStackTrace(instance, CustomError);
  }
  return instance;
}
// End: Code Chunk A

// Start: Code Chunk B
CustomError.prototype = Object.create(Error.prototype, {
  constructor: {
    value: Error,
    enumerable: false,
    writable: true,
    configurable: true
  }
});
// End: Code Chunk B

// Start: Code Chunk C
// Is the following necessary?
if (Object.setPrototypeOf){
  Object.setPrototypeOf(CustomError, Error);
} else {
  CustomError.__proto__ = Error;
}
// End: Code Chunk C

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

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

其中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包含以下内容的结构(其中......是完整ID):

$CONTAINER_TEST_IMAGE

我面临的问题是sed在CI管道中不起作用。我无法理解为什么考虑如果我在本地设置环境变量并运行相同的命令,它将成功地将gitlab.company.com:123/my-group/my-project:core_7de09851...8f_testing 的值替换为相同的结构URL。这项测试是在Macbook上完成的。

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

Name

我尝试过一些不起作用的事情:

  • WARN: Failed to pull Docker image IMAGETAG:latest, retrying... sed命令作为单独的脚本运行(CI文件中的两行不同)
  • 将我想要在Dockerrun.aws.json中替换的变量切换为eb deploy
  • 当它在<IMAGE>时,运行<IMAGE>而不是运行.bak然后运行它(我在某处读取了某些地方,因为OSX与-i =''版本存在不一致)

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

1 个答案:

答案 0 :(得分:2)

这有两个方面出错:

  1. sed命令未在跑步者上正确执行,但在本地工作
  2. eb deploy忽略了更新的文件
  3. 对于第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