Jenkins實(shí)踐指南-10-Jenkins 插件

6. Jenkin 插件

? ? Jenkins之所以這么流行,不僅在于本身功能非常齊全,也在于本身插件非常豐富,以下主要介紹平時(shí)經(jīng)常使用的到插件。

6.1 插件安裝

? ? 依次點(diǎn)擊Manage Jenkins -> Manage Plugins -> Available,搜索插件并安裝即可,示意圖如下所示:

0601 安裝插件.png

6.2 常用插件

6.2.1 Git Parameter

? ? 該插件允許在構(gòu)建時(shí),選擇指定的git分支、標(biāo)簽等,官網(wǎng)地址 :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: "請(qǐng)選擇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}"
                       ]]
                   ]
               )
           }
        }
    }
}

? ? 其主要參數(shù)解釋如下所示:

  • type:主要支持PT_TAG、PT_BRANCH、PT_BRANCH_TAGPT_REVISION、PT_PULL_REQUEST
  • sortMode:主要支持NONEASCENDING_SMART、DESCENDING_SMART、ASCENDINGDESCENDING
  • useRepository: 默認(rèn)使用的gitlab倉(cāng)庫(kù)地址

6.2.2 build user vars

? ? 通過(guò)設(shè)置環(huán)境變量來(lái)獲取啟動(dòng)任務(wù)的用戶(hù)名,官網(wǎng)地址:https://plugins.jenkins.io/build-user-vars-plugin/,一般常用于多用戶(hù)下的Jenkins環(huán)境。主要支持的環(huán)境變量如下所示:

變量名稱(chēng) 描述信息
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

? ? 示例用法如下所示:

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

? ? 該插件功能非常多,可以用來(lái)比較版本大小、查找文件、讀取CSV、JSON、YAML等,其官網(wǎng)地址:https://plugins.jenkins.io/pipeline-utility-steps/,我們以讀寫(xiě)YAML為示例,如下所示:

def readYamlFile(filePath,imageName){
    if (fileExists(filePath)){
       println("Yaml file path is ${filePath}")
       def data=readYaml(file:filePath)
       println("YAML文件內(nèi)容:\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

? ? 主要用于發(fā)送HTTP請(qǐng)求,比如向企業(yè)微信機(jī)器人發(fā)送消息等,官網(wǎng)地址:https://plugins.jenkins.io/http_request/,HTTP Request支持的參數(shù)如下所示:

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

? ? 示例代碼如下所示:

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是一個(gè)輕量級(jí)別的多語(yǔ)言測(cè)試報(bào)告插件,常用于在自動(dòng)化測(cè)試中以WEB形式展示測(cè)試報(bào)告,官網(wǎng)地址: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}" ]]
       ])
    }
  }
}

? ? 使用注意事項(xiàng)如下所示:

  • report:生成allure最終報(bào)告的存儲(chǔ)路徑,其中默認(rèn)生成的路徑為相對(duì)于$WORKSPACE的路徑
  • results:生成allure的中間數(shù)據(jù),即生成的原始報(bào)告數(shù)據(jù),支持多個(gè)路徑中間數(shù)據(jù),其中默認(rèn)生成的路徑為相對(duì)于$WORKSPACE的路徑

6.2.6 Active Choices

? ? Active Choices 插件常用于創(chuàng)建動(dòng)態(tài)交互式參數(shù)化插件。其官網(wǎng)地址:https://plugins.jenkins.io/uno-choice/,其主要支持的參數(shù)類(lèi)型有:

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

? ? Active Choices parameters 允許用戶(hù)為任務(wù)參數(shù)選擇值,參數(shù)值如下所示:

  • dynamically generated:動(dòng)態(tài)生成(使用Groovy)
  • dynamically updated based on other UI parameters:基于其他UI參數(shù)進(jìn)行更新
  • multi-valued:多個(gè)值
  • rendered with a variety of UI controls, including dynamic HTML:使用多種UI控件渲染,包含動(dòng)態(tài)HTML

6.2.6.1 Active Choices Parameter

  • 1.Behavior

? ? Active Choices parameter 使用Groovy腳本動(dòng)態(tài)生成參數(shù)列表

  • 2.Rendering

? ? Active Choices parameters 可以生成標(biāo)準(zhǔn)列表選擇、復(fù)選框和單選框
? ? 可以生成文本框篩選器來(lái)篩選選項(xiàng)

0605 Active Choices Parameter 生成參數(shù)類(lèi)型示意圖.jpg

圖片來(lái)自于: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

? ? 與Active Choices Parameter類(lèi)似,可以使用Groovy腳本為構(gòu)建任務(wù)動(dòng)態(tài)生成參數(shù)選項(xiàng),當(dāng)UI控件值發(fā)生變更時(shí),也可以動(dòng)態(tài)級(jí)聯(lián)更新。

  • 2.Rendering Options

? ? Active Choices Reactive:可以生成標(biāo)準(zhǔn)列表選擇、復(fù)選框、單選框和文本框篩選器來(lái)篩選選項(xiàng)
? ? Active Choices Reactive Reference:可以生成HTML列表、HTML輸入框、動(dòng)態(tài)生成HTML等

0606 Active Choices Reactive and Reactive Reference Parameters 生成參數(shù)類(lèi)型示意圖.jpg

圖片來(lái)自于:https://cdn.jsdelivr.net/gh/jenkinsci/active-choices-plugin@master/docs/images/002.gif

6.2.6.3 Behavior and Rendering Summary

? ? 以下為三種Active Choices parameter的行為和呈現(xiàn)特征對(duì)比

0607 Behavior and Rendering Summary summary.jpg

圖片來(lái)自于: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 示例

? ? 以下為在自由風(fēng)格中的配置,示例如下所示:

0608 Active Choices Parameter 示例演示.png

? ? 主要參數(shù)解釋如下所示:

  • Name 和 Describe

? ? 與常規(guī)Jenkins 參數(shù)一致,用于一個(gè)參數(shù)的名稱(chēng)和描述信息

  • Script

? ? 動(dòng)態(tài)生成參數(shù)所使用的腳本代碼,腳本返回必須為java.util.List、java、java.util.Map

  • Fallback Script

? ? 主要提供備用選項(xiàng),在腳本出錯(cuò)時(shí),使用該值

  • Choice Type

? ? 主要提供四種不同的類(lèi)型選擇單選框、復(fù)選框、列表單選列表多選

  • Enable Filte

? ? 是否啟用篩選搜索

6.2.6.4.2 Active Choices Parameter Rendering示例
  • 示例-1
0609 Active Choices Parameter Rendering-01.png
  • 示例-2
0610 Active Choices Parameter Rendering-02.png

6.2.6.5 pipeline 示例

? ? 通過(guò)自由風(fēng)格來(lái)配置Active Choice非常方便,但遷移起來(lái)也非常麻煩的,pipeline示例如下所示:

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

pipeline{
    agent any
    options{
        timestamps()
    }

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

? ? 運(yùn)行結(jié)果如下所示:

0611 activeChoice pipeline 示例.png

注意事項(xiàng):sandbox需要配置為true,因Jenkins安全策略限制,若為false,可能配置選項(xiàng)無(wú)法顯示

? ? 常見(jiàn)的Choice Type 如下所示:

  • PT_SINGLE_SELECT:下拉單選
  • PT_MULTI_SELECT:列表多選
  • PT_CHECKBOX:篩選框
  • PT_RADIO:?jiǎn)芜x框

? ? 源碼定義如下所示:

/*
* 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 郵件通知

? ? 郵件也是日常Jenkins常用的通知方式,Jenkins默認(rèn)支持

6.2.7.1 使用Jenkins內(nèi)置郵件通知功能

? ? 以QQ郵箱演示,操作步驟如下所示:

在配置郵箱時(shí),需要確認(rèn)所使用的郵箱已經(jīng)打開(kāi)SMTP服務(wù)

    1. 設(shè)置管理員郵箱,如下所示:
0612 設(shè)置Jenkins管理員郵箱.png
  • 2、配置SMTP服務(wù)器信息
0613 測(cè)試郵箱配置.png
  • 3、在pipeline中Post部分加入發(fā)送郵件配置
pipeline{
    agent any
    options{
        timestamps()
    }

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

    post{
        success{
            mail(
                from: "surpassme@qq.com",
                to:   "surpassme@qq.com",
                body: "This is test Jenkins send e-mail,please don't reply",
                subject: "Test e-mail demo"
                )
        }
    }
}

? ? 主要參數(shù)解釋如下所示:

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

6.2.7.2 使用E-mail Extension 插件通知

? ? 如果覺(jué)得Jenkins內(nèi)置的郵件功能不能滿(mǎn)足要求,也可以試試插件E-mail Extension,其官網(wǎng)為:https://plugins.jenkins.io/email-ext/,其主要特色功能:

  • 可以定制收件人列表
  • 可以將日志以附件形式進(jìn)行發(fā)送
  • 可以發(fā)送附件

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

  • 1、配置SMTP服務(wù)器信息,如下所示:
0614 配置E-mail Extension SMTP 信息.png
  • 2、在pipeline中Post部分加入發(fā)送郵件配置
pipeline{
    agent any
    options{
        timestamps()
    }

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

    post{
        success{
            emailext (
                to:   "surpassme@qq.com",
                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()],
                )
        }
    }
}

? ? 運(yùn)行結(jié)果如下所示:

0615 運(yùn)行結(jié)果.png

? ? emailext的主要參數(shù)解釋如下所示:

  • from:可選,為string類(lèi)型,發(fā)件人地址
  • to:可選,為string類(lèi)型,收件人地址
  • subject:為string類(lèi)型,郵件主題
  • body:為string類(lèi)型,郵件正文
  • compressLog:為boolean類(lèi)型,是否壓縮日志
  • attachLog:可選,為boolean類(lèi)型,是否將構(gòu)建日志以附件形式發(fā)送
  • attachmentsPattern:可選,為string類(lèi)型,需要發(fā)送的附件的路徑,支持ANT風(fēng)格路徑表達(dá)式
  • recipientProviders:可選,List類(lèi)型,收件人列表類(lèi)型

? ? 常用的收件人列表類(lèi)型如下所示

類(lèi)型名稱(chēng) 功能解釋
developers 此次構(gòu)建所涉及變更的所有提交者列表
requestor 啟動(dòng)構(gòu)建任務(wù)的人
culprits 引發(fā)構(gòu)建失敗的,即最后一次構(gòu)建成功和最后一次構(gòu)建失敗之間的變更提交者列表

6.2.8 Periodic Backup

? ? Jenkins本身并不提供備份功能,而是使用插件來(lái)進(jìn)行備份。這里推薦使用插件Periodic Backup(https://plugins.jenkins.io/periodicbackup/)來(lái)實(shí)現(xiàn)備份。操作步驟如下所示:

  • 1.Manage Jenkins -> Periodic Backup Manager 如下所示:
0602 Periodic Backup 備份插件.png
  • 2.點(diǎn)擊Periodic Backup Manager,進(jìn)行配置
0603 Periodic Backup 備份配置.png

? ? 主要參數(shù)如下所示:

  • Backup schedule (cron)

? ? 備份的cron表達(dá)式,在配置后,可以點(diǎn)擊Validate cron syntax進(jìn)行校驗(yàn)

  • File Management Strategy

? ? 設(shè)備備份策略,ConfigOnly僅備份配置文件,FullBackup 全量備份,也可以在Excludes list 使用Ant風(fēng)格路徑表達(dá)式,排除不希望進(jìn)行備份的文件

  • Storage Strategy

? ? 備份文件的保存格式。

  • Backup Location

? ? 備份文件存放位置。需要對(duì)文件夾具有相應(yīng)的讀寫(xiě)權(quán)限

  • 3.備份成功后,在Restore頁(yè)面,可以看到最近的備份結(jié)果
0604 查看備份結(jié)果.png
  • 4.若需要還原,選中對(duì)應(yīng)的備份文件,點(diǎn)擊Restore selected backup即可。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容