jenkins學習之pipeline

一、背景

1.想法

jenkins1.x主要是實現的持續集成過程,集成各個插件,但是終究需要人爲手工的操作,如果job太複雜,人爲容易出錯。於是jenkins2.x開始流行pipeline的寫法,以代碼的方式來進行job的構建。正如社會潮流總是從人工到自動化的過程,在之前那篇文章中提及,要做一個devops的小工具,從java代碼實現上來說,對於我還是比較複雜,代碼實現部分還在鑽研中。本篇文章只是講講jenkins中pipeline怎麼寫!


二、pipeline基本語法介紹

學習一種編程語言(groovy)最開始的步驟總是學習它的語法,知曉它的規則。但是對於pipeline來說,暫時還不需要深入去學習groovy,下面簡單的爲大家介紹下pipeline的一些主要的基本知識:

agent:該部分指定整個Pipeline或特定階段將在Jenkins環境中執行的位置,具體取決於該agent 部分的放置位置。該部分必須在pipeline塊內的頂層定義 ,也可以使用在stage級。

stage:表示這個Pipeline的某一個執行階段(使用stage使得邏輯變得更加簡單明瞭)

steps: 包含一個或者多個在stage塊中執行的step序列(在這裏執行操作:運行maven或者部署等等)

environment:指定鍵值對,可用於step中,主要是爲常量或者變量賦值,根據所在的位置來決定其作用範圍(類似於java中全局和局部的概念)

options:允許執行pipeline內置的專用選項,也可以使用由插件提供的

parameters:提供觸發pipeline時的參數列表

trigger:定義了觸發pipeline的方式(jenkins1.x中的pollscm定時構建)

tools:自動安裝工具,注意這裏使用的一定是在jenkins全局配置中已經定義好了的

when:可以用來執行一些代碼邏輯

post:可以根據pipeline的狀態來執行一些操作

以上是屬於個人理解,具體以官方文檔爲準。下面再來詳細說說裏面比較重要的agent,其他的部分請大家自行google或者百度,相對來說比較簡單。我的理解是:agent是一個機器總代理,它其中的參數都是爲了指定一些可以使用的機器

agent的一些參數如下:

any : 在任何可用的機器上執行pipeline

none : 當在pipeline頂層使用none時,每個stage需要指定相應的agent,比方說:

pipeline{
    agent none   //沒有指定agent
    stages{
        stage('checkout code'){
            steps{
                sh 'echo "checkout code"'
            }
        }
    }
}

以上代碼會報下面這串錯誤,原因就是沒有指定agent應用的節點:

label:在指定的機器上運行pipeline或者stage,比方說

agent{ label 'slave1'}  //指定slave1的節點機器運行該stage或者pipeline

這個設置的作用:在大規模集羣中,CI機器往往是相同的配置,而此時你的項目又需要一些額外的配置,這個時候這個設置可以很好的完成這個功能

docker:定義這個參數後,指定pipeline或stage時會動態的接收一個指定節點的docker的鏡像,並且還可以接受一個args的參數用於執行docker run 的參數。比方說你的項目要在A環境中做測試,在B環境中做預發驗證,在C環境做灰度發佈(這裏只是簡單的打個比方,實際中不是這樣的,只是爲了說明此時需要在不同的環境中做不同的事情),這個時候涉及到多個環境,常規做法可以是直接指定幾個不同的slave的從節點,但是如果我此時想做測試並且只有一臺機器,那我可以在這臺機器上做幾個docker鏡像,分別用於不同的構建過程.比方說:

agent{
    docker{
        image 'mydocker'  //指定docker的鏡像名稱
        label 'slave1'    //指定在哪個機器上執行docker鏡像
        args  '-v /tmp:/tmp' //運行時傳入docker run的參數
    }
}

以上命令是在slave1的從節點機器上用mydocker的鏡像生成一個容器,並傳入-v /tmp:/tmp的參數

以上是我想分享給大家的基本知識,可能其中理解不對,也請大牛出來指正.

這個網站也推薦給大家:Jenkins持續集成 - 管道詳解,如若作者認爲我放在這裏不合適,請聯繫我刪除.同時也推薦大家瀏覽一下官方文檔。


三、pipeline實際應用(小實例)

實例1.用pipeline實現:從代碼庫中拉取最新的代碼,然後做pmd檢測,如果此次構建成功的話輸出“hello!success!”;如果失敗的話輸出“failed!Please check pipeline code!”併發送郵件到指定的地址上。按照以下流程做測試:

a.本地構建一個maven項目並上傳到github上(最近github賊慢,之後考慮在自己服務器上搭建gerrit作爲代碼存放地址來演示)

***注意項目上傳時一些不需要的文件及時使用.gitignore給忽略掉,要在git add 之前寫好.gitignore文件,避免文件被track後忽略不了***

以上表示文件上傳成功.

b.寫好pipeline並運行,最後覈查結果

***部分腳本可以使用jenkins中的Pipeline Syntax來生成,比如拉取代碼的***

下面開始演示失敗時候的場景,此時沒配置mvn的環境,但是執行mvn命令,按照預計中的報錯了:

下面開始演示正確的構建結果並附pipeline的代碼:

pipeline{
    agent any
    tools{
        maven 'maven3' //maven3必須是已經在jenkins上配置的工具
    }
    stages{
        stage('checkout code'){
            steps{
                git credentialsId: '2c7a38c6-f536-4e93-bf3c-2ff4563fae8e', url: 'https://github.com/XXX/pipeline_script_test.git'
            }
        }
        stage('mvn test'){
            steps{
                sh "mvn -B -f ${env.workspace}/pom.xml pmd:pmd"
            }
        }
    }
    post{
        always{   //always表示不管怎麼樣都做下面的操作
            pmd canComputeNew: false, defaultEncoding: '', healthy: '', pattern: '', unHealthy: ''
        }
        failure{ 
            step([
                $class: 'Mailer',
                notifyEveryUnstableBuild: true,
                recipients: "[email protected]",
                sendToIndividuals: true
            ])
            echo "failed!Please check pipeline code!"
        }
        success{
            echo "hello!success!"}
    }
}

構建結果如下:

實例2:

 


以上就是一些關於jenkins的pipeline的簡單介紹,關於實例,之後會陸續更新上來。

如果對文章有疑問或者哪裏不懂的請聯繫我,在力所能及的範圍內幫助解答;如果文章有錯誤,也歡迎指出。

知乎地址:https://zhuanlan.zhihu.com/p/41604558

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