Setting up a deployment / build / CI cycle for PHP projects
我大部分时间都是一个独立的开发人员,负责一些大型的,主要是基于PHP的项目。我希望专业化和自动化如何处理对代码库的更改,并创建一个持续的集成过程,使转换到团队中工作成为可能,而无需进行基本的更改。
我现在正在做的是,我为每个项目都有一个本地测试环境;我为每个项目使用SVN;在本地测试更改,然后通常通过ftp传输到在线版本。API文档是从源代码手工生成的;单元测试是我正在慢慢进行的工作,它还不是我日常工作的一部分。
我设想的"构建周期"将执行以下操作:
在本地测试后,变更集将签入SVN。
我开始构建过程。SVN头版本将被签出,必要时进行修改,并准备好上传。
API文档会自动生成-如果我还没有详细设置它,那么使用默认模板扫描整个代码库。
新版本通过ftp(包括一些目录重命名、chmodding、导入数据库等)部署到远程位置。这是我已经非常喜欢phing的东西,但我当然愿意接受其他的选择。
运行位于预定义位置的单元测试。我通过电子邮件、RSS或(最好)HTML输出了解到他们的失败或成功,我可以将这些输出抓取并放入网页。
(可选)使用提交消息的预定义部分更新预定义位置中的最终用户"changelog"文本文件("现在可以同时筛选"foo"和"bar)。此消息不一定与SVN提交消息相同,后者可能包含更多的内部信息。
像代码度量、代码样式检查等东西现在不是我的主要关注点,但从长远来看,它们肯定会。把这个从盒子里拿出来的解决方案是非常友好的。
我在找
来自处于或曾经处于类似情况的人的反馈和经验,并成功地为此实施了解决方案
尤其是,关于如何设置此设置的详细教程和演练
提供尽可能多的自动化的解决方案,例如为每个新项目创建一个框架API、测试用例等。
以及
- 产品建议。到目前为止,我所知道的是phing/ant用于建筑,phpundercontrol或hudson用于报告部分。据我所见,我都喜欢他们,但我当然没有他们的详细经验。
我工作忙得不可开交,所以我倾向于简单的解决办法。另一方面,如果一个特性丢失了,我会为它太有限而哭泣。:)也欢迎使用点击式解决方案。我也会对商业产品的建议,可以与PHP项目一起使用。
我的设置
我在本地使用Windows(确切地说,是7个),大多数客户机项目都运行在灯堆栈上,通常在共享主机上运行(=no remote ssh)。我正在寻找可以在我自己的环境中运行的解决方案。我准备为此设置一个Linux虚拟机,没问题。只有当托管解决方案提供了所描述的所有方面,或者具有足够的灵活性,能够与流程的其他部分进行交互时,托管解决方案才是我感兴趣的。
Bounty
I am accepting the answer that I feel will give me the most mileage. There is a lot of excellent input here, I wish I could accept more than one answer. Thanks everyone!
号
我去过buildbot、cruisecontrol.net、cruisecontrol和hudson。尽管我真的很喜欢CruiseControl*,但对于非常复杂的依赖性案例来说,这太麻烦了。buildbot不容易设置,但它有一个很好的光环(我只喜欢python,仅此而已)。但哈德逊赢得了前三名,因为:
注意:我只使用过Linux作为上述构建服务器的基础(cc.net运行在mono上),但根据docs的说法,它们都应该跨平台运行。
设置哈德逊服务器先决条件:
- Java(1.5将服务于你)
- 读访问Subversion服务器(我为Hudson用户有一个单独的帐户)
从这里开始,它只是:
1 | java -jar hudson.war |
这将在控制台上运行一个小型服务器实例,如果事先没有在该端口上运行任何其他内容(您可以通过将
如果转到可用的插件目录(
如果这有利于你的胃口,你应该安装一个Java应用服务器,比如Tomcat或JeTy.所有主要应用服务器都有安装说明
更新:Kohsuke Kawaguchi为Hudson构建了一个Windows服务安装程序
在哈德逊建立一个项目以下演练中的链接假定Hudson的一个正在运行的实例位于
对于设置Hudson没有插件的进程,您可以通过构建设置中的shell脚本直接调用它们,也可以编写自己的插件。
陷阱:- 如果你让它生产建筑艺术品,记得让哈德逊定期清理自己。
- 如果设置了20个以上的项目,请考虑不将它们的生成状态显示为Hudson上的默认主页。
祝你好运!
你要找的术语是"持续整合"。
下面是一个使用git+phpundercontrol的示例:http://maff.ailoo.net/2009/09/continuous-integration-phpundercontrol-git/
CruiseControl(CI服务器)可以使用托管的SVN/Git作为源。因此,您甚至可以将它与Github或Beanstalk或其他东西一起使用。
然后您可以将其与以下类型的软件集成:
- 普普尼特
- PHP代码嗅探器
- 医生
- 菲律宾gcov
- PHPxRef
- 亚斯卡
- 等。
您也可以尝试这个托管的CI:http://www.php-ci.net/hosting/create-project
但是请记住,如果您自己集成这些工具,那么它们需要定制支持。
您还考虑过项目管理和补丁管理吗?
您可以使用Redmine进行项目管理。它具有集成的持续集成支持,但仅作为客户端(而不是作为CI服务器)。
尝试使用托管的SVN/Git/etc.解决方案,因为它们将覆盖您的备份并保持其服务器的运行,所以您可以专注于开发。
有关如何设置Hudson的教程,请参阅:http://toptopic.wordpress.com/2009/02/26/php-and-hudson/
我将Atlassian的Bamboon Continuous集成服务器用于我的主要PHP项目(以及其他产品,如Fisheye(知识库浏览)、Jira(问题跟踪程序)和Clover(代码覆盖率))。
它支持SVN,现在支持Git,并且有很好的用户界面。它适用于Linux、Windows和Mac,并且可以在自己的Tomcat服务器上独立运行,这对像我这样不愿意花几天时间安装工具的人来说非常好。虽然它看起来很贵,但作为一个独立的开发人员,我花了10美元(按软件计算是10美元)购买了入门工具包许可证。这对小球队很好,值得一看。
phptesting phpci这是一个很好的、内置于php中的持续集成服务器。
另外,它是免费和开源的。:)
它有很多插件。
phpci包括以下集成插件:
- 阿图姆
- 贝哈特
- 篝火
- 共同接受
- 作曲家
- 电子邮件
- 咕噜声
- IRC
- PHP
- 绒布
- MySQL
- PDE端
- 《PostgreSQL》
- PHP代码嗅探器
- PHP复制/粘贴检测器
- PHP规范
- PHP单元
- shell命令
- 焦油/拉链
我建议使用Jenkins http://jenkins-ci.org/它是免费的,也是开源的。
它非常直接地进行了设置,在多个平台上工作,并与其他持续集成工具(如Sonarkube(+Squale))进行了很好的集成,以测量技术债务和测试自动化的修昔底德。
我强烈建议使用Git或Git Hub来进行版本控制,而不是使用SVN。从我的观点来看,它只是一个更好的版本控制系统,可以帮助您稍后扩展开发工作。
由于您主要使用的是PHP项目,因此您可以使用其他一些工具。
phpunit-用于单元测试
PHP代码嗅探器-检查编码标准
php dependent-显示您的php代码依赖项
xdebug-用于性能测试
所有这些工具都是由Jenkins的工作触发的,并且有助于提高代码的质量和性能。
祝你好运,玩得开心!
我主要是系统管理员,但有时我也会编写PHP代码。作为一个附带项目,我创建了一些脚本,使使用Jenkins建立一个完整的php-ci环境变得简单和轻松。它还为您运行一个示例项目,这样您就可以看到如何配置每个构建步骤。
如果你想尝试一下,你所需要的就是一个debian/ubuntu框和shell访问。
http://yauh.de/articles/379/setting-up-a-ci-environment-for-php-projects-using-jenkins-ci
更新以向我的答案添加一些内容:
您可以使用ansible简单地为PHP设置一个Jenkins CI。因为v1.4支持角色,你可以从他们的gaxy.ansibleworks.com社区网站上下载,它将为你做繁重的工作。它被称为詹金斯PHP。
我不使用许多产品,甚至你使用的产品类型,但我会给你我的经验。
我在Parralell和我的prod环境中运行一个测试环境。我本身没有本地测试。如果很难将SOEMTG应用到实际的测试环境中,那么我将修复构建过程。我不认为在本地测试中有什么意义,因为环境是不同的。更新:我在本地唯一做的就是在上传任何东西之前运行"php-l"。阻止愚蠢的错误。
构建过程处理当前工作区中的任何内容,其中包括未提交的代码。这不是每个人的一杯茶,但我要经常测试。每件事都要在开始生产前完成。
我的构建过程的一部分(类似于您的)创建了两个元文件。其中一个包含最后(通常)100个更改,还提供了当前的更改列表编号。显示安装了哪些更改。另一个包含clientspec(用性能术语来说),它精确地向我展示了这个构建中使用的分支。这些一起给了我可复制的构建。
我不直接构建到目标环境,而是构建到服务器上的临时区域。我使用ssh,所以这是有意义的。这给了我一些优势。最重要的是,它可以避免在上传过程中半途而废。它还为我提供了一个存储元文件的位置,所有构建文件都会自动存档(这样我就可以直接返回到任何构建)。该脚本还记录更新(因此日志流中有一个条目,我可以看到pre-和post-)并启动所有守护进程(我使用daemontools,所以"svc-t")。所有这些在目标机器上都更好。
另一个问题是数据库更改。我保留了数据库模式的主脚本,每次模式更改时都会更新它。每个更改也会进入changes.sql脚本,该脚本随构建一起上载到临时区域。该脚本作为安装脚本的一部分运行。
以Fazend.com为例,它是一个免费的托管CI平台,可以自动执行配置和安装过程。您不需要设置版本控制、错误跟踪、CI服务器、测试环境等。一切都是按需完成的。
我最近已经开始了同样的过程,并且正在使用Beanstalk进行SVN托管。
付费账户有两个漂亮的功能(我想从下午15点开始):
- 部署允许用户为临时服务器和生产服务器创建FTP目标,单击按钮即可部署该目标(包括指定修订版和分支)
- WebHooks允许用户设置在每次提交/部署时调用的URL,并传递修订号、描述和用户等内容。这可以用于更新文档、运行单元测试和更新变更日志。
我确信还有其他的托管或自托管的SVN服务器具有这两个特性,但是Beanstalk是我有经验的服务器,它运行得非常非常好。
还有一个API,我认为它可以用于将部署进一步集成到您的流程中。