部署策略,PHP + SVN

7
我想讨论一下我们的部署策略,并找出其中的不足之处。具体流程如下:
- > 开发完成某版本 - > 所有开发人员将文件提交到主干 - > 使用TOAD比较数据库模式并迁移更改 - > 在SVN上创建一个新分支 - > 使用SVN导出(以删除.svn文件夹等) - > 压缩JS、CSS文件 - > 上传到测试服务器 - > 进行测试循环 - > 在分支上修复错误并进行验证 - > 如果需要,重新压缩JS、CSS文件 - > 上传到生产服务器 - > 当我说上传时,是指通过SSH将文件上传到/var/www/html目录 - > 先上传JS、CSS和图像文件 - > 然后上传php文件 - > 在上传过程中排除用户上传的图片等目录。 - > 进行测试循环 - > 修复错误并重新上传(可能需要重新压缩 - 几个文件) - > 验证错误 - > 验证完成 - > 将分支提交到svn - > 合并更改到主干 - > 提交主干 [在此部署周期内,没有人提交任何文件到主干]
这个过程非常复杂,需要多加注意。您有什么建议可以改进它吗?

要求开发人员每天至少提交一次代码。使用模式管理器自动迁移数据库更改并在版本控制系统中进行版本控制。使用持续集成服务器和类似Phing的构建工具。浏览一下Stack Overflow,这些主题以前已经讨论过了。 - Gordon
2个回答

2
我使用以下部署路径。它可以减少您在不同目录中重新上传文件的需求。在初始设置之后,您需要做的最复杂的工作是在每个测试位置上执行“svn update”命令。
此设置假定您使用配置文件来指向诸如资产、图像和 CSS 等目录。
1. 初始化存储库。始终为生产和测试检出使用唯一用户。这允许从实时服务器返回到主干的唯一提交,以应对紧急情况。 2. 开发人员进行开发和提交。构建标记有构建号,以及当它们准备好项目时标记为 LIVE。 3. 在测试服务器上进行检出。如果一切顺利,则为 #dev.example.com/~test/project/。 4. 在生产服务器上将 svn 更新到测试目录。#example.com/~test/project 5. 将 svn 更新到生产服务器上的主项目目录以获取 LIVE 标记。#example.com 6. 如果步骤 3 到 5 中有任何异常,请返回步骤 2。
所有项目都有一个配置文件,允许您设置开发数据库、共享图像等路径。config.dist.php 可以作为命名模式。然后每个检出将 config.dist.php 复制到 config.php。这样可以在没有 SVN 冲突的情况下创建多个配置文件。
每个配置文件通常都有一些代码,例如:
<?php
    #hopefully, your project can leave these first two constants set to '', because relative paths work for everything
         define('localPath', '/home/www/projectName');
         define('baseURL', 'http://example.com/~projectName');

    #if you want to write everything over a shared filesystem for instance, uploads.
         define('localAssetsDirectory', '/sharedFileSystem/localPath');

    #if you want to include a shared assets directory
         define('assetsURL', 'assets/images');

    #OR if you want to host assets in one location.
         define('assetsURL', 'http://assets.example.com/images/'    
 ?>

生产和开发服务器上的所有测试版本只能被限制IP访问,同时被放置在.htaccess文件后面。Apache被配置为不提供.svn目录。


是的,我认为这个模型很有道理,我也在考虑同样的方案。我们可以在办公室里搭建一个SVN服务器,生产服务器和暂存服务器从主仓库获取SVN更新。此外,我们已经有了像这样的配置文件。不过还是谢谢你的回复 :) - Ahmad
+1,这正是你应该做的事情!此外,只需在其他服务器上执行svn更新即可实现负载均衡服务器之间的复制。 - davidosomething

0
如果你正在使用单元测试(例如Selenium),则可以使用构建工具来编写所有这些脚本。
否则,我会编写以下步骤的脚本:
  • 使用SVN导出(以删除.svn文件夹等)
  • 缩小JS、CSS
  • 上传到暂存服务器

  • 重新缩小JS、CSS [如果需要]
  • 上传到生产服务器
  • 当我说上传时,它意味着通过SSH将文件上传到/var/www/html文件夹
  • 首先上传js、css、图像
  • 然后上传php文件
  • 在上传期间排除用户上传的图片等目录。

由于您已经进行了分支和合并,因此您应该始终保持主干是具有最新功能的稳定版本。最后,为每个发布版本打标签。


上传时如何实现原子性?因为在上传过程中网站有可能会崩溃。我应该上传到其他文件夹吗?然后再将它们复制到服务器上?这个操作虽然有点优化,但可能会带来自己的问题,比如设置权限等。 - Ahmad
主干应该只与100%工作的分支合并。您可以导出主干和当前分支之间的更改文件,以创建要上传的文件集。 - davidosomething

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接