我在Jenkins服务器上管理了一些Symfony 2/3项目,我正在部署到实时服务器。这是我目前的设置:
composer install
(prod模式,优化自动加载器)bower install
以获取我的资产gulp
构建,缩小并连接css / javascript(我们不使用资产)在构建之后,我归档构建的工件,而不使用vendor
,node_modules
和bower_components
文件夹作为zip文件使用“{{ 3}}“插件。
我使用“Compress Artifacts”插件和“Promoted builds”插件组合:如果我想要使用构建“上线”,我会通过SSH发布工件(我的zip文件)到名为staging_dir
的目录中的我的实时系统。文件上传后,我执行一些SSH命令:
staging_dir
composer install
(与构建期间相同的配置)bower install
并且gulp
构建不是必需的,因为我们使用在构建期间创建的资产)backup
文件夹staging_dir
我现在想收集部署的最佳实践:
vendor
文件夹转移到实时系统,而不是再次执行composer install
?bower install
和gulp
再次在实时系统上构建还是使用已发布的资产?答案 0 :(得分:24)
我和几位同事现在已经处理了这个问题很长一段时间了。当我们开始时,很难找到关于这个主题的好帖子。这就是为什么我想分享我们发现的工作"最好的"为了我们。
我们的一位客户拥有一个庞大而沉重的平台,用于管理他的业务流程(如ERP和CRM)。该平台最初是使用Symfony 2开发的,我们现在已经升级到Symfony 3.为了确保一切正常,该项目有大量的测试用例。我们还使用:
一旦有人提交我们的git服务器,一个钩子让Jenkins知道并触发构建。作业成功完成后,我们手动触发部署。这是通过登录客户端的机器并触发我们已经开发的脚本来完成的。
我们过去常常采用与您相同的方式 - 在jenkins完成作业后上传档案。然而,这被证明是非常有问题的,因为在某些情况下存档可能会被破坏(即由于jenkins实例和生产服务器之间的网络连接问题)。将文件从我们的服务器上传到客户端服务器也需要相当长的时间。这就是为什么我们决定使用git并从那里提取必要的版本。使用git证明更可靠,并确保您在客户端拥有项目的绝对副本。此外,回滚到以前的版本只有一个git checkout
远:)
由于我们大多数人已经拥有ant
和php
的使用经验,因此我们决定使用Phing并创建构建脚本并自动完成大部分常规任务。在构建脚本中,我们已经添加了我们一直运行的大多数常见任务,例如安装,升级,清除缓存,安装资产等。然后我们在每个生产服务器上提供此脚本。
一旦jenkins构建工作成功并且我们已手动发布&标记了产品的版本,我们通过SSH在客户端的计算机上运行phing update
(此步骤可能已自动执行但由于某些项目而故意不要求)。这个命令的作用是:
19a6d9
)进入下一步phing maintenance:on
(将平台设置为离线模式)git fetch origin 19a6d9
git checkout 19a6d9
phing composer:install
phing database:upgrade
(运行一些命令,包括数据库备份和doctrine:migrations:migrate
)phing assets
(运行bower install
,assetic
命令并将所有js / css编译为one.css
和one.js
)phing cache:clean
phing maintenance:off
(打开平台)我们的phing update
任务也被trycatch
包围,如果更新阶段遇到问题,它将自动进入回滚阶段。它通过phing rollback PREVIOUS_VERSION
命令完成:
git checkout PREVIOUS_VERSION
- 将fs恢复到之前的git版本phing composer:install
phing database:rollback PREVIOUS_VERSION
phing assets
phing report
(这会报告我们的问题跟踪器升级到附带日志文件的问题)是否要将bower_components
和vendor
文件夹转移到实时系统,而不是再次执行bower install
和composer install
?
bower install
和composer install
,因为在您第一次使用缓存后的所有内容之后。每次下一次运行几乎是瞬时的,或者至少比通过ftp一次又一次地重新上传所有资产快得多。这可能会为您节省一些带宽,最重要的是时间。如果您选择对我的设置进行类似的设置,您可能希望避免在Jenkins实例上使用compiling
js / css,因为您将在prod服务器上执行此操作。执行实时促销时如何处理密码?
设置主要取决于您的项目要求,您可用的资源(即vps,共享主机,git,ssh等)和您的发布过程。如您所见,我们的部署与您正在进行的部署略有不同。这并不是坏事也不好事 - 它只是满足我们的需要。如果你已经拥有的东西为你工作并解决了你所有的问题 - 你应该坚持下去并尝试优化它。如果你刚刚开始这是你应该最小心的事情:
完整 ... BACKUPS !备份生产文件系统很棒,但您还应备份数据库。在项目的开发过程中,您可能会拥有更改数据库的新功能。其中一些更改可能是向后不兼容的。因此,请确保备份所有内容,否则您最终可能会在没有数据库的情况下使用fs备份,因此无法回滚。
回滚 - 创建一个脚本,执行将项目回滚到先前版本的所有必要步骤。如果您承受了很大的压力,或者事情对时间敏感,您可能会无意中犯错误并打破备份或其他内容......因此请制作一个脚本来为您执行此操作。
在本地或测试计算机上测试部署过程,以确保在实际生产服务器上执行之前一切正常。
我希望这有助于您找到适合您的发布的最佳解决方案。部署过程。如果您碰巧找到了更好的解决方案,请将其作为答案发布 - 这肯定会有所帮助!