我正在尝试使用AWS CodeDeploy将我最新的更改从Github下拉到服务器.我遇到的问题是在安装步骤我收到此错误:
Error CodeUnknownError
Script Name
MessageFile already exists at location /data/sites/wordpress/api_now_playing_staging.php
Log Tail
Run Code Online (Sandbox Code Playgroud)
我的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
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果git假设是使用CodeDeploy拉,为什么我的文件已经存在错误?难道我做错了什么?
背景
我有一个由Jenkins触发的设置,其中包括:
git diff在单独的构建服务器之间进行所需的git修订,而不涉及AWS代码部署(据我所知)来准备的.詹金斯触发了phing构建./home/jenkins/deployment/cd_deploy/codebase/并/home/jenkins/deployment/cd_deploy/在Jenkins项目的"高级项目选项"下指定了"使用自定义工作区"选项下的路径,该选项基本上是构建服务器中需要上传到的位置S3桶.请注意,我需要从两个git修订版之间删除的实例中删除文件.问题
我动态添加到appspec.yml文件的文件正在EC2实例中进行修改/添加,但是,奇怪的是,要删除的文件也会被删除.我验证了我没有逻辑删除我在appspec文件的beforeInstall钩子中编写的文件.我的beforeInstall挂钩中只有一个beforeInstall.sh文件,没有其他挂钩.一旦我从appspec文件中删除该挂钩,删除就会停止.这是我的appspec文件 -
version: 0.0
os: linux
files:
{Pair of files dynamically generated}
- source: config/deployment_config.json
destination: /var/cake_1.2.0.6311-beta/deployment
permissions:
- object: .
pattern: "**"
owner: sandeepan
group: sandeepan
mode: 777
type:
- file
hooks:
BeforeInstall:
- location: beforeInstall.sh
Run Code Online (Sandbox Code Playgroud)
AWS Codedeploy以某种方式与我的git托管(我正在使用gitlab而不是github)进行交谈,并以某种方式获取有关要删除的文件的信息.
更新
我后来观察到,即使从appspec.yml文件中完全删除了钩子部分,并从中央构建服务器(准备好S3捆绑包)中删除了相应的.sh文件,即beforeInstall.sh,afterInstall.sh等,所以我的逻辑和对它的任何引用都没有进入实例,要删除的文件仍然会被自动删除.
更新2
今天我发现在git版本之间修改的文件也会被自动删除. 我有动态准备appspec.yml文件的逻辑.我修改为不添加一些文件.因此,有一些文件存在于git diff中,但在appspec文件中没有.结果,它们被删除但不再出现.似乎代码部署在部署之前自动进行清理.我怎么阻止它?我想添加我的自定义清理逻辑.
更新3
beforeInstall.sh的内容 -
OUTPUT="$(w | grep -Po '(?<=load average: )[^,]*')"
rm -f /var/cake_1.2.0.6311-beta/deployment/deployment_config.json
path="$PWD"
php $path"/deployment-root/"$DEPLOYMENT_GROUP_ID"/"$DEPLOYMENT_ID"/deployment-archive/beforeInstall.php" ${OUTPUT}
/usr/local/nagios/libexec/check_logwarn …Run Code Online (Sandbox Code Playgroud) 当我通过 Jenkins(代码部署插件)触发时,出现以下错误 -
No such file or directory - /opt/codedeploy-agent/deployment-root/edbe4bd2-3999-4820-b782-42d8aceb18e6/d-8C01LCBMG/deployment-archive/appspec.yml
Run Code Online (Sandbox Code Playgroud)
但是,如果我直接通过代码部署触发部署到同一个部署组中,并在S3中指定相同的zip(通过Jenkins触发器获得),则此步骤通过。
这是什么意思,我如何找到解决方法?我目前正在整合一些东西,因此需要同时通过代码部署和 Jenkins 进行部署。当我需要确保较小的单元运行良好时,我将运行代码部署触发部署。
更新
只是提到另一点,以防万一。我以前在同一个 ec2 实例上使用不同的 codedeploy“应用程序”和“部署组”,并直接使用 jenkins 和代码部署进行部署。为了解决一些问题(据称,由于部署失败,不允许覆盖现有文件),我删除了/opt/codedeploy-agent/deployment-root/<directory containing deployments>目录中的所有内容,试图按照这个答案中提到的内容进行操作。但是,请注意,我只删除了该目录中的项目。此后,我开始收到此错误 appspec.yml not found in deployment archive。所以,然后我创建了一个新的应用程序和部署组,从那时起,我就致力于它。
因此,要考虑的另一点是我是否应该做一些进一步的清理,如果 jenkins 触发的部署仍然受到这些删除的影响(即使它指的是新的应用程序和部署组)。