搜索
首页后端开发php教程重新引入詹金斯:使用管道的自动测试

Re-Introducing Jenkins: Automated Testing with Pipelines

核心要点

  • Jenkins是一款流行的开源构建服务器,支持对复杂应用程序进行自动化测试,通过在部署前发现和解决错误来加快发布流程。
  • Jenkins Pipeline(在2.0版本中引入)是一组用Groovy脚本语言编写的可定制步骤,用于测试和构建代码。如果一个步骤失败,整个构建都会失败,Jenkins将停止执行。
  • Jenkins可以使用Laravel Homestead轻松安装和配置。设置完成后,可以创建一个新的构建作业来检出项目的最新版本,安装依赖项并运行单元测试。
  • Jenkins Pipeline可以作为Jenkinsfile脚本写在代码库的根目录中,从而实现版本控制。还可以设置多分支Pipeline作业,以便对项目的不同分支运行不同的操作。
  • Jenkins支持广泛的插件生态系统,可以安装和配置这些插件来扩展其功能,包括测试插件和与云服务的集成。可以将其配置为在每次将提交推送到存储库时自动构建,并且应该正确地进行安全保护。

随着应用程序变得越来越复杂——包含Composer依赖项、Webpack构建脚本和每个环境变量——我们不可避免地会达到这样一个点:测试所有这些不同的复杂性变得缓慢而费力,尤其是在每次测试都需要拆除和重建整个环境时。同样,代码风格也可能随着时间的推移而发生偏差,创建可用于生产的部署归档需要遵循一组特定的步骤。

假设要测试应用程序,需要执行以下步骤:

  1. 运行composer install以确保安装了依赖项
  2. 对代码库中的每个PHP文件运行php -l以检查语法错误
  3. 运行PHPUnit进行单元测试
  4. 运行Codeception进行功能测试

Re-Introducing Jenkins: Automated Testing with Pipelines

如果这些步骤中的任何一个失败,则在解决错误之前,软件应被认为不适合部署。随着软件变得越来越复杂,测试数量随着时间的推移而增加,运行完整的测试套件可能需要几分钟的时间,这会减慢开发人员的速度,进而减慢发布流程。

为了克服这个问题,可以在开发工作流程中引入构建服务器。构建服务器运行一段软件,使您可以反复运行一系列步骤,如果其中一个步骤失败,构建服务器可以通知您问题。如果您参与过开源项目,您可能已经看到过TravisCI或CircleCI等构建服务器的实际应用。例如,Laravel项目的每个拉取请求都由TravisCI进行测试,以确保更改不会破坏任何测试,然后StyleCI确保代码更改与项目代码风格匹配。

Re-Introducing Jenkins: Automated Testing with Pipelines

Jenkins是一款流行的开源构建服务器,今年发布了2.0版本。此新版本的主要功能之一是将(以前可选的)Pipeline插件作为核心功能包含在内。

Pipeline是一组完全可定制的步骤,可以按顺序运行以测试和构建代码。Pipeline是用Groovy脚本语言编写的,它具有非常简单的语法,易于上手。例如,如果要将前面描述的测试步骤描述为Pipeline,它可能看起来类似于这样:

node {
    stage("composer_install") {
        sh 'composer install'
    }

    stage("php_lint") {
        sh 'find . -name "*.php" -print0 | xargs -0 -n1 php -l'
    }

    stage("phpunit") {
        sh 'vendor/bin/phpunit'
    }

    stage("codeception") {
        sh 'vendor/bin/codecept run'
    }
}

node语句告诉Jenkins分配一个单独的构建节点(Jenkins可以以单服务器模式或多节点设置运行)。node块内有多个阶段,每个阶段执行特定操作。Jenkins将依次运行每个阶段,如果任何一个阶段失败,则整个构建将失败,Jenkins将停止执行。

从这个简单的示例中,可以轻松地添加其他测试的附加阶段,告诉Jenkins发送成功或失败构建的Slack通知,将成功测试的代码推送到发布分支或将拉取请求标记为可以合并。

安装Jenkins

Jenkins非常易于安装,在本教程中,我们将使用Laravel Homestead提供一致的虚拟环境,以便您可以在本地使用Jenkins。

第一步是安装Laravel Homestead——这里有一个有用的指南。您只需要启动和运行虚拟机,我们不需要在homestead.yaml文件中配置任何站点。

启动并运行Homestead虚拟机后,使用vagrant ssh登录到它。

Homestead附带了我们所需的所有依赖项,即Git、PHP和Composer,因此我们只需要安装Jenkins本身。按照Jenkins Debian软件包指南,我们需要执行以下步骤。

运行wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -。此命令将代码签名密钥添加到Aptitude,以便信任来自此存储库的Jenkins软件包。

接下来,需要更新软件包源列表,以便Aptitude知道Jenkins软件包存储库。执行echo "deb https://pkg.jenkins.io/debian-stable binary/" | sudo tee -a /etc/apt/sources.list

最后,我们需要Aptitude更新其可用软件包的缓存,然后安装Jenkins:

node {
    stage("composer_install") {
        sh 'composer install'
    }

    stage("php_lint") {
        sh 'find . -name "*.php" -print0 | xargs -0 -n1 php -l'
    }

    stage("phpunit") {
        sh 'vendor/bin/phpunit'
    }

    stage("codeception") {
        sh 'vendor/bin/codecept run'
    }
}

安装Jenkins大约需要五分钟,因为它还有许多也需要安装的依赖项。

安装Jenkins后,在浏览器中打开http://192.168.10.10:8080(或您配置的虚拟主机URL,例如homestead.app),您应该会看到一个标题为“解锁Jenkins”的页面。

Re-Introducing Jenkins: Automated Testing with Pipelines

在虚拟机中,运行以下命令——sudo cat /var/lib/jenkins/secrets/initialAdminPassword,一个随机的数字和字母字符串将打印到控制台。将该字符串复制并粘贴到浏览器中的文本字段中,然后按“继续”。

Re-Introducing Jenkins: Automated Testing with Pipelines

您将看到两个选项——选择“安装建议的插件”,然后等待几分钟,直到插件下载并安装完成。

Re-Introducing Jenkins: Automated Testing with Pipelines

在下一个屏幕上,输入管理员用户的详细信息,然后按“保存并完成”。

Re-Introducing Jenkins: Automated Testing with Pipelines

Jenkins现在已安装并配置!

创建第一个作业

设置Jenkins后,我们将创建一个新的构建作业,该作业将执行以下操作:

  1. 检出laravel/framework的最新版本
  2. 安装Composer依赖项
  3. 运行PHPUnit

单击仪表板上的“创建新作业”链接(或“新建项目”链接——它们都执行相同的操作)。

Re-Introducing Jenkins: Automated Testing with Pipelines

输入名称laravel,选择“Pipeline”,然后按“确定”。

您现在将看到该作业的配置编辑器。向下滚动到Pipeline部分,然后输入以下脚本:

sudo apt-get update && sudo apt-get install jenkins

按“保存”。您将被重定向到作业概述页面,几秒钟后,您将看到作业启动。如果它没有启动,只需单击左侧菜单中的“立即构建”链接。

Re-Introducing Jenkins: Automated Testing with Pipelines

当我们在Pipeline脚本中定义的每个阶段开始和结束时,阶段视图将更新。

如果单击某个阶段,将出现一个覆盖层,其中包含该阶段的日志输出,这对于调试非常有用。或者,您可以单击左侧菜单中的作业,然后单击“控制台”。

所有Jenkins作业都有自己的工作区,这是一个区域,您可以在其中安全地创建构建区域中可能需要的任何临时文件。此作业的工作区位置可以在/var/lib/jenkins/workspace/laravel中找到。默认情况下,Jenkins不会为每次构建清除此工作区。如果需要这样做,可以将一个阶段添加到Pipeline脚本的开头,如下所示:

node {
    stage("composer_install") {
        sh 'composer install'
    }

    stage("php_lint") {
        sh 'find . -name "*.php" -print0 | xargs -0 -n1 php -l'
    }

    stage("phpunit") {
        sh 'vendor/bin/phpunit'
    }

    stage("codeception") {
        sh 'vendor/bin/codecept run'
    }
}

Jenkinsfile

对于我们的第一个作业,我们在作业设置界面中编辑了Pipeline脚本。但是,将此脚本与我们的代码一起保存在版本控制中会更有用。

使用Jenkins的Pipeline,您可以将Pipeline作为Jenkinsfile脚本写在代码存储库的根目录中,它将被发现并运行。它的概念类似于您可能已经熟悉的.travis.yml.circleci.yml文件。

laravel/framework Github项目页面上,单击右上角的“fork”按钮,然后单击弹出窗口中的个人资料。

创建一个名为jenkinsfile的新分支,然后创建一个新文件(可以直接在Github中执行此操作,如果不需要,则不必克隆存储库)。

Re-Introducing Jenkins: Automated Testing with Pipelines

输入以下脚本并提交文件:

sudo apt-get update && sudo apt-get install jenkins

现在返回Jenkins,然后单击左侧菜单中的“配置”按钮。向下滚动到Pipeline部分,并将“定义”下拉菜单从Pipeline脚本更新为SCM。

Re-Introducing Jenkins: Automated Testing with Pipelines

输入您已分叉的存储库的详细信息,然后点击“保存”。

Re-Introducing Jenkins: Automated Testing with Pipelines

在作业概述屏幕上,单击左侧菜单中的“立即构建”。您应该有一个成功的构建。

多分支Pipeline项目

大多数软件项目使用存储库中的多个分支来定义项目的不同阶段。例如:

  • master分支代表当前的生产版本
  • develop分支代表当前的暂存版本
  • feature/new-profile-page分支可能代表正在进行的功能

对于每个分支,您可能希望运行许多自定义操作——例如,每当master或develop分支有提交时,您都希望运行完整的单元和集成测试,而在所有其他分支上,只有单元测试就足够了。

Jenkinsfile是用Groovy编程语言编写的,这意味着我们有了一个完整的脚本语言可以使用。

在这个例子中,我添加了一个if语句来检查分支名称;如果它是master或develop,则Jenkins应该运行integration_tests阶段。

之后,有一个switch语句,根据分支名称,创建一个不同的部署归档并将其注册到代码部署服务(在这个例子中,我演示了这将如何与Amazon Web Service的CodeDeploy服务一起工作)。

node {
    stage("composer_install") {
        sh 'composer install'
    }

    stage("php_lint") {
        sh 'find . -name "*.php" -print0 | xargs -0 -n1 php -l'
    }

    stage("phpunit") {
        sh 'vendor/bin/phpunit'
    }

    stage("codeception") {
        sh 'vendor/bin/codecept run'
    }
}

多分支Pipeline作业同样易于设置——创建项目时,选择“多分支Pipeline”作为类型:

Re-Introducing Jenkins: Automated Testing with Pipelines

然后,在配置屏幕中,将Pipeline定义下拉菜单设置为SCM中的Pipeline脚本,并输入存储库详细信息。

每当运行“分支索引”选项(它替换作业内的“立即构建”菜单项)时,Jenkins将递归迭代存储库中的每个分支,并且对于最近更改的每个具有Jenkinsfile的分支,将运行该分支的新构建。

更进一步

Jenkins的流行很大程度上归功于其广泛的插件生态系统。

在Jenkins主屏幕上,单击左侧菜单中的“管理Jenkins”,然后单击“插件管理器”。

Re-Introducing Jenkins: Automated Testing with Pipelines

您可以安装和配置数十个插件,从测试插件到与云服务的集成。

例如,如果您的团队使用Slack,您可以启用Slack Notification插件。在主要的Jenkins设置屏幕(“管理Jenkins”->“配置系统”)中对其进行配置,然后可以将Slack消息作为Pipeline脚本的一部分发送:

sudo apt-get update && sudo apt-get install jenkins

在服务器上启动并运行Jenkins后,可以轻松配置作业,以便在每次将提交推送到存储库时自动构建(或运行分支索引)。

对于Github项目,请确保已安装并启用了Github插件,然后在Github存储库设置中启用与“Jenkins(Github插件)”服务的集成。

对于Bitbucket,这稍微复杂一些,我已经在我的博客上详细介绍了所需步骤。

还应该确保Jenkins服务器已正确保护——可以在Jenkins中手动创建用户,使用OAuth将身份验证委托给Github或Bitbucket,或者将Jenkins连接到组织的LDAP目录。同样,应该始终通过SSL运行Jenkins,以便无法轻松拦截对Jenkins的访问。

Jenkins安装还附带一个“代码片段生成器”,它允许您查看所有启用的Pipeline函数(例如,我们已经使用过的sh、slackSend、deleteDir()和scm)。您可以在作业概述屏幕的左侧菜单中找到指向它的链接。

总结

Jenkins是一个非常强大的工具,可以帮助提高软件的可靠性,并为您和您的团队节省大量时间。人类非常不擅长一遍又一遍地执行重复性任务,但是,计算机擅长这一点。

如果您的团队因运行时间超过五分钟的测试而速度变慢,请将该测试卸载到Jenkins。

如果希望在新的生产或暂存版本可用时自动生成部署归档,Jenkins可以做到这一点。

如果希望密切关注代码质量并在客户发现之前发现回归,那么Jenkins随时准备提供帮助。

请在下方留下任何问题或评论,并告诉我们您最具创意的Jenkins Pipeline!

如果您喜欢这篇文章,您可能还会发现以下内容有用:

  • Cypress测试:运行Web应用程序测试指南
  • 使用unittest和pytest介绍Python单元测试
  • 如何使用Jest测试React组件
  • 使用Puppeteer学习端到端测试
  • 三种免提持续测试方法

Jenkins使用Pipeline进行自动化测试的常见问题解答

使用Jenkins进行自动化测试的好处是什么?

Jenkins是一个流行的开源工具,它为自动化测试提供了许多好处。首先,它提供了持续集成和持续交付(CI/CD),允许开发人员更频繁地将更改集成到项目中。这导致及早发现潜在问题并减少修复时间。其次,Jenkins支持各种插件,使其高度可定制并适应不同的项目需求。第三,它提供实时测试结果和详细报告,这有助于快速识别和解决问题。最后,Jenkins支持Pipeline,这是一组工具,允许通过Pipeline领域特定语言(DSL)将简单到复杂的交付Pipeline“作为代码”建模。

如何为PHP测试设置Jenkins?

为PHP测试设置Jenkins涉及几个步骤。首先,需要在服务器上安装Jenkins。安装后,可以安装PHP测试所需的插件,例如PHP插件、PHPUnit插件等。安装插件后,可以创建一个新的Jenkins作业并为PHP项目配置它。这包括设置源代码管理、构建触发器和构建步骤。在构建步骤中,可以指定运行PHP测试的命令。配置完成后,可以运行作业,Jenkins将执行测试并提供详细报告。

Jenkins如何与PHPUnit一起进行测试?

Jenkins通过在Jenkins作业中执行PHPUnit测试来与PHPUnit一起工作。可以在Jenkins作业的构建步骤中指定PHPUnit命令。运行作业时,Jenkins将执行PHPUnit测试并捕获结果。然后在Jenkins仪表板中显示结果,提供测试执行的详细报告。这包括运行、通过、失败和跳过的测试数量,以及代码覆盖率。

使用PHPUnit的Jenkins PHP应用程序的正确工作流程是什么?

使用PHPUnit的Jenkins PHP应用程序的正确工作流程通常包括以下步骤:首先,从版本控制系统检出源代码。接下来,安装任何依赖项,例如PHP项目的Composer。然后,运行PHPUnit测试。然后收集测试结果并在Jenkins仪表板中显示。如果任何测试失败,则构建标记为失败。否则,构建标记为成功。可以使用Jenkins Pipeline自动化此工作流程,从而实现持续集成和交付。

如何在Jenkins中解析PHPUnit和JUnit结果?

可以使用JUnit插件在Jenkins中解析PHPUnit和JUnit结果。运行PHPUnit测试后,可以生成JUnit XML报告。然后,Jenkins中的JUnit插件可以解析此报告。在Jenkins作业的后构建操作中,可以添加“发布JUnit测试结果报告”操作并指定JUnit XML报告的位置。然后,Jenkins将解析报告并在仪表板中显示结果。这包括运行、通过、失败和跳过的测试数量,以及测试持续时间和趋势。

以上是重新引入詹金斯:使用管道的自动测试的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
继续使用PHP:耐力的原因继续使用PHP:耐力的原因Apr 19, 2025 am 12:23 AM

PHP仍然流行的原因是其易用性、灵活性和强大的生态系统。1)易用性和简单语法使其成为初学者的首选。2)与web开发紧密结合,处理HTTP请求和数据库交互出色。3)庞大的生态系统提供了丰富的工具和库。4)活跃的社区和开源性质使其适应新需求和技术趋势。

PHP和Python:探索他们的相似性和差异PHP和Python:探索他们的相似性和差异Apr 19, 2025 am 12:21 AM

PHP和Python都是高层次的编程语言,广泛应用于Web开发、数据处理和自动化任务。1.PHP常用于构建动态网站和内容管理系统,而Python常用于构建Web框架和数据科学。2.PHP使用echo输出内容,Python使用print。3.两者都支持面向对象编程,但语法和关键字不同。4.PHP支持弱类型转换,Python则更严格。5.PHP性能优化包括使用OPcache和异步编程,Python则使用cProfile和异步编程。

PHP和Python:解释了不同的范例PHP和Python:解释了不同的范例Apr 18, 2025 am 12:26 AM

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP和Python:深入了解他们的历史PHP和Python:深入了解他们的历史Apr 18, 2025 am 12:25 AM

PHP起源于1994年,由RasmusLerdorf开发,最初用于跟踪网站访问者,逐渐演变为服务器端脚本语言,广泛应用于网页开发。Python由GuidovanRossum于1980年代末开发,1991年首次发布,强调代码可读性和简洁性,适用于科学计算、数据分析等领域。

在PHP和Python之间进行选择:指南在PHP和Python之间进行选择:指南Apr 18, 2025 am 12:24 AM

PHP适合网页开发和快速原型开发,Python适用于数据科学和机器学习。1.PHP用于动态网页开发,语法简单,适合快速开发。2.Python语法简洁,适用于多领域,库生态系统强大。

PHP和框架:现代化语言PHP和框架:现代化语言Apr 18, 2025 am 12:14 AM

PHP在现代化进程中仍然重要,因为它支持大量网站和应用,并通过框架适应开发需求。1.PHP7提升了性能并引入了新功能。2.现代框架如Laravel、Symfony和CodeIgniter简化开发,提高代码质量。3.性能优化和最佳实践进一步提升应用效率。

PHP的影响:网络开发及以后PHP的影响:网络开发及以后Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP类型提示如何起作用,包括标量类型,返回类型,联合类型和无效类型?PHP类型提示如何起作用,包括标量类型,返回类型,联合类型和无效类型?Apr 17, 2025 am 12:25 AM

PHP类型提示提升代码质量和可读性。1)标量类型提示:自PHP7.0起,允许在函数参数中指定基本数据类型,如int、float等。2)返回类型提示:确保函数返回值类型的一致性。3)联合类型提示:自PHP8.0起,允许在函数参数或返回值中指定多个类型。4)可空类型提示:允许包含null值,处理可能返回空值的函数。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器