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

重新引入詹金斯:使用管道的自动测试

Christopher Nolan
Christopher Nolan原创
2025-02-10 15:01:09843浏览

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,它可能看起来类似于这样:

<code class="language-groovy">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'
    }
}</code>

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:

<code class="language-groovy">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'
    }
}</code>

安装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部分,然后输入以下脚本:

<code class="language-bash">sudo apt-get update && sudo apt-get install jenkins</code>

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

Re-Introducing Jenkins: Automated Testing with Pipelines

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

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

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

<code class="language-groovy">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'
    }
}</code>

Jenkinsfile

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

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

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

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

Re-Introducing Jenkins: Automated Testing with Pipelines

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

<code class="language-bash">sudo apt-get update && sudo apt-get install jenkins</code>

现在返回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服务一起工作)。

<code class="language-groovy">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'
    }
}</code>

多分支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脚本的一部分发送:

<code class="language-bash">sudo apt-get update && sudo apt-get install jenkins</code>

在服务器上启动并运行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