我正在尝试在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文件中的两行不同)eb deploy
<IMAGE>
时,运行<IMAGE>
而不是运行.bak然后运行它(我在某处读取了某些地方,因为OSX与-i =''版本存在不一致) 有没有人对问题可能是什么以及如何解决这个问题有任何想法?
答案 0 :(得分:2)
这有两个方面出错:
sed
命令未在跑步者上正确执行,但在本地工作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