SVN Web开发工作流程

时间:2010-11-17 23:06:33

标签: php svn workflow

我已经阅读了有关此问题的SO上的许多问题,但我找不到适合我们情况的任何好建议。我继承了这个工作流程,我正努力让它变得更好。

我们的设置

  • PHP代码库(特别是Kohana)
  • 代码库功能~60个站点,每个站点都有独特的模板(即60个QA [质量保证]域名)
  • 每个站点都有不同资产和资源的A记录(即每个域的8个A记录)
  • 3位开发人员
  • 3名设计师
  • 开发人员拥有用于本地开发的生产服务器的VMware映像
  • 设计师不
  • 用于QA的共享物理开发服务器,提交后更新始终将此服务器保持在主干的当前HEAD
  • 生产服务器,根据实时功能更新为不同版本的混合搭配

我们的工作流程

  • 开发人员在本地工作,直到完成给定功能,然后将整个功能提交到主干以进行内部质量检查。
  • 设计师仅对CSS /图像/模板进行少量更改。他们直接提交trunk,QA自己的更改,并在他们的质量保证后立即更新生产服务器上的相应文件。
  • 当功能准备好上线时,生产服务器会手动更新为与该功能相关的每个文件的正确版本号。有时这很简单,有时它非常多毛(很多svn log调用来寻找上游依赖项)。

我们的问题

  • 由于三个不同的开发人员正在处理需要不同QA数量的不同功能,我们发现自己会定期遇到上游依赖问题。
  • 在任何给定时间,我们都没有办法以编程方式确定哪些功能在生产服务器上,哪些功能不在。 svn status -u会告诉我们哪些文件不是最新的,但通常不是一个清晰的功能图片。

我所知道的

  • 我们的一些问题可以通过设立生产部门来缓解。我们至少可以监控哪些功能被添加到生产中以及何时,虽然这不会解决上游依赖问题。
  • 功能分支是一个选项,我们在过去尝试过。由于我们的软件每个分支需要60个QA域,因此我们遇到了流程管理问题。例如,为每个功能分支创建480个(每个域60个域x 8个记录)A记录。
  • 开发者分支也是一种选择,但我们的功能QA时间有所不同。我不能肯定地说,在我需要提交其他内容之前,之前的功能将不在QA中。

上游依赖关系示例

  • 开发人员A在管理员和前端添加了新的幻灯片功能。
  • 开发人员B在管理员和前端都添加了新的反馈功能。
  • 这两个功能都与位置模型/控制器逻辑交织在一起,因此对这些相关文件进行了更改以考虑这两个新功能。
  • 幻灯片放映功能进入质量保证,但受到某些发展监督或范围蔓延的影响。
  • 反馈功能进入QA并且没有问题。
  • 我们希望遵循时间表并将反馈功能推送到生产中,但我们无法直接执行,因为这两个功能都需要更改位置模型/控制器。也就是说,我们不能只做svn update file1 file2 file3
  • 注意: 这是一个简单的示例,可以通过执行一些反向合并来解决它。我们的问题经常比这复杂。

多网站结构信息

  • 我们有许多预定义的结构主题,包括视图,图像,CSS文件,JS文件等。
  • 为每个网站分配一个主题。
  • 出于品牌和可扩展性的原因,每个站点都可以使用自定义视图覆盖主题视图,或者包含其他特定于站点的CSS / JS文件。

我确信还有其他一些人在努力解决类似的问题,我希望能从互联网上的聪明人那里获得一些见解。如果我说的话似乎很清楚,请随时提问!

2 个答案:

答案 0 :(得分:1)

好的,有几点想法:

对于这种工作流程,使用带有流模型的SCM(如Accurev或ClearCase)可以做得更好。在流模型中,工作从每个开发人员的流流向集成流,然后流向QA流,然后发布流(或任何最佳工作流)。只有准备好进入下一阶段的工作才会升级,并且可以单独完成这些工作。

正如deceze所说,您需要更加模块化地分解,但您还需要将其与本地化系统相结合,其中特定于客户端的功能可以覆盖代码的特定部分。我在PHP中完成的一种方法是实现一个PHP文件导入包装器,它首先查找特定于客户端的PHP文件版本,如果它不存在,则加载通用版本。

function importModule($module, $clientId){
   if(is_file("${clientRootDir}/${clientId}/${module}.php")) {
      import("${clientRootDir}/${clientId}/${module}.php");
   } else {
      import("${defaultRootDir}/${module}.php");
   }
}

使用这种技术,您可以优雅地覆盖网站仅为该客户端工作的部分方式,并且为该客户端工作该功能的人员正在使用完全不同的文件,因此它们不会相互碰撞。 我不确定你是否已经这样做,这就是你所说的“位置模型”

最后,有了这么多不同的“虚拟网站”进行测试,通过添加自动化单元测试(一个PHPUnit)和持续集成,当软件一直运行到集成阶段时自动启动测试,您将受益匪浅。

答案 1 :(得分:1)

您的工作流程可以改进,以下是我的建议列表:

  • 开始使用SVN分支并定期发布构建/部署。
  • 计算部署周期应该是多长时间,留出时间进行质量检查。因此,例如,如果您要每月发布一个版本,则需要3周的开发时间和1周的质量保证。除了错误修复之外,在3周后冻结该版本的开发。
  • 为您的构建决定一个允许空间增长的编号方案
  • 利用票证系统(ActiveCollab,JIRA,Mantis等)并强制执行任何提交必须与票证相关联的规则。选择一个可以让您的提交自动显示在故障单中的地方。
  • 如果您要在开始开发前开始记录您的要求,请不要在售票系统中收集您的要求(为了上帝的缘故)
  • 执行此操作将帮助您确定给定构建中的功能。因此,请制作某种发行说明,其中包含票号列表或每个构建的票证的一般说明。
  • 在您的应用程序中嵌入您的内部版本号,以便您可以跟踪任何给定系统上的部署。
  • 开始使用自动化测试工具PHPUnit进行单元测试,使用Selenium进行功能测试,通过降低日常更改引入新bug的可能性来加快QA并提高Web应用程序的质量/稳定性。
  • Hudson和Phing可以成为自动化您的构建和自动化测试的救生员。