Jac*_*ann 5 bash sed gitlab gitlab-ci amazon-elastic-beanstalk
我正在尝试在Dockerrun.aws.json文件中动态设置AWS Elastic Beanstalk的映像名称和标记:
"Image": {
"Name": "IMAGETAG",
"Update": "true"
}
Run Code Online (Sandbox Code Playgroud)
使用以下sed命令作为我的GitLab CI文件中的脚本:
sed -i.bak "s|IMAGETAG|$CONTAINER_TEST_IMAGE|" Dockerrun.aws.json && rm Dockerrun.aws.json.bak; eb deploy Production
Run Code Online (Sandbox Code Playgroud)
哪里$CONTAINER_TEST_IMAGE是经过验证的良好环境变量(通过echo $CONTAINER_TEST_IMAGE作为脚本进行测试).$CONTAINER_TEST_IMAGE包含以下内容的结构(其中...是完整ID):
gitlab.company.com:123/my-group/my-project:core_7de09851...8f_testing
Run Code Online (Sandbox Code Playgroud)
我面临的问题是sed在CI管道中不起作用.我无法理解为什么考虑如果我在本地设置环境变量并运行相同的命令,它将成功地将值替换Name为相同的结构URL.该测试在Macbook上完成.
我知道它没有更新文件,因为Gitlab CI日志报告
WARN: Failed to pull Docker image IMAGETAG:latest, retrying...
Run Code Online (Sandbox Code Playgroud)
我尝试了一些不起作用的东西:
sed和eb deploy命令作为单独的脚本运行(CI文件中的两个不同的行)<IMAGE><IMAGE>运行sed -i='' "s|<IMAGE>|$CONTAINER_RELEASE_IMAGE|" Dockerrun.aws.json而不是运行.bak然后运行它(我在某处看到,在OSX上使用-i =''版本的sed存在不一致)有没有人对问题可能是什么以及如何解决有任何想法?
这件事有两个方面出了问题:
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 网站上阅读有关此标志的更多信息。
另请注意,我的 .gitlab-ci.yml 只是调用一个脚本来运行所有这些,而不是在那里执行。
- chmod +x ./scripts/ebdeploy.sh
- ./scripts/ebdeploy.sh $CONTAINER_TEST_IMAGE
Run Code Online (Sandbox Code Playgroud)