为 PHP 项目设置部署/构建/CI 周期
Posted
技术标签:
【中文标题】为 PHP 项目设置部署/构建/CI 周期【英文标题】:Setting up a deployment / build / CI cycle for PHP projects 【发布时间】:2011-01-11 22:25:54 【问题描述】:我大部分时间都是一个孤独的开发人员,从事许多大型项目,主要是基于 php 的项目。我想专业化和自动化处理代码库更改的方式,并创建一个持续集成流程,使过渡到团队工作成为可能,而无需进行根本性更改。
我现在正在做的是,我为每个项目都有一个本地测试环境;我对每个项目都使用 SVN;更改在本地进行测试,然后通常通过 FTP 传输到在线版本。 API 文档是从源代码手动生成的;单元测试是我慢慢接触的东西,它还不是我日常生活的一部分。
我设想的“构建周期”将执行以下操作:
在本地测试后,变更集被签入 SVN。
我开始构建过程。 SVN HEAD 修订被检出,如有必要进行修改,并准备好上传。
API 文档会自动生成 - 如果我还没有详细设置它,使用默认模板扫描整个代码库。
新版本通过 FTP 部署到远程位置(包括一些目录重命名、chmodding、导入数据库等。)这是我已经非常喜欢 phing 的东西,但我当然可以选择替代品。
运行驻留在预定义位置的单元测试。我通过电子邮件、RSS 或(最好是)我可以抓取并放入网页的 html 输出来了解他们的失败或成功。
(可选)预定义位置中的最终用户“changelog”文本文件将使用提交消息的预定义部分进行更新(“现在可以过滤“foo”和"bar")。这条消息不一定与 SVN 提交消息相同,它可能包含更多的内部信息。
目前我的主要关注点不是代码指标、代码样式检查等,但从长远来看,它们肯定会。开箱即用的解决方案非常受欢迎。
我在找
来自或曾经处于类似情况并已成功实施解决方案的人的反馈和经验
特别是关于如何设置的良好的分步教程和演练
提供尽可能自动化的解决方案,例如为每个新项目创建骨架 API、测试用例等。
还有
产品推荐。到目前为止,我所知道的是 phing/ant 用于构建,phpUnderControl 或 Hudson 用于报告部分。就我所见,我都喜欢它们,但我当然没有详细的经验。我忙于工作,所以我强烈倾向于简单的解决方案。另一方面,如果缺少某个功能,我会因为它太有限而哭泣。 :) 也欢迎点击式解决方案。我也推荐可以与 PHP 项目一起使用的商业产品。
我的设置
我在本地使用 Windows(确切地说是 7 个),大多数客户端项目都在 LAMP 堆栈上运行,通常在共享主机上运行(= 没有远程 SSH)。 我正在寻找可以在自己的环境中运行的解决方案。我准备为此设置一个Linux VM,没问题。只有当托管解决方案提供了所描述的所有方面,或者足够灵活以与流程的其他部分进行交互时,它们才会对我感兴趣。
赏金 我正在接受我认为会给我最多里程的答案。这里有很多优秀的输入,我希望我能接受多个答案。谢谢大家!
【问题讨论】:
【参考方案1】:我经历过buildbot、CruiseControl.net、CruiseControl 和Hudson。尽管我真的很喜欢 CruiseControl*,但对于真正复杂的依赖案例来说实在是太麻烦了。 buildbot 设置起来并不容易,但它有一个很好的光环(我就是喜欢 python,仅此而已)。但哈德森战胜了前三名,因为:
-
设置简单
易于定制
看起来不错,并且有很好的概览功能
它本身和所有已安装的插件都有点击式更新。这是一个非常好的功能,我越来越欣赏它
警告:我只使用过 linux 作为上述构建服务器的基础(CC.net 在 mono 上运行),但根据文档,它们都应该跨平台运行。
设置 hudson 服务器
先决条件:
Java(1.5 可以很好地为您服务) 对 subversion 服务器的读取权限(我有一个单独的 hudson 用户帐户)从这里开始,就是:
java -jar hudson.war
这将在您的控制台上运行一个小型服务器实例,如果您事先没有在该端口上运行其他任何东西,您应该能够在 http://localhost:8080
上浏览安装(您可以指定另一个端口通过将--httpPort=ANOTHER_HTTP_PORT
选项传递给上述命令),并且在“安装”过程中一切顺利。
如果您转到可用的插件目录 (http://localhost:8080/pluginManager/available
),您会找到支持上述任务的插件(默认安装了颠覆支持)。
如果您对此有兴趣,您应该安装一个 java 应用程序服务器,例如 tomcat 或 jetty。 Installation instructions 适用于所有主要应用服务器
更新:Kohsuke Kawaguchi 为 hudson 构建了一个 windows service installer
在哈德逊建立一个项目
以下演练中的链接假定运行中的 hudson 实例位于 http://localhost:8080
-
从左侧菜单中选择新工作 (
http://localhost:8080/view/All/newJob
)
为工作命名并在列表中勾选Build a free-style software project
按“确定”将带您进入作业的配置页面。除了它们之外,所有选项都有一个小问号。按此按钮将显示有关该选项的帮助文本。
在选项组“源代码管理”下,您将使用 Subversion。 Hudson 接受 url 访问以及本地模块访问
在选项组“构建触发器”下,您将使用“轮询 SCM”。这里使用的语法是 cron 的,所以每 5 分钟轮询一次 subversion 存储库将是 */5 * * * *
构建项目的过程在选项组“构建”下指定。如果您已经有一个包含所有您需要的目标的 ant 构建文件,那么您很幸运。只需选择“Invoke ant”并写下目标的名称。选项组也支持开箱即用的 maven 和 shell 命令,但也有一个 plugin available for phing。
在“构建后操作”中勾选其他构建操作,例如电子邮件通知或构建工件的存档。
对于设置 hudson 没有插件的进程,您可以通过构建设置中的 shell 脚本直接调用它们,也可以write you own plugin
陷阱:
如果您让它产生构建工件,请记住让 hudson 定期自行清理。 如果您设置的项目超过 20 个,请考虑不将其构建状态显示为 hudson 上的默认主页祝你好运!
【讨论】:
我认为您的 cron 语法有错误。这将在每小时的第五分钟运行。如果你想每 5 分钟轮询一次 repo,你需要使用 */5 @BrianWigginton:你完全正确。我什至试图更正帖子,但我无法保存它,因为我有“对无效主机名的引用”,即“localhost”。我希望人们在这里寻找更正。【参考方案2】:您正在寻找的术语是“持续集成”。
这是一个使用 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 PHPXref 亚斯卡 等您也可以试试这个托管 CI:http://www.php-ci.net/hosting/create-project
但请记住,如果您自己集成这些工具,则需要自定义支持。
您是否也考虑过项目管理和补丁管理?
您可以使用 Redmine 进行项目管理。它集成了持续集成支持,但仅作为客户端(而不是 CI 服务器)。
尝试使用托管的 SVN/GIT/等。解决方案,因为它们将覆盖您的备份并保持其服务器运行,因此您可以专注于开发。
有关如何设置 Hudson 的教程,请参阅:http://toptopic.wordpress.com/2009/02/26/php-and-hudson/
【讨论】:
感谢您的链接。我熟悉的产品,我希望是更多像你提供的那样的教程式演练。 嗨,截至 2012 年 10 月,php-ci.net 是否已关闭或已退出服务?我似乎无法连接到该地址,也找不到过去一年的新信息。 @Ryan,我不知道发生了什么。我知道,你可以试试其他人。也许您可以尝试:CircleCI 或者您可以查看此主题:Hosted Continuous Integration for PHP? @Ryan,不,它没有关闭,我已经使用了一段时间了。他们已移至 phptesting.org【参考方案3】:我将 Atlassian 的 Bamboo 持续集成服务器用于我的主要 PHP 项目(以及他们的其他产品,例如 fisheye(存储库浏览)、jira(问题跟踪器)和 clover(代码覆盖率))。
它支持 SVN,现在支持 Git,它有一个很棒的用户界面。它适用于 linux、windows 和 mac,并且可以在自己的 tomcat 服务器上独立运行,这对于不喜欢花几天时间设置工具的人(比如我)来说非常棒)。虽然它可能看起来很贵,但作为一个单独的开发人员,我以 10 美元(软件 10 美元)购买了入门套件许可证。这非常适合小型团队,值得一看。
【讨论】:
如何配置竹子来支持 phing?我目前正在使用 ant,但似乎 phing 更适合用于 php depooyment。谢谢【参考方案4】:PHPTesting PHPCI 这是一个不错的,内置 php 的持续集成服务器。
另外,它的免费和开源。 :)
它有很多插件..
PHPCI 包含以下集成插件:
原子 行为 营火 密码接收 作曲家 电子邮件 咕噜声 IRC PHP 皮棉 mysql P依赖 PostgreSQL PHP 代码嗅探器 PHP 复制/粘贴检测器 PHP 规范 PHP 单元 Shell 命令 焦油/邮编【讨论】:
虽然我喜欢 PHPCI 我不推荐它。这是令人难以置信的错误和不可靠。遗憾的是,常见的基本功能没有经过适当的单元测试,因此添加项目 URL 等基本功能很难不搞砸。 @Tek 你的 PHP 持续集成策略是什么? @omrakhur 不幸的是,我坚持使用 PHPCI。所有其他软件都非常庞大,并且需要大量设置。一切都有它的优点和缺点。你只需要选择最适合你的。【参考方案5】:我主要是一名系统管理员,但有时我也会编写 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。
【讨论】:
【参考方案6】:我建议使用 Jenkins http://jenkins-ci.org/,它是免费的并且是开源的。
它的设置非常简单,可在多个平台上运行,并且与其他持续集成工具(如 SonarQube (+ SQUALE) 以衡量技术债务和用于测试自动化的修昔底德)很好地集成。
我强烈建议使用 GIT 或 GIT Hub 代替 SVN 进行版本控制。在我看来,它只是一个更好的版本控制系统,可以帮助您在以后扩展您的开发工作。
由于您主要使用 PHP 项目,因此您可以使用其他一些工具。
PHPUnit - 用于单元测试
PHP CodeSniffer - 检查编码标准
PHP Depend - 显示您的 PHP 代码依赖项
XDEBUG - 用于性能测试
所有这些工具都由 Jenkins 作业触发,有助于提高代码的质量和性能。
祝你好运,尽情享受!
【讨论】:
【参考方案7】:我不使用很多产品,甚至你使用的产品类型,但我会给你我的经验。
我在我的 PROD 环境中并行运行一个 TEST 环境。我本身没有本地测试。如果很难将某些东西融入真正的 TEST 环境,那么我会修复我的构建过程。由于环境不同,我看不出在本地进行测试有什么意义。更新:我在本地做的唯一一件事就是在上传任何内容之前运行“php -l”。停止愚蠢的错误。
构建过程适用于当前工作区中的任何内容,包括未提交的代码。这不是每个人的一杯茶,但我会经常测试。在进入 PROD 之前,所有内容都已提交。
我的部分构建过程(与您的类似)会创建两个 META 文件。一个包含最后(通常)100 个更改,还给了我当前的更改列表编号。显示我安装了哪些更改。另一个包含 CLIENTSPEC(以 Perforce 术语),它准确地向我展示了在此构建中使用了哪些分支。这些一起为我提供了可重现的构建。
我不直接构建到目标环境,而是构建到服务器上的暂存区。我使用 SSH,所以这是有道理的。这给了我一些好处。最重要的是,它避免了在大量上传中途死亡。它还为我提供了一个存储 META 文件的地方,并且所有构建文件都会自动存档(因此我可以直接返回任何构建)。该脚本还记录更新(因此日志流中有一个条目,我可以看到前后)并启动所有守护程序(我使用 daemontools 所以“svc -t”)。所有这些都在目标机器上更好。
另一个问题是数据库更改。我保留了数据库架构的主脚本,每次架构更改时都会更新该脚本。每个更改还进入一个 changes.sql 脚本,该脚本与构建一起上传到暂存区。该脚本作为安装脚本的一部分运行。
【讨论】:
感谢您的输入 Phil,这是一个非常非常有趣的设置,我想我可以使用其中的一部分。然而,就我而言,我经常无法通过 SSH 访问远程端,因此我需要大量本地“智能”,这就是为什么我认为我需要像 Hudson 这样的 CI 产品。【参考方案8】:我最近开始了同样的过程,并且正在使用Beanstalk 进行 svn 托管。
付费帐户中有两个漂亮的功能(我认为从下午 15 美元开始):
部署允许用户为登台和生产服务器创建 ftp 目标,只需单击按钮即可部署(包括指定修订和分支) webhook 允许用户设置在每次提交/部署时调用的 url,传递修订号、描述和用户等内容。这可用于更新文档、运行单元测试和更新变更日志。我确信还有其他托管或自托管的 svn 服务器具有这两个功能,但 beanstalk 是我有经验的,它工作得非常非常好
还有一个 API,我想它可用于将部署进一步集成到您的流程中。
【讨论】:
干杯@adam。我并不为此寻找托管服务,因为我担心它们对于我需要的东西总是太有限了。但你所说的听起来很有趣,API 可能是其余部分的连接点。我会看看这个。 别担心,你可能会这么说。它现在适合我,因为我还没有完全了解 svn(而且我是一个单人团队),而且如果你想搬家,他们会提供完整的 repo 导出。【参考方案9】:考虑fazend.com,这是一个免费的托管 CI 平台,可自动执行配置和安装过程。您无需设置版本控制、错误跟踪、CI 服务器、测试环境等。一切都按需完成。
【讨论】:
嗯,这看起来很有趣!但他们如何生存?看到一切都是免费的?他们如何支付服务器费用以及 E3 费用? @Pekka 这个项目是由一家软件开发公司赞助的,所以服务是免费的以上是关于为 PHP 项目设置部署/构建/CI 周期的主要内容,如果未能解决你的问题,请参考以下文章
无法从部署中心为 Dotnet core 3.1 配置 CI 构建。有啥方法可以设置 CI Azure DevOps