核心要点
随着应用程序变得越来越复杂——包含Composer依赖项、Webpack构建脚本和每个环境变量——我们不可避免地会达到这样一个点:测试所有这些不同的复杂性变得缓慢而费力,尤其是在每次测试都需要拆除和重建整个环境时。同样,代码风格也可能随着时间的推移而发生偏差,创建可用于生产的部署归档需要遵循一组特定的步骤。
假设要测试应用程序,需要执行以下步骤:
composer install
以确保安装了依赖项php -l
以检查语法错误如果这些步骤中的任何一个失败,则在解决错误之前,软件应被认为不适合部署。随着软件变得越来越复杂,测试数量随着时间的推移而增加,运行完整的测试套件可能需要几分钟的时间,这会减慢开发人员的速度,进而减慢发布流程。
为了克服这个问题,可以在开发工作流程中引入构建服务器。构建服务器运行一段软件,使您可以反复运行一系列步骤,如果其中一个步骤失败,构建服务器可以通知您问题。如果您参与过开源项目,您可能已经看到过TravisCI或CircleCI等构建服务器的实际应用。例如,Laravel项目的每个拉取请求都由TravisCI进行测试,以确保更改不会破坏任何测试,然后StyleCI确保代码更改与项目代码风格匹配。
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非常易于安装,在本教程中,我们将使用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”的页面。
在虚拟机中,运行以下命令——sudo cat /var/lib/jenkins/secrets/initialAdminPassword
,一个随机的数字和字母字符串将打印到控制台。将该字符串复制并粘贴到浏览器中的文本字段中,然后按“继续”。
您将看到两个选项——选择“安装建议的插件”,然后等待几分钟,直到插件下载并安装完成。
在下一个屏幕上,输入管理员用户的详细信息,然后按“保存并完成”。
Jenkins现在已安装并配置!
设置Jenkins后,我们将创建一个新的构建作业,该作业将执行以下操作:
laravel/framework
的最新版本单击仪表板上的“创建新作业”链接(或“新建项目”链接——它们都执行相同的操作)。
输入名称laravel
,选择“Pipeline”,然后按“确定”。
您现在将看到该作业的配置编辑器。向下滚动到Pipeline部分,然后输入以下脚本:
<code class="language-bash">sudo apt-get update && sudo apt-get install jenkins</code>
按“保存”。您将被重定向到作业概述页面,几秒钟后,您将看到作业启动。如果它没有启动,只需单击左侧菜单中的“立即构建”链接。
当我们在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>
对于我们的第一个作业,我们在作业设置界面中编辑了Pipeline脚本。但是,将此脚本与我们的代码一起保存在版本控制中会更有用。
使用Jenkins的Pipeline,您可以将Pipeline作为Jenkinsfile脚本写在代码存储库的根目录中,它将被发现并运行。它的概念类似于您可能已经熟悉的.travis.yml
或.circleci.yml
文件。
在laravel/framework
Github项目页面上,单击右上角的“fork”按钮,然后单击弹出窗口中的个人资料。
创建一个名为jenkinsfile
的新分支,然后创建一个新文件(可以直接在Github中执行此操作,如果不需要,则不必克隆存储库)。
输入以下脚本并提交文件:
<code class="language-bash">sudo apt-get update && sudo apt-get install jenkins</code>
现在返回Jenkins,然后单击左侧菜单中的“配置”按钮。向下滚动到Pipeline部分,并将“定义”下拉菜单从Pipeline脚本更新为SCM。
输入您已分叉的存储库的详细信息,然后点击“保存”。
在作业概述屏幕上,单击左侧菜单中的“立即构建”。您应该有一个成功的构建。
大多数软件项目使用存储库中的多个分支来定义项目的不同阶段。例如:
对于每个分支,您可能希望运行许多自定义操作——例如,每当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”作为类型:
然后,在配置屏幕中,将Pipeline定义下拉菜单设置为SCM中的Pipeline脚本,并输入存储库详细信息。
每当运行“分支索引”选项(它替换作业内的“立即构建”菜单项)时,Jenkins将递归迭代存储库中的每个分支,并且对于最近更改的每个具有Jenkinsfile的分支,将运行该分支的新构建。
Jenkins的流行很大程度上归功于其广泛的插件生态系统。
在Jenkins主屏幕上,单击左侧菜单中的“管理Jenkins”,然后单击“插件管理器”。
您可以安装和配置数十个插件,从测试插件到与云服务的集成。
例如,如果您的团队使用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!
如果您喜欢这篇文章,您可能还会发现以下内容有用:
Jenkins是一个流行的开源工具,它为自动化测试提供了许多好处。首先,它提供了持续集成和持续交付(CI/CD),允许开发人员更频繁地将更改集成到项目中。这导致及早发现潜在问题并减少修复时间。其次,Jenkins支持各种插件,使其高度可定制并适应不同的项目需求。第三,它提供实时测试结果和详细报告,这有助于快速识别和解决问题。最后,Jenkins支持Pipeline,这是一组工具,允许通过Pipeline领域特定语言(DSL)将简单到复杂的交付Pipeline“作为代码”建模。
为PHP测试设置Jenkins涉及几个步骤。首先,需要在服务器上安装Jenkins。安装后,可以安装PHP测试所需的插件,例如PHP插件、PHPUnit插件等。安装插件后,可以创建一个新的Jenkins作业并为PHP项目配置它。这包括设置源代码管理、构建触发器和构建步骤。在构建步骤中,可以指定运行PHP测试的命令。配置完成后,可以运行作业,Jenkins将执行测试并提供详细报告。
Jenkins通过在Jenkins作业中执行PHPUnit测试来与PHPUnit一起工作。可以在Jenkins作业的构建步骤中指定PHPUnit命令。运行作业时,Jenkins将执行PHPUnit测试并捕获结果。然后在Jenkins仪表板中显示结果,提供测试执行的详细报告。这包括运行、通过、失败和跳过的测试数量,以及代码覆盖率。
使用PHPUnit的Jenkins PHP应用程序的正确工作流程通常包括以下步骤:首先,从版本控制系统检出源代码。接下来,安装任何依赖项,例如PHP项目的Composer。然后,运行PHPUnit测试。然后收集测试结果并在Jenkins仪表板中显示。如果任何测试失败,则构建标记为失败。否则,构建标记为成功。可以使用Jenkins Pipeline自动化此工作流程,从而实现持续集成和交付。
可以使用JUnit插件在Jenkins中解析PHPUnit和JUnit结果。运行PHPUnit测试后,可以生成JUnit XML报告。然后,Jenkins中的JUnit插件可以解析此报告。在Jenkins作业的后构建操作中,可以添加“发布JUnit测试结果报告”操作并指定JUnit XML报告的位置。然后,Jenkins将解析报告并在仪表板中显示结果。这包括运行、通过、失败和跳过的测试数量,以及测试持续时间和趋势。
以上是重新引入詹金斯:使用管道的自动测试的详细内容。更多信息请关注PHP中文网其他相关文章!