我们的生产环境包括以下内容:
- 3个前端服务器为我们的网站提供服务
- 2个数据库后端(主从复制)
- 1个混合服务器运行广告服务器的httpd和数据库
我们的开发环境是一个单一的服务器,同时运行数据库和httpd。在配置方面,我们为每个人设置了不同的工作空间,并使用Subversion进行版本控制。Staging也很简单 - 它运行在其中一个前端上。
数据库更改
最初,我们花费了很多时间在数据库设计上,看起来这确实得到了很好的回报。在过去的五个月中,我们没有做任何重大的更改。我们部署的大多数更改都是在前端进行的。现在,到目前为止,我们手动运行所有对数据库的更改,并且我总是编写一个小脚本来还原。
如果我有更多这样的需求,我会在这里使用Doctrine和Migrations。我实际上从未有机会在生产中使用它们,但我已经广泛地使用过它们,它们似乎非常强大。
部署
因此,每当我们部署新版本时,我们会创建一个代码标签,我们在Staging上检出该标签,然后进行一些检查列表等操作,然后在生产前端部署代码。为了执行所有的部署工作,我在Capistrano中设置了几个任务。
请查看此示例capfile
:
role :www, "web01", "web02", "web03"
role :web, "web01", "web02", "web03", "web04"
role :db, "db01", "db02"
desc "Deploy sites"
task :deploy, :roles => :www do
run "cd /usr/www/website && sudo svn --username=deploy --password=foo update"
end
Capistrano还允许您在不定义任务的情况下运行任何其他命令:
cap invoke COMMAND="uptime" ROLES=web
(需要设置“web”角色。请参见上面的示例。)
编码风格和文档
我们基本上遵循 PEAR 编码标准,并使用 PHP_CodeSniffer (phpcs) 进行检查。当我说基本上时,我的意思是我分叉了提供的嗅探器,并添加了一些我自己喜欢的例外。
除了编码风格,phpcs 还会检查内联文档。这个文档最终是由 phpDocumentor 创建的。
CI
我们在 CI 服务器(continuous-integration)上设置了这两个工具,它们是 phpUnderControl 使用上述和 CruiseControl、phpUnit、Xdebug(一些代码度量等)等工具。
unit-testing是我们目前缺乏的东西。但是我们现在做的是,每当我们在解析引擎中发现一个bug时(我们将文本解析为特定格式),我们会编写一个测试来确保它不会再次出现。我还编写了一些基本测试来检查URL路由和内部XMLRPC API,但这真的需要改进。我们同时使用phpUnit风格的测试和
phpt。
CI服务器每天构建几次新版本,生成图表、文档和各种报告。
除了上述所有工具之外,我们还使用Google Apps(主要用于电子邮件),并在Google Sites Wiki上保留所有其他文档。例如,部署程序、QA测试列表等。