我认为每个人的操作略有不同,具体取决于应用程序。这是我们的设置:
发布之前:
- 每个人都提交到 /trunk。
- 当我们想要发布时,将 trunk 复制到 /tags/yymmddhhiiss。
- 我们稳定标签。
一旦它稳定下来,我们运行部署脚本:
- 在生产服务器上,检出新标签。
- 对数据库进行转储。
- 停止守护进程并关闭 Web 应用程序。
- 将符号链接 /current 指向新检出的标签。
- 运行迁移脚本。
- 重新启动守护进程和应用程序。
如果我们需要快速推送小的更改,我们将其合并到当前标签,然后可以在服务器上运行一个简单得多的热修复过程:
- 停止守护进程并关闭 Web 应用程序。
- 运行 svn update。
- 重新启动守护进程和应用程序。
注意,有一些旨在结构化/自动化这些过程的工具。
Phing 是其中之一,
Symfony 有自己的
批处理系统,曾经是一个独立的项目叫做
pake。如果这还不够,Zend Framework 即将创建
他们自己的变体。这真的有点混乱,但 Phing 可能是使用最广泛的。您也可以使用一些非特定于 PHP 的内容,例如
Ant 或
Capistrano。我们只使用 shell 脚本,基本上填补了同样的需求。
我们还有一个持续构建正在运行,它从主干检出并运行所有测试。目前我们只有一些基本的shell脚本来完成这项工作,但我们正在考虑转换到
PhpUnderControl或
xinc。
迁移步骤可能需要一些解释。这些包含对数据库的更改,以及必须为新版本运行的其他任务。我们的迁移目前有点简单; 我们只是有一个带有一堆
.php
和
.sql
脚本的文件夹,在迁移期间,这些脚本按顺序运行。我们跟踪已运行的更改的方式是在制作新标记后立即清空
migrations
文件夹。不过使用数据库记录已运行的更改可能更明智。我们正在考虑采用类似
ruckusing的东西来实现这个目的。