Jenkins實踐指南-10-Jenkins 插件

6. Jenkins 插件

    [作者:Surpassme]Jenkins之所以這麼流行,不僅在於本身功能非常齊全,也在於本身插件非常豐富,以下主要介紹平時經常使用的到插件。

6.1 插件安裝

    [作者:Surpassme]依次點擊Manage Jenkins -> Manage Plugins -> Available,搜索插件並安裝即可,示意圖如下所示:

6.2 常用插件

6.2.1 Git Parameter

    [作者:Surpassme]該插件允許在構建時,選擇指定的git分支、標籤等,官網地址 :https://plugins.jenkins.io/git-parameter/。pipeline 示例錄下所示:

pipeline {
  agent any
  environment{
     CODE_SUB_DIR_PATH="surpass"
	 CODE_GitURL="https://gitlab.surpass.com/surpass/demo.git"
  }
  parameters {
     gitParameter(
        name:"CODE_TAG_BRANCH_NAME",
        type:"PT_BRANCH_TAG",
        branchFilter: "origin/(.*)",
        defaultValue: "test",
        selectedValue:"DEFAULT",
        sortMode:"DESCENDING_SMART",
        useRepository:"${env.CODE_GitURL}",
        description: "請選擇branch或tag"
        )
  }
  stages {
    stage("拉取代碼"){
		   steps{
		    checkout([
				$class:"GitSCM",
				branches:[[name:"${params.CODE_TAG_BRANCH_NAME}"]],
				doGenerateSubmoduleConfigurations: false,
				extensions: [[
				   $class:"RelativeTargetDirectory",
				   relativeTargetDir:"${env.CODE_SUB_DIR_PATH}"
				]],
				gitTool: "Default",
				submoduleCfg: [],
				userRemoteConfigs:[[
				    credentialsId:"32eddb12-cd66-444b-859d-ccb61c3864d1",
				    url:"${env.CODE_GitURL}"
				]]
			])
		 }
	}
    }
}

    [作者:Surpassme]其主要參數解釋如下所示:

  • type:主要支持PT_TAGPT_BRANCHPT_BRANCH_TAGPT_REVISIONPT_PULL_REQUEST
  • sortMode:主要支持NONEASCENDING_SMARTDESCENDING_SMARTASCENDINGDESCENDING
  • useRepository: 默認使用的gitlab倉庫地址

6.2.2 build user vars

    [作者:Surpassme]通過設置環境變量來獲取啓動任務的用戶名,官網地址:https://plugins.jenkins.io/build-user-vars-plugin/,一般常用於多用戶下的Jenkins環境。主要支持的環境變量如下所示:

變量名稱 描述信息
BUILD_USER Full name (first name + last name)
BUILD_USER_FIRST_NAME First name
BUILD_USER_LAST_NAME Last name
BUILD_USER_ID Jenkins user ID
BUILD_USER_GROUPS Jenkins user groups
BUILD_USER_EMAIL Email address

    [作者:Surpassme]示例用法如下所示:

pipeline{
    agent any
    stages{
        stage("get build user demo"){
            steps{
                script{
                    wrap([$class: 'BuildUser']) {
			env.BUILD_USER = "${BUILD_USER_ID}"
		   }
                }
            }
        }
        stage("print build  user"){
            steps{
                echo "build user is ${env.BUILD_USER}"
            }
        }
    }
}

6.2.3 Pipeline Utility Steps

    [作者:Surpassme]該插件功能非常多,可以用來比較版本大小、查找文件、讀取CSV、JSON、YAML等,其官網地址:https://plugins.jenkins.io/pipeline-utility-steps/,我們以讀寫YAML爲示例,如下所示:

def readYamlFile(filePath,imageName){
    if (fileExists(filePath)){
	   println("Yaml file path is ${filePath}")
	   def data=readYaml(file:filePath)
	   println("YAML文件內容:\n${data}")
	   def testText=data.spec.template.spec.containers[0][0].image
	   data.spec.template.spec.containers[0][0].image=imageName
	   println("修改前的鏡像地址:${testText}\n修改後的鏡像地址:${imageName}")
           return data
       }
   else{
	println("${filePath} not exists,please check !!!")
   }
}

def writeYamlFile(filePath,content,overwrite=true,charset="UTF-8"){
    if (fileExists(filePath)){
	writeYaml(file:filePath,datas:content,overwrite:overwrite,charset:charset)
	}
   else{
	   println("${filePath} not exists,please check !!!")
	}
}

6.2.4 HTTP Request

    [作者:Surpassme]主要用於發送HTTP請求,比如向企業微信機器人發送消息等,官網地址:https://plugins.jenkins.io/http_request/,HTTP Request支持的參數如下所示:

  • url:字符串類型,請示URL地址
  • acceptType:枚舉類型,HTTP請求Header的Accept的值類型,可以支持的參數如下所示:
- NOT_SET
- TEXT_HTML
- TEXT_PLAIN
- APPLICATION_FORM
- APPLICATION_JSON
- APPLICATION_JSON_UTF8 // 若含中文,需要使用這種方式
- APPLICATION_TAR
- APPLICATION_ZIP
- APPLICATION_OCTETSTREAM
  • authentication:字符串類型,使用的是HTTP Basic誰,即用戶名+密碼這種形式
  • consoleLogResponseBody:布爾類型,是否將請求的響應body打印出來
  • contentType:枚舉類型,HTTP請求的Content-Type值類型,同acceptType
  • customHeaders:HttpRequestNameValuePair對象數組,HTTP請求Header部分內容,該對象有3個參數。
name:字符串類型,Header名稱
value:字符串類型,Header值
maskValue:布爾類型,是否隱藏Header值。若爲true,則打印時使用*代替
  • httpMode:枚舉類型,HTTP方法,有GET(默認)、HEAD、POST、PUT、DELETE、OPTIONS、PATCH等
  • httpProxy:字符串類型,HTTP代理地址
  • ignoreSslErrors:布爾類型,是否忽略SSL錯誤
  • requestBody:字符串類型,請求的body內容
  • timeout:整理,超時時間,單位爲秒。默認爲0,代表不設置超時時間
  • vaildResponseCodes:字符串類型,代表HTTP請求成功的狀態碼。其支持3種格式的值
- 單狀態值:如200,當收到200狀態碼,表示HTTP請求成功
- 多狀態值:當響應狀態碼符合多個狀態碼中的一個時,則代表請求成功,多個狀態碼之間使用逗號分隔。如200,300
- 範圍狀態值:格式爲"From:To",如200:302,代表收到200~302的響應狀態碼都算請求成功
  • validResponseContent:字符串類型,假設設置其值爲:supass.name,則只有當HTTP返回的內容中包含了supass.name時,纔算請求成功。
  • quiet:布爾類型,是否關閉所有的日誌打印,默認爲false
  • responseHandle:枚舉類型,獲取HTTP響應內容的方式,其值可以爲:
- NONE:不讀取響應內容
- LEAVE_OPEN:當執行完請求後,並不會返回響應內容,而是返回一個打開的inputStream,由你自己決定如何讀取響應內容,在使用完之後,需要調用inputStream的close方法關閉
- STRING:默認值,將響應內容轉換爲一個字符串
  • outputFile:字符串類型,請求響應內容的輸出路徑alue:布爾類型,是否隱藏Header值。若爲true,則打印時使用*代替

    示例代碼如下所示:

def httpRequestSendMessage(address,method,body){
    def response=httpRequest(url:address,
			acceptType:"APPLICATION_JSON_UTF8",
			contentType:"APPLICATION_JSON_UTF8",
			httpMode:method,
			requestBody:body,
			ignoreSslErrors:true,
			validResponseCodes:"200"
			)
    println("response.status is:${response.status}\nresponse.content:${response.content}")

6.2.5 Allure

    allure是一個輕量級別的多語言測試報告插件,常用於在自動化測試中以WEB形式展示測試報告,官網地址:https://plugins.jenkins.io/allure-jenkins-plugin/,其示例用法如下所示:

post{
  always{
    script{
	   allure([
		 includeProperties : false,
		 jdk:"",
		 properties: [],
		 reportBuildPolicy: "ALWAYS",
		 report: "${env.ALLURE_REPORT_PATH}",
		 results: [[ path: "${env.ALLURE_RESULT_PATH}" ]]
	   ])
	}
  }
}

    [作者:Surpassme]使用注意事項如下所示:

  • report:生成allure最終報告的存儲路徑,其中默認生成的路徑爲相對於$WORKSPACE的路徑
  • results:生成allure的中間數據,即生成的原始報告數據,支持多個路徑中間數據,其中默認生成的路徑爲相對於$WORKSPACE的路徑

6.2.6 Active Choices

    [作者:Surpassme]Active Choices 插件常用於創建動態交互式參數化插件。其官網地址:https://plugins.jenkins.io/uno-choice/,其主要支持的參數類型有:

  • Active Choices Parameter
  • Active Choices Reactive Parameter
  • Active Choices Reactive Reference Parameter

    Active Choices parameters 允許用戶爲任務參數選擇值,參數值如下所示:

  • dynamically generated:動態生成(使用Groovy)
  • dynamically updated based on other UI parameters:基於其他UI參數進行更新
  • multi-valued:多個值
  • rendered with a variety of UI controls, including dynamic HTML:使用多種UI控件渲染,包含動態HTML

6.2.6.1 Active Choices Parameter

  • 1.Behavior

    [作者:Surpassme]Active Choices parameter 使用Groovy腳本動態生成參數列表

  • 2.Rendering

    [作者:Surpassme]Active Choices parameters 可以生成標準列表選擇、複選框和單選框
    [作者:Surpassme]可以生成文本框篩選器來篩選選項

圖片來自於:https://github.com/jenkinsci/active-choices-plugin/blob/master/docs/images/001.jpg

6.2.6.2 Active Choices Reactive and Reactive Reference Parameters

  • 1.Behavior

    [作者:Surpassme]與Active Choices Parameter類似,可以使用Groovy腳本爲構建任務動態生成參數選項,當UI控件值發生變更時,也可以動態級聯更新。

  • 2.Rendering Options

    [作者:Surpassme]Active Choices Reactive:可以生成標準列表選擇、複選框、單選框和文本框篩選器來篩選選項
    [作者:Surpassme]Active Choices Reactive Reference:可以生成HTML列表、HTML輸入框、動態生成HTML等

圖片來自於:https://cdn.jsdelivr.net/gh/jenkinsci/active-choices-plugin@master/docs/images/002.gif

6.2.6.3 Behavior and Rendering Summary

    [作者:Surpassme]以下爲三種Active Choices parameter的行爲和呈現特徵對比

圖片來自於:https://cdn.jsdelivr.net/gh/jenkinsci/active-choices-plugin@master/docs/images/003.jpg

6.2.6.4 Active Choices Parameter 示例

6.2.6.4.1 Active Choices Parameter 示例

    [作者:Surpassme]以下爲在自由風格中的配置,示例如下所示:

    [作者:Surpassme]主要參數解釋如下所示:

  • Name 和 Describe

    [作者:Surpassme]與常規Jenkins 參數一致,用於一個參數的名稱和描述信息

  • Script

    動態生成參數所使用的腳本代碼,腳本返回必須爲 java.util.Listjavajava.util.Map

  • Fallback Script

    [作者:Surpassme]主要提供備用選項,在腳本出錯時,使用該值

  • Choice Type

    [作者:Surpassme]主要提供四種不同的類型選擇單選框複選框列表單選列表多選

  • Enable Filte

    [作者:Surpassme]是否啓用篩選搜索

6.2.6.4.2 Active Choices Parameter Rendering示例
  • 示例-1

  • 示例-2

6.2.6.5 pipeline 示例

    [作者:Surpassme]通過自由風格來配置Active Choice非常方便,但遷移起來也非常麻煩的,pipeline示例如下所示:

properties([
  parameters([
    [
      $class: "ChoiceParameter",
      choiceType: "PT_SINGLE_SELECT",
	  description:"請選擇一個省份",
	  filterable: true,
	  filterLength: 1,
      name: "Province",
      script: [
         $class: "GroovyScript",
         script:[
		    classpath: [],
            sandbox: true,
            script: "return ['江蘇','浙江','安徽']"
		    ],
		 fallbackScript:[
		   classpath: [],
           sandbox: true,
           script: "return['錯誤']"
		 ]
      ]
    ],
    [
      $class: "CascadeChoiceParameter",
      choiceType: "PT_CHECKBOX",
      name: "City",
      referencedParameters: "Province",
      script: [
         $class: "GroovyScript",
         script:[
		    classpath: [],
            sandbox: true,
            script: '''
			if(Province.equals("江蘇")){
			  return ["南京:selected","蘇州","無錫","常州"]
			} else if(Province.equals("浙江")){
			  return ["杭州:selected","紹興","寧波","溫州"]
			} else if(Province.equals("安徽")){
			  return ["合肥:selected","蕪湖","六安","馬鞍山"]
			} else {
			  return ["未知城市"]
			}
			'''
		    ],
		 fallbackScript:[
		   classpath: [],
           sandbox: true,
           script: "return['腳本錯誤']"
		 ]
      ]
   ]
 ])
])

pipeline{
    agent any
    options{
        timestamps()
    }

    stages{
        stage("active choice demo"){
            steps{
                echo "Province is:${params.Province}"
                echo "City is:${params.City}"
            }
        }
    }
}

    [作者:Surpassme]運行結果如下所示:

注意事項:[作者:Surpassme]sandbox需要配置爲true,因Jenkins安全策略限制,若爲false,可能配置選項無法顯示

    常見的Choice Type 如下所示:

  • PT_SINGLE_SELECT:下拉單選
  • PT_MULTI_SELECT:列表多選
  • PT_CHECKBOX:篩選框
  • PT_RADIO:單選框

    [作者:Surpassme]源碼定義如下所示:

/*
* Constants.
*/
// default choice type
public static final String PARAMETER_TYPE_SINGLE_SELECT = "PT_SINGLE_SELECT";
public static final String PARAMETER_TYPE_MULTI_SELECT = "PT_MULTI_SELECT";
public static final String PARAMETER_TYPE_CHECK_BOX = "PT_CHECKBOX";
public static final String PARAMETER_TYPE_RADIO = "PT_RADIO";

// default choice type
public static final String ELEMENT_TYPE_TEXT_BOX = "ET_TEXT_BOX"; 
public static final String ELEMENT_TYPE_ORDERED_LIST = "ET_ORDERED_LIST";
public static final String ELEMENT_TYPE_UNORDERED_LIST = "ET_UNORDERED_LIST";
public static final String ELEMENT_TYPE_FORMATTED_HTML = "ET_FORMATTED_HTML";
public static final String ELEMENT_TYPE_FORMATTED_HIDDEN_HTML = "ET_FORMATTED_HIDDEN_HTML";

源碼鏈接:https://github.com/jenkinsci/active-choices-plugin/blob/master/src/main/java/org/biouno/unochoice/AbstractUnoChoiceParameter.java

6.2.7 郵件通知

    [作者:Surpassme]郵件也是日常Jenkins常用的通知方式,Jenkins默認支持

6.2.7.1 使用Jenkins內置郵件通知功能

    [作者:Surpassme]以QQ郵箱演示,操作步驟如下所示:

在配置郵箱時,需要確認所使用的郵箱已經打開SMTP服務

    1. 設置管理員郵箱,如下所示:

  • 2、配置SMTP服務器信息

  • 3、在pipeline中Post部分加入發送郵件配置
pipeline{
    agent any
    options{
        timestamps()
    }

    stages{
        stage("Test e-mail Demo"){
            steps{
                echo "Test e-mail demo"
            }
        }
    }

    post{
        success{
            mail(
                from: "[email protected]",
                to:   "[email protected]",
                body: "This is test Jenkins send e-mail,please don't reply",
                subject: "Test e-mail demo"
                )
        }
    }
}

    主要參數解釋如下所示:

  • from: 發件人地址
  • to:收件人地址
  • body:郵件正文
  • subject:郵件主題

6.2.7.2 使用E-mail Extension 插件通知

    [作者:Surpassme]如果覺得Jenkins內置的郵件功能不能滿足要求,也可以試試插件E-mail Extension,其官網爲:https://plugins.jenkins.io/email-ext/,其主要特色功能:

  • 可以定製收件人列表
  • 可以將日誌以附件形式進行發送
  • 可以發送附件

    E-mail Extension使用步驟如下所示:

  • 1、配置SMTP服務器信息,如下所示:

  • 2、在pipeline中Post部分加入發送郵件配置
pipeline{
    agent any
    options{
        timestamps()
    }

    stages{
        stage("Test e-mail Demo"){
            steps{
                echo "Test e-mail demo"
            }
        }
    }

    post{
        success{
            emailext (
                to:   "[email protected]",
                subject: "Test e-mail demo",
                body: """
                       JobName:${env.JOB_NAME}
                       BuildNumber:${env.BUILD_NUMBER}
                       BuildURL:${env.BUILD_URL}
                       View console log url:${env.BUILD_URL}console
                      """,
                compressLog: true,
                attachLog: true,
                recipientProviders: [developers(), requestor()],
                )
        }
    }
}

    運行結果如下所示:

    [作者:Surpassme]emailext的主要參數解釋如下所示:

  • from:可選,爲string類型,發件人地址
  • to:可選,爲string類型,收件人地址
  • subject:爲string類型,郵件主題
  • body:爲string類型,郵件正文
  • compressLog:爲boolean類型,是否壓縮日誌
  • attachLog:可選,爲boolean類型,是否將構建日誌以附件形式發送
  • attachmentsPattern:可選,爲string類型,需要發送的附件的路徑,支持ANT風格路徑表達式
  • recipientProviders:可選,List類型,收件人列表類型

    常用的收件人列表類型如下所示

類型名稱 功能解釋
developers 此次構建所涉及變更的所有提交者列表
requestor 啓動構建任務的人
culprits 引發構建失敗的,即最後一次構建成功和最後一次構建失敗之間的變更提交者列表

6.2.8 Periodic Backup

    [作者:Surpassme]Jenkins本身並不提供備份功能,而是使用插件來進行備份。這裏推薦使用插件Periodic Backup(https://plugins.jenkins.io/periodicbackup/)來實現備份。操作步驟如下所示:

  • 1.Manage Jenkins -> Periodic Backup Manager 如下所示:

  • 2.點擊Periodic Backup Manager,進行配置

    [作者:Surpassme]主要參數如下所示:

  • Backup schedule (cron)

    備份的cron表達式,在配置後,可以點擊Validate cron syntax進行校驗

  • File Management Strategy

    設備備份策略,ConfigOnly僅備份配置文件,FullBackup 全量備份,也可以在Excludes list 使用Ant風格路徑表達式,排除不希望進行備份的文件

  • Storage Strategy

    [作者:Surpassme]備份文件的保存格式。

  • Backup Location

    備份文件存放位置。需要對文件夾具有相應的讀寫權限

  • 3.備份成功後,在Restore頁面,可以看到最近的備份結果

  • 4.若需要還原,選中對應的備份文件,點擊Restore selected backup即可。

原文地址:https://www.jianshu.com/p/13d32877b2d1

本文同步在微信訂閱號上發佈,如各位小夥伴們喜歡我的文章,也可以關注我的微信訂閱號:woaitest,或掃描下面的二維碼添加關注:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章