为PHP项目设置部署/构建/ CI周期


200

我大部分时间都是孤独的开发人员,从事许多大型的,主要基于PHP的项目。我想专业化和自动化如何处理对代码库的更改,并创建一个持续集成过程,该过程使过渡到团队工作成为可能,而无需进行基本更改。

我现在正在做的是,每个项目都有一个本地测试环境。我在每个项目中都使用SVN;更改将在本地进行测试,然后通常通过FTP传输到在线版本。API文档是从源代码手动生成的;单元测试是我正在慢慢进行的事情,它还不是我日常工作的一部分。

我设想的“构建周期”将执行以下操作:

  • 在本地进行测试后,变更集将签入SVN。

  • 我开始构建过程。SVN HEAD修订版已签出,必要时进行了修改,并准备上载。

  • API文档会自动生成-如果尚未详细设置,请使用默认模板扫描整个代码库。

  • 新修订版通过FTP部署到远程位置(包括一些目录重命名,chmodding,导入数据库等)。我已经非常喜欢phing了,但是我当然愿意接受替代方法。

  • 运行位于预定位置的单元测试。我可以使用电子邮件,RSS或(最好是)HTML输出了解它们的失败或成功,可以将它们捕获并放入网页中。

  • (可选)使用提交消息的预定义部分来更新位于预定义位置的最终用户“ changelog”文本文件(“现在可以同时过滤“ foo”和“ bar”时间),此消息不一定与SVN提交消息相同,后者可能包含更多内部信息。

  • 诸如代码指标,代码样式检查之类的东西现在不是我的主要重点,但是从长远来看,它们一定会。开箱即用的解决方案非常值得关注。

我在寻找

  • 来自或处于类似情况的人的反馈和经验,并已成功地为此实施了解决方案

  • 尤其是关于如何进行设置的良好的分步教程和演练

  • 提供尽可能多自动化的解决方案,例如通过为每个新项目创建框架API,测试用例等。

并且

  • 产品推荐。到目前为止,我所知道的是phing / ant用于构建,而phpUnderControlHudson用于报告部分。据我所知,我都喜欢它们,但是我当然对它们没有详细的经验。

忙于工作,因此非常倾向于简单的解决方案。另一方面,如果缺少某个功能,我会抱怨它太有限。:)也欢迎点击解决方案。我也对可以与PHP项目一起使用的商业产品提出建议。

我的设定

我在本地Windows(准确地说是7)上工作,大多数客户端项目都在LAMP堆栈上运行,通常在共享主机上运行(=没有远程SSH)。我正在寻找可以在自己的环境中运行的解决方案。我准备为此设置一个Linux VM,没问题。仅当托管解决方案能够提供所描述的所有方面,或者足够灵活以与流程的其他部分进行交互时,托管解决方案才对我而言很有趣。

赏金 我接受我认为会给我最大里程的答案。这里有很多很棒的建议,我希望我可以接受多个答案。感谢大家!

Answers:


76

我经历过buildbotCruiseControl.netCruiseControlHudson。尽管我真的很喜欢CruiseControl *,但是对于非常复杂的依赖项来说,这太麻烦了。buildbot的设置并不容易,但是它有一个不错的先兆(我就像python,仅此而已)。但是哈德逊赢得了前三名,因为:

  1. 设置简单
  2. 易于定制
  3. 看起来不错,并具有很好的概述功能
  4. 它本身和所有已安装的插件均获得了点击式更新。这是一个非常不错的功能,我越来越感谢

警告:我只使用linux作为上述构建服务器的基础(CC.net在mono上运行),但根据文档,它们都应跨平台运行。

设置哈德逊服务器

先决条件:

  • Java(1.5可以满足您的需要)
  • 对Subversion服务器的读取访问权限(我为hudson用户拥有一个单独的帐户)

从这里开始,只是:

java -jar hudson.war

这将立即在控制台上运行一个小型服务器实例,并且http://localhost:8080如果您事先没有在该端口上运行任何其他操作,则应该可以在您的浏览该安装(您可以通过将--httpPort=ANOTHER_HTTP_PORT选项传递给上面的命令),并且在“安装”过程中一切正常。

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

如果您对此有兴趣,则应该安装Java应用程序服务器,例如tomcatjetty安装说明适用于所有主要应用程序服务器

更新Kohsuke川口构建了一个窗口服务安装哈德森

在哈德森建立一个项目

以下演练中的链接假定​​hudson的运行实例位于 http://localhost:8080

  1. http://localhost:8080/view/All/newJob从左侧菜单中选择新作业()
  2. 给工作起个名字Build a free-style software project并在清单上打勾
  3. 按“确定”将带您到作业的配置页面。除所有选项外,所有选项都带有一个问号。按下此按钮将弹出有关该选项的帮助文本。
  4. 在选项组“源代码管理”下,您将使用Subversion。Hudson接受url访问以及本地模块访问
  5. 在选项组“构建触发器”下,您将使用“轮询SCM”。这里使用的语法是cron的语法,因此每5分钟轮询一次Subversion存储库*/5 * * * *
  6. 在选项组“构建”下指定了构建项目的过程。如果您已经有了一个包含所有所需目标的ant构建文件,那么您就很幸运。只需选择“ Invoke ant”并输入目标名称即可。选项组也支持开箱即用的maven和shell命令,但也有一个可用于phing插件
  7. 选中“后期构建操作”中的其他构建操作,例如电子邮件通知或构建工件的存档。

为了设置hudson没有插件的进程,您可以在构建设置中直接通过Shell脚本调用它们,也可以编写自己的插件

陷阱:

  • 如果您产生了人工制品,请记住定期对哈德逊进行清理。
  • 如果您设置了20个以上的项目,请考虑不将其构建状态显示为hudson的默认主页

祝好运!


2
我认为您的cron语法有误。那将在每小时的第五分钟运行。如果您想每5分钟轮询一次回购,则需要使用* / 5
Brian Wigginton 2012年

2
@BrianWigginton:你完全正确。我什至试图更正该帖子,但是我无法保存它,因为我具有“对无效主机名的引用”,即“ localhost”。我希望人们看不起这里进行纠正。
2012年

22

您正在寻找的术语是“持续集成”。

这是使用GIT + phpundercontrol的示例:http ://maff.ailoo.net/2009/09/continuous-integration-phpundercontrol-git/

CruiseControl(这是CI服务器)可以使用Hosted SVN / GIT作为源。因此,您甚至可以将其与GitHub或Beanstalk或其他产品一起使用。

然后,您可以将其与以下类型的软件集成:

  • PHPUnit
  • php-codesniffer
  • phpdocumentor
  • PHP Gcov
  • PHP参考
  • 亚斯卡
  • 等等

您也可以尝试使用以下托管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/


2
感谢您的链接。我所熟悉的产品,我希望获得的是更多教程式的演练,例如您提供的演练。
Pekka '02

嗨,截至2012年10月,php-ci.net是否已关闭或已从服务中撤出?我似乎无法连接到该地址,也找不到过去一年的新信息。
瑞安

@Ryan,我不知道发生了什么。我确实知道,您可以尝试其他人。也许您可以尝试:CircleCI 或您可以检查以下主题:PHP托管的持续集成?
米歇尔2012年

@Ryan,不,它没有失败,我已经使用了一段时间了。他们已经搬到phptesting.org
omrakhur

6

我将Atlassian的Bamboo连续集成服务器用于我的主要PHP项目(以及其他产品,如fisheye(存储库浏览),jira(问题跟踪器)和三叶草(代码覆盖率))。

它支持SVN,现在支持Git,并且具有出色的用户界面。它适用于Linux,Windows和Mac,并且可以在自己的tomcat服务器上独立运行,这对不喜欢花几天时间安装工具的人(如我)非常有用。尽管它看起来可能很昂贵,但作为一个孤独的开发人员,我还是以10美元(由软件获得10美元)的价格购买了入门套件许可证。这对小型团队来说很棒,值得一看。


如何配置Bamboo以支持phing?我当前使用的是ant,但似乎phing更适合用于php部署。谢谢
Vincent

5

PHPTesting PHPCI这是内置在php中的不错的持续集成服务器。

另外,它是免费和开源的。:)

它有许多插件。

PHPCI包括用于以下方面的集成插件:

  • 原子
  • 贝哈特
  • 营火
  • 密码接收
  • 作曲家
  • 电子邮件
  • 咕unt声
  • IRC
  • 的PHP
  • 皮棉
  • 的MySQL
  • 依赖
  • PostgreSQL的
  • PHP代码嗅探器
  • PHP复制/粘贴检测器
  • PHP规范
  • PHP单元
  • Shell命令
  • 焦油/拉链

尽管我喜欢PHPCI,但我不推荐这样做。这是令人难以置信的错误和不可靠的。令人遗憾的是,通用的基本功能没有经过适当的单元测试,因此添加项目URL之类的基本操作很难将其弄乱。
Tek

@Tek您的PHP CI策略是什么?
omrakhur

1
@omrakhur不幸的是,我坚持使用PHPCI。所有其他软件都非常笨重,需要花费很多时间进行设置。一切都有其优点和缺点。您只需要选择最适合您的方法即可。
Tek

3

我主要是系统管理员,但有时我也会编写PHP。作为辅助项目,我创建了一些脚本,这些脚本将使使用Jenkins设置完整的PHP CI环境变得简单而轻松。它还为您运行一个示例项目,因此您可以了解每个构建步骤的配置方式。

如果您想尝试一下,您只需要一个Debian / Ubuntu box和shell访问权限。

http://yauh.de/articles/379/setting-up-a-ci-environment-for-php-projects-using-jenkins-ci

更新为我的答案添加一些内容:

您只需使用Ansible为PHP设置Jenkins CI。从v1.4开始,它支持您可以从galaxy.ansibleworks.com社区网站下载的角色,它将为您带来繁重的工作。它称为jenkins-php


3

我建议使用Jenkins http://jenkins-ci.org/,它是免费的,而且是开源的。

设置非常简单,可以在多个平台上工作,并且可以与SonarQube(+ SQUALE)等其他持续集成工具很好地集成,以测量技术债务,并使用Thucydides进行自动化测试。

我强烈建议使用GIT或GIT Hub进行版本控制,而不要使用SVN。从我的角度来看,这只是一个更好的版本控制系统,它将帮助您以后扩展开发工作。

由于您主要使用PHP项目,因此可以使用其他一些工具。

PHPUnit-用于单元测试

PHP CodeSniffer-检查编码标准

PHP Depend-显示您的PHP代码依赖关系

XDEBUG-用于性能测试

所有这些工具都可以通过Jenkins工作触发,并有助于提高代码的质量和性能。

祝你好运,享受!


3

我不会使用很多产品,甚至不会使用您使用的产品类型,但是我会给您我的经验。

我在与PROD环境并行运行的TEST环境。我本身没有本地测试。如果很难进入真正的TEST环境,那么我会修复我的构建过程。由于环境不同,我看不出在本地进行测试的意义。更新:我在本地执行的唯一操作是在上传任何内容之前运行“ php -l”。停止愚蠢的错误。

构建过程可以使用当前工作空间中的任何内容,其中包括未提交的代码。这不是每个人的茶,但是我经常去测试。一切都会在进入PROD之前提交。

我的构建过程的一部分(与您的过程类似)将创建两个META文件。一个包含最近(通常)100个更改,还给了我当前的更改列表编号。显示我安装了哪些更改。另一个包含CLIENTSPEC(以Perforce术语),它向我确切显示了此构建中使用了哪些分支。这些共同给了我可复制的构建。

我不是直接针对目标环境构建,而是针对服务器上的暂存区域进行构建。我使用SSH,所以这很有意义。这给了我一些好处。最重要的是,它避免了大批量上传过程中途死亡。它还为我提供了一个存储META文件的地方,并且所有构建文件都被自动存档(因此我可以直接回到任何构建)。该脚本还会记录更新(因此在日志流中有一个条目,我可以看到前置和后置)并踢出所有守护程序(我使用daemontools表示“ svc -t”)。所有这些在目标计算机上都更好。

另一个问题是数据库更改。我保留了数据库模式的主脚本,该脚本在每次模式更改时都会更新。每个更改还都进入了changes.sql脚本,该脚本与内部版本一起上传到登台区域。该脚本作为安装脚本的一部分运行。


感谢您的投入Phil,这是一个非常非常有趣的设置,我想我可以使用其中的一部分。但是,就我而言,我经常没有对远程端的SSH访问,因此我在本地需要很多“智能”,这就是为什么我认为我将需要像Hudson这样的CI产品的原因。
Pekka 2010年

2

我最近开始了相同的过程,并且正在使用Beanstalk进行svn托管。

付费帐户中有两个漂亮的功能(我认为从$ 15pm开始):

  • 部署允许用户创建用于登台和生产服务器的ftp目标,只需单击一个按钮即可部署它(包括指定修订和分支)
  • webhooks允许用户设置每次提交/部署时调用的url,并传递诸如修订号,描述和用户之类的内容。这可用于更新文档,运行单元测试和更新变更日志。

我确定还有其他具有这两个功能的托管或自托管svn服务器,但是beantalk是我经验丰富的服务器,并且运行非常非常好

还有一个API,我想可以用来将部署进一步集成到您的流程中。


干杯@adam。我不太希望托管服务能做到这一点,因为我担心它们对于我所需要的总是会太有限。但是您所说的听起来很有趣,API可能是其余内容的连接点。我会看一下。
Pekka '02

不用担心,您可能会这么说。目前它很适合我,因为我还没有完全的svn头(而且我是一个单人团队),另外,如果您想搬家,它们会提供完整的回购出口。
亚当·霍普金森

2

考虑fazend.com,这是一个免费的托管CI平台,可自动执行配置和安装过程。您无需设置版本控制,错误跟踪,CI服务器,测试环境等。所有操作均按需完成。


嗯,这看起来很有趣!但是它们如何生存?看到一切都是免费的吗?他们如何支付服务器以及E3费用?
Pekka 2010年

@Pekka该项目由软件开发公司赞助,这就是为什么该服务免费的原因
yegor256
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.