当前位置: 首页 > 面试题库 >

在git版本之间删除或修改的文件会自动从实例中删除

范飞翰
2023-03-14
问题内容

背景

我有一个由詹金斯触发的安装程序,内容如下:

  • 通过phing,与git服务器通信并git diff在单独的构建服务器中进行所需的git版本之间的准备来准备要部署的文件,而无需涉及AWS代码部署(据我所知)。phing版本由Jenkins触发。
  • 我仅将要添加/修改的文件(基于修订的git差异)动态添加到appspec.yml文件。我只准备要添加/修改到路径的文件,/home/jenkins/deployment/cd_deploy/codebase/并且/home/jenkins/deployment/cd_deploy/在Jenkins项目的“高级项目选项”下的“使用自定义工作区”选项下指定了路径,该路径基本上是构建服务器中需要上传到的位置。 S3存储桶。 请注意,我需要从两个git版本之间删除的实例中删除文件。
  • 然后,Jenkins使用有关应用程序名称,我已配置的代码部署的部署组的信息来触发AWS Codedeploy。

问题

我动态地添加到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

AWS
Codedeploy是否以某种方式与我的git托管进行了对话(我正在使用gitlab甚至没有使用github),并以某种方式获取有关要删除的文件的信息。

更新资料

后来我发现,即使从appspec.yml文件中完全删除了hooks部分,并从中央构建服务器(准备了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 -d /tmp/logwarn_hiphop_error /mnt/log/hiphop/error_`(date +'%Y%m%d')`.log #Just run a nagios check, so that counter corresponds to the line in the log corresponding to current timestamp/instant. Do not care about output. Note that we are not even looking for error hinting keywords (and hence not using -p because it needs to be used alongwith), because all we need to care about here is incrementing the nginx counter.

/usr/local/nagios/libexec/check_logwarn -d /tmp/logwarn_nginx_access /mnt/log/nginx/access_`(date +'%Y%m%d')`_`(date +'%H')`.log #Just run a nagios check, so that counter corresponds to the line in the log corresponding to current timestamp/instant. Acceptable http codes are also not being read from deployment_config.json.
printf "\n `date +%Y-%m-%d:%H:%M:%S` End of beforeInstall.sh"  >> /var/cake_1.2.0.6311-beta/deployment/deployment.log
exit 0

以及从上面调用的beforeInstall.php的内容-

<?php 
file_put_contents('/var/cake_1.2.0.6311-beta/deployment/deployment.log', "\n ".date("Y-m-d H:i:s")." - Load print  ".$argv[1], FILE_APPEND);
$loadData = json_encode(array("load" => intval($argv[1]), "access_error_check_day" => date("Ymd"), "access_error_check_hour" => date("H"))); //error_check_day -> day when nagios error check was last run. We will accordingly check log files of days in between this day and the day of afterinstall (practically this can include a span of 2 days).

file_put_contents("/var/cake_1.2.0.6311-beta/deployment/serverLoad.json",$loadData); //separate from deployment_config.json. serverLoad.json is not copied from build server.
file_put_contents('/var/cake_1.2.0.6311-beta/deployment/deployment.log', "\n ".date("Y-m-d H:i:s")." loadData to config ".$loadData, FILE_APPEND);
?>

问题答案:

CodeDeploy旨在部署应用程序,而不是简单地复制一组特定且不断变化的文件。

这样,在部署每个“修订”之前,CodeDeploy将首先清除由 先前 修订部署的所有文件。让我解释。

因此,假设以前的应用程序部署上传了三个文件:

File A
File B
File C

然后,下一个部署仅包含以下文件:

File A
File C

Code Deploy首先会 清理
它在第一个修订版(A,B和C)上部署的3个文件,然后部署新的修订版…它永远不会简单地上传预期的文件,它总是会首先清理旧文件(由查看之前的“修订”)。这很重要,因为它为您的案例中的神秘行为提供了一些启示。部署后的结果当然是:

File A
File C

现在,如果您已将文件 手动
添加到CodeDeploy之外的组合中,将变得很有趣。它只会清除它所知道的内容,并且如果此清除阶段未删除文件,它也不会覆盖当前版本中的文件。当人们手动安装应用程序,然后尝试将CodeDeploy部署到同一文件夹时,通常会出现这种情况。没有以前的版本,因此无需清除任何内容,然后尝试在现有文件之上复制并会出错。通常,您希望目标文件夹是“裸”的,以便您可以正确启动修订历史记录。

例如,在先前的情况下,如果您以前 手动 上传了文件A,B和C
,则文件A和B的部署将失败,因为它不知道先清除A,B和C,并且这将给您一个错误,试图覆盖文件A和B。

完全 不在 部署范围内的文件(或文件夹)…即不是任何修订版的一部分,比如说文件D
…在部署之前和之后都不会被更改并愉快地保留在那里。这对于放置数据文件和某些特定于部署的东西很有用,但这些东西不一定是您不想不断重新部署的代码库的一部分。

现在,您当然可以使用弯钩来做很多有趣的事情,但是感觉像是要完成工作的错误工具。这些挂钩旨在用于执行诸如停止/启动服务等操作,而不是管理CodeDeploy应该为您执行的工作的核心文件复制管理。

从应用程序规范中排除所有文件(即未指定文件),仅使用BeforeInstall和/或AfterInstall步骤执行复制逻辑是一种可能在某些情况下有效的方法。

无论如何,也许更好地了解CodeDeploy的运行方式可能会帮助您制定解决方案。我认为它没有特别有据可查的。我的理解来自我自己的观察和努力。



 类似资料:
  • 问题内容: 我有一个文本很长的字符串,并在里面。我正在尝试删除括号和方括号之间的字符,但是我不知道该怎么做。 该列表与此类似: 该列表不是我正在使用的列表,但非常相似,但简短得多。 谢谢您的帮助。 问题答案: 这应该适用于parens。正则表达式会“消耗”匹配的文本,因此不适用于嵌套的括号。 否则这将找到一组parens …只需循环以查找更多

  • 本文向大家介绍MongoDB修改、删除文档的域属性实例,包括了MongoDB修改、删除文档的域属性实例的使用技巧和注意事项,需要的朋友参考一下 由于本博使用的博客程序是边开发边使用的,所以开发过程中动态创建了某些现在不需要的属性 MongoDB 是无 Schema 的,不像关系数据库那样列属性定义在表而非记录中,MongoDB 的集合中的每个文档可以拥有各自不同的域属性。 MongoDB 中使用

  • 问题内容: 我有一个像这样的textfile.txt: 如何删除最舒适的前三行和最后一行? 问题答案:

  • 问题内容: 我只是想知道如何在php中删除一组括号和括号本身之间的文本。 范例: ABC(测试1) 我想删除(Test1),只离开ABC 谢谢 问题答案: 是基于Perl的正则表达式替换例程。该脚本的作用是匹配所有出现的右括号,后跟任意数量的字符 而不是 右括号,然后再次跟右括号,然后删除它们: 正则表达式细目:

  • 问题内容: 我在Maven中有5个模块的项目。现在,当我执行“ mvn全新安装”时,它将生成一个耳朵,其中包含两个罐子,一个war和一个来自其他模块的sar。 所有文件名都包含版本,例如projectx-ear-2.0.0.ear,projectx-client-2.0.0.jar等。 我需要重命名其中一个jars和最后一个耳朵,以省略文件名中的版本。它看起来应该像这样: 现在,我正在使用以下插件