首頁 >後端開發 >php教程 >重新引入詹金斯:使用管道的自動測試

重新引入詹金斯:使用管道的自動測試

Christopher Nolan
Christopher Nolan原創
2025-02-10 15:01:09738瀏覽

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