過去我們常僅透過UI來建立Jenkins作業。隨著建置與部署作業的複雜度提升,後來提出了「程式碼即管線」的概念。在Jenkins 2.0中,Jenkins團隊引入了Jenkinsfile以實現程式碼即管線。若要建立自動化的拉取請求或分支基礎的Jenkins持續整合與持續交付管線,Jenkins多分支管線是個好選擇。
由於Jenkins多分支管線完全基於Git的程式碼即管線,您可以建構您的CI/CD工作流程。程式碼即管線(PaaC)使得將自動化和雲端可攜性帶入您的Selenium變得容易。您可以使用多分支管線模型快速且可靠地建置、測試、部署、監控、報告和管理您的Selenium測試,以及其他更多功能。在本Jenkins教學中,我們將探討如何建立Jenkins多分支管線以及配置Jenkins多分支管線進行Selenium自動化測試的關鍵概念。
讓我們開始吧。
什麼是Jenkins多分支管線?
根據官方文件,多分支管線工作類型允許您定義一個工作,從單一Git倉庫中,Jenkins將偵測多個分支並在找到Jenkinsfile時創建嵌套工作。
根據上述定義,我們可以理解,Jenkins能夠掃描Git倉庫以尋找Jenkinsfile並自動創建作業。它僅需我們提供Git倉庫的詳細信息。在本文中,我們將使用一個示例GitHub倉庫。我們的示例GitHub倉庫包含一個可部署到Tomcat的Spring Boot示例項目。
在項目的根目錄中,我們擁有Jenkinsfile。我們使用Jenkins宣告式管道語法來創建此Jenkinsfile。如果您是Jenkins宣告式管道的新手,請閱讀我們的詳細文章這裡。
示例Jenkinsfile
pipeline {
agent any
stages {
stage('Build Code') {
steps {
sh """
echo "Building Artifact"
"""
}
}
stage('Deploy Code') {
steps {
sh """
echo "Deploying Code"
"""
}
}
}
}
我們在Jenkinsfile中創建了兩個階段“構建代碼”和“部署代碼”,每個階段都配置為打印適當的消息。現在,我們已經準備好了帶有Jenkinsfile的Git倉庫。
讓我們在Jenkins服務器上創建一個Jenkins多分支管道。
Jenkins Pipeline與多分支Pipeline的比較
Jenkins管道是新熱門,但並非適合所有人。而多分支管道仍然非常出色。在本Jenkins多分支管道教程的這一部分中,讓我們通過Jenkins管道與多分支管道的比較來了解Jenkins管道和多分支管道的理想用例。
Jenkins pipeline 是一個工作配置系統,允許您配置一系列自動執行的工作流程。一個 Jenkins pipeline 可以包含多個階段,每個階段由單一代理執行,這些代理可以在單一機器或多台機器上運行。通常,pipeline 是為特定分支的源代碼創建的。當您創建新工作時,會看到選擇源代碼庫和分支的選項。您也可以為新項目或現有項目的新功能創建全新的 pipeline。
Jenkins pipeline 允許您擁有一個靈活的 Jenkinsfile,其中包含構建階段。因此,您可以在初始階段運行 linting、測試等,然後為構建工件或部署它們設置單獨的階段。當您希望在 pipeline 中執行多項任務時,這非常有用。
如果您只有一件事要做怎麼辦?或者如果您想做的所有事情都根據某些配置有所不同?在這種情況下使用 Jenkins pipeline 有意義嗎?
多分支 pipeline 是一種替代方法,在這些情況下可能更合適。多分支 pipeline 允許您將任務拆分到分支中,稍後再合併它們。這與 Git 分支的工作方式非常相似。
A multibranch pipeline is a pipeline that has multiple branches. The main advantage of using a multibranch pipeline is to build and deploy multiple branches from a single repository. Having a multibranch pipeline also allows you to have different environments for different branches. However, it is not recommended to use a multibranch pipeline if you do not have a standard branching and CI/CD strategy.
現在,既然您已經看到 Jenkins pipeline 與多分支 pipeline 的比較,讓我們逐步了解如何創建 Jenkins 多分支 pipeline。
創建 Jenkins 多分支 Pipeline
步驟 1
打開 Jenkins 首頁(本地為 http://localhost:8080
)並從左側菜單點擊“新建項目”。
步驟 2
輸入Jenkins 作業名稱, 選擇風格為“多分支管線”,然後點擊“確定”。
步驟 3
在“設定”頁面,我們只需配置一件事:Git 倉庫來源。
向下滾動至“分支來源”部分,點擊“新增來源”下拉選單。
選擇“GitHub”作為來源,因為我們的範例 GitHub 倉庫托管在那裡。
步驟 4
輸入倉庫 HTTPS URL為https://github.com/iamvickyav/spring-boot-h2-war-tomcat.git
,然後點擊“驗證”。
由於我們的 GitHub 倉庫是公開的,因此無需配置憑證來訪問它。對於企業/私有倉庫,我們可能需要憑證來訪問。
“憑證正常”訊息表示 Jenkins 伺服器與 Git 倉庫之間的連接成功。
步驟 5
暫時保持其餘配置部分不變,並點擊底部的“保存”按鈕。
保存後,Jenkins 將自動執行以下步驟:
掃描倉庫步驟
- 掃描我們配置的 Git 倉庫。
- 查找 Git 倉庫中可用的分支列表。
- 選擇包含 Jenkinsfile 的分支。
運行構建步驟
- 對於上一步驟中找到的每個分支,按照Jenkinsfile中的步驟進行構建。
從“掃描倉庫日誌”部分,我們可以了解在掃描倉庫步驟中發生了什麼。
由於我們的git倉庫中只有一個主分支,掃描倉庫日誌顯示“處理了1個分支”。
掃描完成後,Jenkins將為每個處理過的分支單獨創建並運行構建作業。
在我們的情況中,只有一個名為master的分支。因此,構建將僅為我們的主分支運行。我們可以通過點擊左側菜單中的“狀態”來檢查這一點。
我們可以在狀態部分看到為主分支創建的構建作業。
點擊分支名稱以查看構建作業日誌和狀態。
“階段視圖”提供了每個階段執行所需時間的視覺表示以及構建作業的狀態。
訪問構建作業運行日誌
步驟1
點擊“構建編號”下的“構建歷史”部分。
步驟2
接下來,從左側菜單中選擇“控制台輸出”以查看日誌。
如果我們的Git倉庫中有超過一個分支會發生什麼?現在讓我們來檢查一下。
在Git倉庫中,創建了一個名為“開發”的新分支。
為了區分“開發”分支構建,我們在Jenkinsfile中的echo命令中做了一些小改動。
Jenkinsfile在主分支
pipeline {
agent any
stages {
stage('Build Code') {
steps {
sh """
echo "Building Artifact"
"""
}
}
stage('Deploy Code') {
steps {
sh """
echo "Deploying Code"
"""
}
}
}
}
Jenkinsfile在開發分支
pipeline {
agent any
stages {
stage('Build Code') {
steps {
sh """
echo "Building Artifact from Develop Branch"
"""
}
}
stage('Deploy Code') {
steps {
sh """
echo "Deploying Code from Develop Branch"
"""
}
}
}
}
現在,我們在兩個不同的分支中有兩個Jenkinsfile。讓我們在Jenkins中重新運行倉庫掃描以查看行為。
我們可以看到新分支(開發分支)已被Jenkins檢測到。因此,為開發分支單獨創建了一個新作業。
點擊“開發”,我們可以看到開發分支構建作業的日誌。
在前面的例子中,我們在主分支和開發分支的Jenkinsfile中保留了不同的內容。但這不是我們在現實世界應用中處理的方式。我們利用階段塊內的when塊來檢查分支。
這裡有一個例子,結合了主分支和開發分支的步驟。這相同的內容將放置在主分支和開發分支的Jenkinsfiles中。
pipeline {
agent any
stages {
stage('Master Branch Deploy Code') {
when {
branch 'master'
}
steps {
sh """
echo "Building Artifact from Master branch"
"""
sh """
echo "Deploying Code from Master branch"
"""
}
}
stage('Develop Branch Deploy Code') {
when {
branch 'develop'
}
steps {
sh """
echo "Building Artifact from Develop branch"
"""
sh """
echo "Deploying Code from Develop branch"
"""
}
}
}
}
步驟3
點擊左側菜單中的“掃描倉庫”,讓Jenkins檢測來自Git倉庫的新變更。
到目前為止,你可能已經注意到,每當我們希望Jenkins從倉庫檢測變更時,我們都在使用掃描倉庫。
如何自動化這一步驟呢?
Jenkins多分支流水線掃描的定期觸發器
步驟1
點擊左側菜單中的“配置”。
步驟2
向下滾動至“掃描儲存庫觸發器”部分,啟用“若無其他設定則定期執行”複選框,並選擇掃描運行的時間間隔(在我們的例子中是兩分鐘)。
步驟3
點擊“保存”按鈕。
從現在開始,Jenkins將每兩分鐘掃描一次儲存庫。如果在任何分支中發現新提交,Jenkins將使用Jenkinsfile為該特定分支運行新的構建作業。
以下是“掃描儲存庫日誌”,清楚顯示每兩分鐘觸發一次掃描。
Jenkins多分支管道即時用例
以下是幾個Jenkins多分支管道可以派上用場的場景:
- 主分支中的任何新提交都必須自動部署到伺服器。
- 如果開發人員嘗試向開發分支提出拉取請求(PR),則:
- 代碼應成功構建且無編譯錯誤。
- 代碼應至少有80%的測試覆蓋率。
- 代碼應通過SONAR代碼質量測試。
- 如果開發人員嘗試將代碼推送到主分支或開發分支以外的分支,代碼應成功編譯。如果沒有,發送警報郵件。
這裡是一個涵蓋上述部分用例的Jenkinsfile示例:
pipeline {
agent any
tools {
maven 'MAVEN_PATH'
jdk 'jdk8'
}
stages {
stage("Tools initialization") {
steps {
sh "mvn --version"
sh "java -version"
}
}
stage("Checkout Code") {
steps {
checkout scm
}
}
stage("Check Code Health") {
when {
not {
anyOf {
branch 'master';
branch 'develop'
}
}
}
steps {
sh "mvn clean compile"
}
}
stage("Run Test cases") {
when {
branch 'develop';
}
steps {
sh "mvn clean test"
}
}
stage("Check Code coverage") {
when {
branch 'develop'
}
steps {
jacoco(
execPattern: '**/target/**.exec',
classPattern: '**/target/classes',
sourcePattern: '**/src',
inclusionPattern: 'com/iamvickyav/**',
changeBuildStatus: true,
minimumInstructionCoverage: '30',
maximumInstructionCoverage: '80')
}
}
stage("Build and Deploy Code") {
when {
branch 'master'
}
steps {
sh "mvn tomcat7:deploy"
}
}
}
}
我們已將此新Jenkinsfile提交至master和develop分支,以便在下次倉庫掃描時由Jenkins多分支檢測到。
使用Jenkins多分支管道的Selenium自動化測試
假設我們正在為一個網站編寫自動化測試案例。每當分支中提交新測試案例時,我們希望運行它們並確保其按預期執行。
在每種瀏覽器和操作系統組合上運行自動化測試案例對任何開發者來說都是一場噩夢。這正是LambdaTest強大的自動化測試基礎設施派上用場的地方。
利用LambdaTest Selenium網格,您可以最大化瀏覽器覆蓋率。
在本節中,我們將了解如何利用LambdaTest的測試基礎設施與Jenkins多分支管道。為了演示,我們在此處托管了一個示例Todo應用—LambdaTest ToDo App。使用Cucumber編寫的自動化測試案例已提交至示例倉庫。
從Jenkins,我們希望在LambdaTest平台上運行這些測試案例。在LambdaTest上運行測試案例需要用戶名和accessToken。免費註冊LambdaTest平台以獲取您的憑證。
設置環境變量
當測試案例運行時,它們將查找LambdaTest的用戶名(LT_USERNAME
)和密碼(LT_ACCESS_KEY
)作為環境變量。因此,我們需要事先配置它們。
為了避免將它們存儲在源代碼中,我們將它們配置為Jenkins中的機密,並從中加載環境變量:
environment {
LAMBDATEST_CRED = credentials('Lambda-Test-Credentials-For-multibranch')
LT_USERNAME = "$LAMBDATEST_CRED_USR"
LT_ACCESS_KEY = "$LAMBDATEST_CRED_PSW"
}
以下是我們的最終Jenkinsfile:
pipeline {
agent any
tools {
maven 'MAVEN_PATH'
jdk 'jdk8'
}
stages {
stage("Tools initialization") {
steps {
sh "mvn --version"
sh "java -version"
}
}
stage("Checkout Code") {
steps {
checkout scm
}
}
stage("Check Code Health") {
when {
not {
anyOf {
branch 'master';
branch 'develop'
}
}
}
steps {
sh "mvn clean compile"
}
}
stage("Run Test cases in LambdaTest") {
when {
branch 'develop';
}
environment {
LAMBDATEST_CRED = credentials('Lambda-Test-Credentials-For-multibranch')
LT_USERNAME = "$LAMBDATEST_CRED_USR"
LT_ACCESS_KEY = "$LAMBDATEST_CRED_PSW"
}
steps {
sh "mvn test"
}
}
}
}
現在,我們將按照上述章節所述的步驟,在Jenkins中創建一個新的“Job”作為多分支流水線。讓我們指向示例倉庫。
一旦構建成功運行,訪問LambdaTest自動化儀表板以獲取測試日誌。
結論
通過這些,我們學習了如何創建Jenkins多分支流水線,如何在其中配置git倉庫,為不同分支設置不同的構建步驟,利用Jenkins進行倉庫的定期自動掃描,以及利用LambdaTest強大的自動化測試基礎設施來自動化我們的CI/CD構建。希望您覺得這篇文章有用。請在評論區分享您的反饋。
Source:
https://dzone.com/articles/how-to-create-jenkins-multibranch-pipeline