<ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>


      系列目錄 <https://www.cnblogs.com/tylerzhou/p/11204826.html>


      有的童鞋可能已經(jīng)發(fā)現(xiàn),PipeLine項(xiàng)目與自由式項(xiàng)目相比,可配置的項(xiàng)少了很多,比如說環(huán)境變量定義,所有步驟完成后執(zhí)行動作,拉git代碼庫等.其實(shí)這些功能并沒有缺,而是配置的方式不一樣了,以前是通過圖形化界面配置,雖然直觀簡便,但是功能不能包羅萬像,對于一些復(fù)雜的項(xiàng)目顯得捉襟見肘,而Jenkins
      PipeLine使用代碼配置功能更加強(qiáng)大.以后的章節(jié)中我們會介紹常用的配置如何通過PipeLine里的Groovy腳本來實(shí)現(xiàn).

      前面講參數(shù)化構(gòu)建的時候已經(jīng)講到對于復(fù)雜的構(gòu)建把一些重復(fù)的,常用的代碼做成變量的重要性,這里講解如何通過PipeLine方式定義項(xiàng)目級別的參數(shù)以及環(huán)境變量.

      首先需要說明的是,節(jié)點(diǎn)級別和全局級別以及文件參數(shù)變量的配置在PipeLine里依然有效,讀取的方式也一樣,只是會有一些小坑,這里也會介紹

      PipeLine中可以定義變量和環(huán)境變量,下面分別介紹如何定義變量和環(huán)境變更.

      PipeLine中定義變量

      PipeLine中定義變量非常簡單,只需要使用def 變量名=變量值的形式即可

      看如下PipeLine代碼(大家自己創(chuàng)建項(xiàng)目)
      node { def hello="world" stage("echo"){ bat "echo $hello" } }
      以上腳本中我們先是定義了一個名為hello的變量,然后通過$變量名方式獲取到它,然后把它打印到控制臺.

      有些童鞋對以上代碼可能有點(diǎn)懵圈,bat執(zhí)行的字符串怎么能包含$變量名這樣的內(nèi)容呢,bat不是只能解析%變量名%類型的變量嗎.實(shí)際上是$變量名
      是groovy腳本插值語法,執(zhí)行到這行文本的時候groovy就會去嘗試解析$變量名,對于本實(shí)例,groovy會解析$hello
      ,上面已經(jīng)定義過,它的值是world,因此 groovy會把echo $hello先解析為'echo world'這樣純字符串,然后再傳給bat執(zhí)行.

      需要注意的是以上定義的變量并非環(huán)境變量,對于bat腳本,不能通過%變量名%
      的形式被解析,因?yàn)榄h(huán)境變量中不存在這樣一個環(huán)境變量名,因此bat無法解析它.當(dāng)然對于定義的節(jié)點(diǎn)級別的或者全局的變量bat腳本仍然可以通過%變量名%
      形式被解析.大家不要迷糊.

      PipeLine中定義環(huán)境變量

      上面定義變量的方式是定義了一個groovy變量,我們也說過它不能被傳入到腳本內(nèi)部被解析(比如bat 通過%變量名%
      形式解析),它必須通過groovy腳本解析成普通字符串然后傳給相應(yīng)的腳本執(zhí)行程序.實(shí)際上PipeLine中也提供了一種創(chuàng)建環(huán)境變量的方法.這里我們就介紹一下.

      我們還是通過一段demo來講解
      node { withEnv(['build=Production', 'DB_ENGINE=sqlite']) { stage('Build') {
      bat "echo $build" } } }
      以上通過WithEnv來定義環(huán)境變量,值放在中括號里,大家注意寫法是"變量名=變量值",也就是變量名和賦值都放在一個引號內(nèi)(單引號和雙引號都可以),而不是
      "變量名"="變量值"這種形式,一定要注意.

      bat命令里的解析方法是通過$變量名
      形式,我們講過,它是groovy的插件方式,通過這里我們可以看到,在PipeLine里,環(huán)境變量也被當(dāng)作了普通變量(即可以通過$變量名
      形式解析).當(dāng)然我們說了這里定義的是環(huán)境變量,環(huán)境變量是可以傳入腳本內(nèi)部被解析的,我們把bat這段代碼改為如下
      bat "echo %build%"
      控制臺仍然能夠輸出world.

      對于powershell腳本可以通過$env:變量名方式獲取.但是對于powershell腳本有一個坑必須注意,那就是Powershell獲取環(huán)境變量名使用$
      開頭,同時groovy腳本插值變量也是以$開頭,這就會導(dǎo)致Groovy會嘗試解析
      powershell的變量,這樣顯然無法獲取正確結(jié)果.如何解決這一問題呢?答案是執(zhí)行powershell腳本的時候使用powershell '要執(zhí)行的腳本'
      ,也即把雙引號改為單引號,如果雙引號改單引號,則groovy不再進(jìn)行插值計(jì)算.

      最佳實(shí)踐

      1) 前面說過,groovy除了可以獲取通過def定義的變量外,也能夠獲取環(huán)境變量,因此建議使用$變量名
      的方式獲取變量的值,這樣groovy會提交對它們進(jìn)行插值計(jì)算,這樣就彌補(bǔ)了不同腳本使用環(huán)境變量方法不一樣的問題.同也不必考慮powrshell
      引用變量會被插值計(jì)算,必須使用單引號包括腳本的問題,減少腦細(xì)胞消耗量.

      2) 通過以上我們可以看到PipeLine里即可以通過def來定義變量,也可以通過WithEnv
      來定義,實(shí)際使用中發(fā)現(xiàn)WithEnv更麻煩,所有使用到它的代碼塊都必須包含在withEnv代碼塊內(nèi),如果嵌套過深,代碼可讀性非常差.而def
      即可以聲明為全局的(這里說的全局是對整個當(dāng)前腳本有效),也可以是塊級的,并且不用花括號,可讀性也更好.

      常見任務(wù)在PipeLine中的處理

      保證某一步驟最終一定執(zhí)行


      我們知道PipeLine里可以書寫Groovy腳本,腳本如果出錯則代碼將不會再繼續(xù)往下走,我們?nèi)绾伪WC不論如何最終都會執(zhí)行某一步動作呢,比如說釋放非托管資源,腳本出錯時發(fā)出郵件通知等,這里其實(shí)處理辦法非常簡單,那就是使用groovy的try
      finally語法,把最終要執(zhí)行的代碼寫在finally里,這對程序員來說應(yīng)該非常容易理解.

      Script代碼塊

      我們前面已經(jīng)說過,可以在jenkins
      PipeLine里直接執(zhí)行g(shù)roovy腳本,如果僅僅是定義一個變量這樣簡單的動作無所謂,如果有大量的代碼和業(yè)務(wù)邏輯摻雜在一塊,則勢必影響代碼可讀性.此時可以使用script代碼塊把要執(zhí)行的大段groovy腳本包在里面

      如下圖示
      node { def hello="world" stage("echo"){ script{ for(i=0;i<=3;i++){ println(i)
      } } bat "echo $version" } }
      以上我們把循環(huán)語句放在代碼塊里,println可以把內(nèi)容打印到Jenkins控制臺.

      邏輯分支

      這里僅僅是列出來希望引起大家的注意,在腳本式PipeLine里邏輯分支非常簡單,只需要使用if分支語句即可,熟悉groovy腳本的童鞋可以盡情發(fā)揮所掌握知識

      并行任務(wù)


      在PipeLine里可以執(zhí)行并行任務(wù),充分利用并行任務(wù)在特定場景下將極大節(jié)約構(gòu)建時間,提升構(gòu)建效率.比如說我們的項(xiàng)目是一個模塊非常多的項(xiàng)目,每個模塊存在不同的倉庫里,則我們在拉取項(xiàng)目進(jìn)行編譯的時候可以并行拉取這個庫,把這些并行任務(wù)放在一個步驟里,完成后再執(zhí)行下一步編譯工作.

      請看下面示例代碼
      node{ stage("poll source"){ parallel( a: { echo "This is branch a" }, b: {
      echo "This is branch b" } ) } stage("build"){ echo "build successfully" } }
      以上代碼在poll source步驟里,我們通過parallel并行執(zhí)行了a和b兩個任務(wù).這樣將極大節(jié)約代碼拉取時間.

      我們保存項(xiàng)目后點(diǎn)擊構(gòu)建,構(gòu)建完成后打開BlueOcean視圖,點(diǎn)擊進(jìn)入本次構(gòu)建,就會看到如下圖



      可以從圖形界面形象地看到poll source步驟分為a和b兩個并行的任務(wù).然后它們匯集到下一步.

      使用并行任務(wù)時一定要梳理好構(gòu)建的邏輯,否則將會出現(xiàn)意想不到的結(jié)果.如果以上a b 和build
      并行執(zhí)行,則將會導(dǎo)致構(gòu)建失敗,因?yàn)闃?gòu)建依賴于以上兩個步驟都執(zhí)行完成.

      友情鏈接
      ioDraw流程圖
      API參考文檔
      OK工具箱
      云服務(wù)器優(yōu)惠
      阿里云優(yōu)惠券
      騰訊云優(yōu)惠券
      京東云優(yōu)惠券
      站點(diǎn)信息
      問題反饋
      郵箱:[email protected]
      QQ群:637538335
      關(guān)注微信

        <ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>
          欧美二区三区 | 日日夜夜精品免费视频 | 家庭乱伦网站 | 日欧美韩国产三 | 岛国av在线| 男生下面伸进女人下面的视频 | 大肉大捧一进一出两腿 | 肉大捧一出免费视频 | 一道本一区二区视频 | 草逼草 |