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

Setting up a deployment / build / CI cycle for PHP projects

提问人: 提问时间:2/2/2010 最后编辑:18 revs, 3 users 95%Pekka 웃 更新时间:5/1/2021 访问量:41981

问:

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

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

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

  • 变更集在本地测试后被签入到 SVN 中。

  • 我开始构建过程。SVN HEAD 修订版会被检出,必要时进行修改,并准备好上传。

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

  • 新修订版通过 FTP 部署到远程位置(包括一些目录重命名、修改、导入数据库等)。这是我非常喜欢 phing 的东西,但我当然对替代方案持开放态度。

  • 运行驻留在预定义位置的单元测试。我通过电子邮件、RSS 或(最好)HTML 输出被告知他们的失败或成功,我可以抓取并放入网页中。

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

  • 像代码指标、代码风格检查等东西现在不是我的主要关注点,但从长远来看,它们肯定会。带来这种开箱即用的解决方案非常受欢迎。

我正在寻找

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

  • 特别是,关于如何设置的良好分步教程和演练

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

以及

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

我被工作淹没了,所以我对简单的解决方案有强烈的倾向。另一方面,如果缺少一个功能,我会哭说它太有限了。:)点击式解决方案也受到欢迎。我还推荐了可以与PHP项目一起使用的商业产品。

我的设置

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

赏金我正在接受我认为会给我带来最大里程的答案。这里有很多优秀的意见,我希望我能接受不止一个答案。谢谢大家!

PHP 持续集成 phing phpUndercontrol

评论


答:

2赞 Adam Hopkinson #1

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

付费帐户中有两个漂亮的功能(我认为从 15 美元起):

  • 部署允许用户为暂存和生产服务器创建FTP目标,只需单击一个按钮即可部署这些目标(包括指定修订版和分支)
  • Webhook 允许用户设置在每次提交/部署时调用的 URL,传递修订号、描述和用户等内容。这可用于更新文档、运行单元测试和更新更改日志。

我敢肯定还有其他具有这两个功能的托管或自托管 svn 服务器,但 beanstalk 是我有经验的服务器,它运行得非常非常好

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

评论

0赞 Pekka 2/2/2010
干杯@adam。我并不是在寻找托管服务,因为我担心它们对于我的需求总是太有限。但你说的听起来很有趣,API 可能是其余部分的连接点。我会看看这个。
0赞 Adam Hopkinson 2/2/2010
不用担心,以为你会这么说。它现在适合我,因为我还没有完全了解 svn(而且我是一个单人团队),而且如果你想搬家,他们提供了一个完整的 repo 导出。
23赞 4 revs, 3 users 84%Michiel #2

您要查找的术语是“持续集成”。

下面是一个使用 GIT + phpundercontrol 的人的例子: http://maff.ailoo.net/2009/09/continuous-integration-phpundercontrol-git/

CruiseControl(这是一个 CI 服务器)可以使用托管的 SVN/GIT 作为源。因此,您甚至可以将其与 GitHub 或 Beanstalk 或其他东西一起使用。

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

  • PHPUnit的
  • php代码嗅探器
  • phpdocumentor
  • PHP Gcov的
  • PHPX引用
  • 亚斯卡
  • 等。

您还可以尝试以下托管 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 2/2/2010
谢谢你的链接。我熟悉的产品,我希望是更多教程式的演练,就像你提供的演练一样。
0赞 Ryan 10/16/2012
嗨,截至 2012 年 10 月,php-ci.net 是否已经停机或停止服务?我似乎无法连接到该地址,也无法找到过去一年的新信息。
0赞 Michiel 11/14/2012
@Ryan,我不知道发生了什么。我知道,你可以尝试其他的。也许你可以试试:CircleCI,或者你可以看看这个主题:PHP的托管持续集成?
0赞 omrakhur 5/25/2016
@Ryan,不,它没有关闭,我已经使用它一段时间了。他们已经搬到了 phptesting.org
6赞 Steven Rosato #3

我将 Atlassian 的 Bamboo 持续集成服务器用于我的主要 PHP 项目(以及他们的其他产品,例如鱼眼(存储库浏览)、jira(问题跟踪器)和 clover(代码覆盖率))。

它支持 SVN,现在支持 Git,并且具有出色的用户界面。它适用于 linux、windows 和 mac,并且可以在自己的 tomcat 服务器上独立运行,这对于不喜欢花几天时间设置工具的人(像我一样)来说非常有用)。虽然它可能看起来很贵,但作为一个单独的开发人员,我自己以 10 美元(软件为 10 美元)的价格购买了入门套件许可证。这对于小型团队来说非常有用,值得一看。

评论

0赞 Vincent 9/24/2013
如何配置 bamboo 以支持 phing?我目前正在使用 ant,但似乎 phing 更适合用于 php depooyment。谢谢
77赞 4 revs, 3 users 92%Steen #4

我经历过 buildbotCruiseControl.netCruiseControlHudson。虽然我真的很喜欢 CruiseControl*,但对于非常复杂的依赖关系案例来说,它太麻烦了。buildbot 并不容易设置,但它有一个很好的光环(我只是喜欢 python,仅此而已)。但哈德森战胜了前三位,因为:

  1. 设置起来很简单
  2. 易于定制
  3. 它看起来不错,并且具有很好的概述功能
  4. 它为自己和所有已安装的插件提供了点击式更新。这是一个非常好的功能,我越来越欣赏它

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

设置 Hudson 服务器

先决条件:

  • Java(1.5 可以很好地为您服务)
  • 对 Subversion 服务器的读取访问权限(我有一个单独的 hudson 用户帐户)

从这里开始,它只是:

java -jar hudson.war

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

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

如果这激起了你的胃口,你应该安装一个 java 应用程序服务器,比如 tomcatjetty安装说明可用于所有主要应用程序服务器

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

在哈德逊建立项目

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

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

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

陷阱:

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

祝你好运!

评论

2赞 Brian Wigginton 9/18/2012
我认为你的 cron 语法有错误。这将在每小时的第五分钟运行。如果要每 5 分钟轮询一次存储库,则需要使用 */5
3赞 Steen 9/18/2012
@BrianWigginton:你说得完全正确。我什至试图更正帖子,但我无法保存它,因为我有“对无效主机名的引用”,即“localhost”。我希望人们在这里寻找更正。
3赞 2 revs, 2 users 92%Phil Wallach #5

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

我在 parrallel 中运行一个 TEST 环境和我的 PROD 环境。我本身没有本地测试。如果很难进入真正的 TEST 环境,那么我会修复我的构建过程。我看不出在本地测试有什么意义,因为环境不同。更新:我在本地做的唯一一件事就是在上传任何内容之前运行“php -l”。阻止愚蠢的错误。

生成过程适用于当前工作区中的任何内容,其中包括未提交的代码。这不是每个人的一杯茶,但我会经常进行测试。在转到 PROD 之前,一切都已提交。

我的构建过程的一部分(类似于您的)创建了两个 META 文件。一个包含最后(通常)100 个更改,还为我提供了当前的更改列表编号。显示安装了哪些更改。另一个包含 CLIENTSPEC(在 Perforce 术语中),它准确地向我展示了此构建中使用了哪些分支。这些共同为我提供了可重复的构建。

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

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

评论

0赞 Pekka 2/11/2010
感谢您的输入,菲尔,这是一个非常非常有趣的设置,我想我可以使用其中的一部分。然而,就我而言,我通常无法通过SSH访问远程端,因此我在本地需要大量的“智能”,这就是为什么我认为我需要像Hudson这样的CI产品。
2赞 yegor256 #6

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

评论

0赞 Pekka 10/25/2010
嗯,这看起来很有趣!但是他们如何生存呢?看到一切都是免费的?他们如何支付服务器费用和 E3 费用?
0赞 yegor256 10/25/2010
@Pekka 这个项目是由一家软件开发公司赞助的,这就是为什么该服务是免费的
3赞 2 revsStephan #7

我主要是系统管理员,但有时我也会编写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 开始,它支持您可以从其 galaxy.ansibleworks.com 社区站点下载的角色,它将为您完成繁重的工作。它被称为 jenkins-php

5赞 2 revs, 2 users 94%MarmiK #8

PHP测试PHPCI这是一个很好的,用php内置的持续集成服务器。

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

它有许多插件..

PHPCI包括以下集成插件:

  • 阿图姆
  • 贝哈特
  • 营火
  • Codeception (代码感知)
  • 作曲家
  • 电子邮件
  • 咕噜
  • 铁皮会议
  • PHP的
  • 皮棉
  • MySQL数据库
  • PDepend
  • PostgreSQL数据库
  • PHP代码嗅探器
  • PHP复制/粘贴检测器
  • PHP规范
  • PHP单元
  • Shell 命令
  • 焦油/拉链

评论

0赞 Tek 11/22/2015
虽然我喜欢 PHPCI,但我不推荐它。它非常有缺陷且不可靠。可悲的是,常见的基本功能没有得到适当的单元测试,所以像添加项目 URL 这样的基本事情很难在不搞砸的情况下。
0赞 omrakhur 5/25/2016
@Tek 你对PHP的CI策略是什么?
1赞 Tek 5/26/2016
@omrakhur不幸的是,我被 PHPCI 困住了。所有其他软件都更加笨重,需要很多时间来设置。一切都有它的优点和缺点。你只需要选择最适合你的方法。
3赞 AgileDeveloper #9

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

它的设置非常简单,可在多个平台上运行,并与其他持续集成工具(如 SonarQube (+ SQUALE))很好地集成,以衡量技术债务和修昔底德用于测试自动化。

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

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

PHPUnit - 用于单元测试

PHP CodeSniffer - 检查编码标准

PHP Depend - 显示您的 PHP 代码依赖项

XDEBUG - 用于性能测试

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

祝你好运,尽情享受吧!