关于持续集成:为PHP项目设置部署/构建/ CI循环

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

    这将在控制台上运行一个小型服务器实例,如果事先没有在该端口上运行任何其他内容(您可以通过将--httpPort=ANOTHER_HTTP_PORT选项传递给上述命令来指定另一个端口),那么您应该能够浏览http://localhost:8080上的安装,并且在"安装"过程中一切正常。

    如果转到可用的插件目录(http://localhost:8080/pluginManager/available中),您将找到支持上述任务的插件(默认情况下安装了Subversion支持)。

    如果这有利于你的胃口,你应该安装一个Java应用服务器,比如Tomcat或JeTy.所有主要应用服务器都有安装说明

    更新:Kohsuke Kawaguchi为Hudson构建了一个Windows服务安装程序

    在哈德逊建立一个项目

    以下演练中的链接假定Hudson的一个正在运行的实例位于http://localhost:8080

  • 从左侧菜单中选择"New job"(新作业)(http://localhost:8080/view/All/newJob)
  • 给这份工作一个名字,在清单上打上"EDOCX1"〔5〕。
  • 按"确定"将进入作业的配置页面。除此之外,所有选项都有一个小问号。按此键将显示有关选项的帮助文本。
  • 在选项组"源代码管理"下,您将使用Subversion。Hudson既接受URL访问,也接受本地模块访问
  • 在选项组"Build Triggers"下,您将使用"poll scm"。这里使用的语法是cron的语法,所以每5分钟轮询一次Subversion存储库将是*/5 * * * *
  • 生成项目的过程在选项组"build"下指定。如果你已经有了一个包含你需要的所有目标的Ant构建文件,那么你就走运了。只需选择"invoke ant"并编写目标的名称。选项组支持maven和shell命令,但也有一个插件可用于phing。
  • 在"构建后操作"中勾选其他构建操作,例如电子邮件通知或构建人工制品存档。
  • 对于设置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,我认为它可以用于将部署进一步集成到您的流程中。