<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      「持續(xù)集成實踐系列 」Jenkins 2.x 構建CI自動化流水線常見技巧

      在上一篇文章中,我們介紹了Jenkins 2.x實現(xiàn)流水線的兩種語法,以及在實際工作中該如何選擇腳本式語法或聲明式語法。原文可查閱:「持續(xù)集成實踐系列」Jenkins 2.x 搭建CI需要掌握的硬核要點(一)

      在使用傳統(tǒng)的Jenkins Web界面和項目時,比如自由風格類型的任務,我們對處理流程的控制能力是有限的。所采用的典型形式是任務鏈:任務完成后觸發(fā)其他的任務?;蛘呶覀兛赡軙嫿ê筇幚?,不管任務成功完成與否,總是去做一些類似發(fā)送通知的事情。

      除了這些基本的功能外,還可以添加條件性構建步驟插件,通過基于單個或者多個條件的構建步驟來定義更加復雜的流程。但即便如此,相比于我們編寫程序時可以直接控制執(zhí)行流程的方法,條件性構建步驟插件對流程的控制能力依然有限。

      在本篇中,我們將聊一下,關于Jenkins流水線DSL語言所提供的用于控制流水線執(zhí)行流程基本結(jié)構和一些常見技巧。

      1. Pipeline流水線指令常見結(jié)構

      正如在系列第一篇文章中介紹到的,Jenkins DSL采用的是Groovy腳本語言。這也意味著如果當你掌握了Groovy語言,可以按照需求在流水線中使用Groovy語言的結(jié)構和習慣用法,針對這一類使用者,通常會更傾向于用腳本式語法來實現(xiàn)流水線。但不管采用的是哪種語法,從流水線組成的角度來講,都是由一些不同指令+步驟構建結(jié)構化代碼塊。

      對于腳本式流水線,基本結(jié)構如下:

      node('worker'){
          stage('階段'){
              // DSL
          }
      }

      構建腳本式流水線常用的結(jié)構或者說代碼塊節(jié)點主要由nodestage兩個組成。

      而,聲明式流水線基本結(jié)構構成環(huán)節(jié)相對要多一些,整理了一張圖如下:

      需要劃一個重點:可以簡單理解node是用于腳本式流水線,而agent則是用于聲明式流水線。

      Jenkins Pipeline支持的指令(常見):

      指令名 說明 作用域
      agent 指定流水線或特定階段在哪里運行。 stage 或pipeline
      environment 設置環(huán)境變量 stage或pipeline
      tools 自動下載并安裝指定的工具,并將其加入到PATH變量中 stage或pipeline
      input 暫停pipeline,提示輸入內(nèi)容 stage
      options 用來指定一些預定義選項 stage 或 pipeline
      parallel 并行執(zhí)行多個step stage
      parameters 允許執(zhí)行pipeline前傳入一些參數(shù) pipeline
      triggers 定義執(zhí)行pipeline的觸發(fā)器 pipeline
      when 定義階段執(zhí)行的條件 stage
      build 觸發(fā)其他的job steps

      options Jenkins Pipeline常見配置參數(shù):

      參數(shù)名 說明 例子
      buildDiscarder 保留最近歷史構建記錄的數(shù)量 buildDiscarder(logRotator(numToKeepStr: '10')
      timestamps 添加時間戳到控制臺輸出 timestamps()
      disableConcurrentBuilds 阻止Jenkins并發(fā)執(zhí)行同一個流水線 disableConcurrentBuilds()
      retry pipeline發(fā)生失敗后重試次數(shù) retry(4)
      timeout pipeline運行超時時間 timeout(time:1, unit: 'HOURS')

      示例:

      pipeline{
          agent any
          options{
              buildDiscarder(logRotator(numToKeepStr: '10')
              timestamps()
              retry(3)
              timeout(time:1, unit: 'HOURS')
          }
          stages{
              stage('demo'){
                  steps{
                      sh 'echo hello'
                  }
              }
          }
      }

      更多pipeline指令,可參見官方介紹:

      https://www.jenkins.io/doc/book/pipeline/syntax/#

      下述僅挑幾個常用的,用于流水線流程控制選項的指令項,介紹一些常用技巧。

      2. 超時(Timeout)

      這個timeout步驟允許限制等待某個行為發(fā)生時腳本所花費的時間。其語法相當簡單。示例如下:

      timeout(time:60,unit:'SECONDS'){
          //該代碼塊中的過程被設置為超時
      }

      默認的時間單位是min。如果發(fā)生超時,該步驟就會拋出一個異常。如果異常沒有被處理,將導致整個流水線過程被中止。

      通常推薦的做法是,在使用timeout對任何造成流水線暫停的步驟(如一個input步驟)進行封裝,這樣做的結(jié)果是,即使出現(xiàn)差錯導致在限定的時間內(nèi)沒有得到期望的輸入,流水線也會繼續(xù)執(zhí)行。

      示例如下:

      node{
          def response
          stage('input'){
              timeout(time:10,unit:'SECONDS'){
                  response = input message :'Please Input User'
                  parameters:[string(defaultValue:'mikezhou',description:'Enter UserId:',name:'userid')]
              }
              echo "Username = " + response
          }
      }

      在這種情況下,Jenkins將會給用戶10s做出反應,如果時間到了,Jenkins會拋出一個異常來中止流水線。

      如果實際在設計流水線時,當超時發(fā)生時,并不想中止流水線向下執(zhí)行,可以引入try...catch代碼塊來封裝timeout。

      如下代碼塊所示:

      node{
          def response
          stage('input')
      {
            try {
              timeout(time:10,unit:'SECONDS'){
                  response = input message :'Please Input User'
                  parameters:[string(defaultValue:'mikezhou',description:'Enter UserId:',name:'userid')]
               }
             }
             catch(err){
                  response = 'user1'
            }
          }
      }

      需要注意的是,在處理異常的時候,可以在捕獲異常處設置為期望的默認值。

      3. 重試(retry)

      這個retry閉包將代碼封底裝為一個步驟,當代碼中有異常發(fā)生時,該步驟可以重試n次。其語法如下:

      retry(n){
        //代碼過程
      }

      如果達到重試的限制并且發(fā)生了一個異常,那么整個過程將會被中止(除非異常被處理,如使用try...catch代碼塊)

      retry(2){
          try {
             def result=build job: "test_job"
             echo result
            }
          catch(err){
              if(!err.getMessage().contains("UNSTABLE"))
              throw err
          }
      }

      4. 等待直到(waitUntil)

      引入waitUntil步驟,會導致整個過程一直等待某件事發(fā)生,通常這里的“某件事”指的是可以返回true的閉包。

      如果代碼過程永不返回true的話,這個步驟將會無期限地等待下去而不會結(jié)束。所以一般常見的做法,會結(jié)合timeout步驟來封裝waitUntil步驟。

      例如,使用waitUntil代碼塊來等待一個標記文件出現(xiàn):

      timeout(time:15,unit:'SECONDS'){
          waitUntil{
              def ret = sh returnStatus:true,script:'test -e /home/jenkins2/marker.txt'
              return (ret==0)
          }
      }

      再舉一個例子,假如我們要等待一個Docker容器運行起來,以便我們可以在流水線中通過REST API調(diào)用獲取一些數(shù)據(jù)。在這種情況下,如果這個URL還不可用,就會得到一個異常。為了保證異常被拋出的時候進程不會立即退出,我們可以使用try...catch代碼塊來捕獲異常并且返回false。

      timeout(time:150,unit:'SECONDS'){
          waitUntil{
              try{
                  sh "docker exec ${containerid} curl --silent http://127.0.0.1:8080/api/v1/registry >/test/output/url.txt"
                  return true
              }
              catch(err)
                  return false
          }
      }

      5.Stash暫存:實現(xiàn)跨節(jié)點文件共享

      在Jenkins的DSL中,stashunstash函數(shù)允許在流水線的節(jié)點間和階段間保存或獲取文件。

      基本用法格式:

      stash name:"<name>" [includes:"<pattern>" excludes:"<pattern>"]
      unstash "<name>"

      我們通過名稱或模式來指定一個被包括或被排除的文件的集合。給這些文件的暫存處命名,以便后面通過這個名稱使用這些文件。

      提到stash,很多讀者可能會把Jenkins stashGit stash功能弄混,需要說明一下,Jenkins stashGit stash功能是不同的。Git stash函數(shù)是為了暫存一個工作目錄的內(nèi)容,緩存那些還沒有提交到本地代碼倉庫的代碼。而Jenkins stash函數(shù)是為了暫存文件,以便在節(jié)點間共享。

      例如,master節(jié)點和node節(jié)點,實現(xiàn)跨主機共享文件:

      pipeline{
          agent none
          stages{
              stage('stash'){
                  agent { label "master" }
                  steps{
                      writeFile file: "test.txt", text: "$BUILD_NUMBER"
                      stash name: "test", includes: "test.txt"
                  }
              }
              stage('unstash'){
                  agent { label "node" }
                  steps{
                      script{
                          unstash("test")
                          def content = readFile("test.txt")
                          echo "${content}"
                      }
                  }
              }
          }
      }

      如果你覺得文章還不錯,請大家點贊分享下。你的肯定是我最大的鼓勵和支持。

      posted @ 2020-06-05 09:50  狂師  閱讀(1142)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 青青草一区二区免费精品| 国产麻豆精品一区二区三区v视界| 亚洲午夜久久久影院伊人| 国产精品自在自线视频| 久久综合给合久久狠狠狠88| 欧美乱码精品一区二区三区| 久久夜色撩人国产综合av| 一本精品99久久精品77| 亚洲日本欧洲二区精品| 成人啪啪高潮不断观看| 天堂网国产| 久久人妻无码一区二区三区av| 亚洲国产精品无码观看久久| 国产高清一区二区三区视频| 一区二区中文字幕av| 99RE8这里有精品热视频| 亚洲av与日韩av在线| 久久这里只有精品免费首页| 欧美videos粗暴| 野花社区www高清视频| 国产精品十八禁一区二区| 青青草无码免费一二三区| 国产99视频精品免视看9| 伊伊人成亚洲综合人网香| 国产精品无码久久久久AV| 国产精品国产自产拍在线| 97成人碰碰久久人人超级碰oo| 福利一区二区1000| 欧美z0zo人禽交另类视频| 国产一区二区三区韩国| 亚洲免费人成视频观看| 亚洲精品无码高潮喷水在线| 色综合久久综合香蕉色老大 | 久久精品国产亚洲av久| 亚洲成A人片在线观看无码不卡 | 97亚洲熟妇自偷自拍另类图片| 亚洲精品色国语对白在线| 亚洲欧美日韩成人综合一区| 国产成人高清亚洲综合| 99久久国产一区二区三区| 精品国产AV无码一区二区三区|