我正在尝试使用 AWS CodeDeploy 将我的最新更改从 Github 拉到服务器。我遇到的问题是在安装步骤中,我收到此错误:
Error CodeUnknownError
Script Name
MessageFile already exists at location /data/sites/wordpress/api_now_playing_staging.php
Log Tail
我的appspec.yml看起来像这样:
version: 0.0
os: "linux"
files:
- source: "/"
destination: "/data/sites/wordpress"
permissions:
- object: /data/sites/wordpress
pattern: "**"
owner: wp
group: nginx
mode: 755
type:
- file
我的问题是,如果它应该使用 CodeDeploy 拉取 git,为什么我得到文件已经存在错误?我做错了什么吗?
您是使用不同的部署组部署了相同的 git 存储库,还是之前手动部署的?如果目标文件夹中已存在相同的资源,CodeDeploy 将检查目标文件夹中的资源是否由同一部署组创建。如果使用相同的部署组,则重新部署不应导致此问题。
CodeDeploy 主机代理的当前工作方式是下拉部署工件,并根据 AppSpec 文件将它们移动到正确的存储库。即使从 Github 存储库部署,也不只是在目标文件夹中运行 git pull 。
所有其他答案都是正确的,但在我看来,无法解决您的问题。然而,它们是一个很好的起点。(简短:CodeDeploy 看到一个在以前的 CodeDeploy 中可能不存在的文件)
这在部署期间是可以解决的:"内容选项:选择 AWS CodeDeploy 在部署期间当目标实例上的文件与应用程序修订中的文件同名且目标位置相同时要执行的操作。
您可以选择失败、覆盖和保留。在您的情况下,覆盖可能是最佳选择。
找不到更多信息
-
docs.aws.amazon.com(奇怪的是在"回滚"下)
-
CLI docs.aws.amazon.com(请参阅 --文件存在行为(字符串))
由于该文件已经存在于服务器中,CodeDeploy 具有钩子 (BeforeInstall),可用于运行自定义脚本来清理现有文件,因为 codedeploy Install 不会覆盖文件(如果已经存在)。
我让它像这样工作:
由于各种原因,我有几个失败的部署。问题是 CD 保留在 EC2 实例和路径/opt/codedeploy-agent/deployment-root/中,一个由失败部署的 ID 命名的文件夹 [一个很长的字母数字刺痛]。删除此文件夹并创建新部署 [从 aws UI 控制台] 并重新部署应用程序。它现在应该成功。
注意:CD 不会重写文件 [尚未由其特定部署创建]
CodeDeploy 不会部署在已经有代码 [files] 的文件夹中,因为它不想干扰不同的 CD 部署和/或其他 CI/CD 工具 [如 Jenkins]。它仅在已使用特定部署部署代码的路径中进行部署。
您可以清空要进行部署的文件夹,并通过 CD 重新部署代码。