持續集成高級篇之Jenkins資源調度

  • 2019 年 10 月 3 日
  • 筆記

系列目錄

之前的示例我們主要關注點在於功能的實現,都是在一個節點的完成了.有了多個節點後,必須涉及到資源的調度問題.本節我們講解在創建任務時與資源調度的有關選項以及一些平時沒有注意到的但在生產環境需要精細控制的選項.

我們隨便創建一個自由式風格任務,這裡主要講解General里的一些選項

Restrict where this project can be run

限制項目運行的節點,勾選後出現Label Expression選項供輸入要限制此任務運行節點的標籤,可以指定多個標籤,也可以使用一些邏輯運算符以構建更為複雜的標籤選擇.

此選項除了可以輸入標籤外,也可以輸入節點的名稱.

比如輸入的是master則限定此任務在master節點運行.

支援的運算符:

  • (表達式)用於複雜的表達式,類似程式語言中的括弧

  • !表達式,邏輯運算,例如!linux則任務運行在不包含linux標籤的機器上

  • a&&b 邏輯且

  • a||b邏輯或

  • a -> b 這裡舉個例子說明它的使用方法.比如windows->x64則限定如果節點運行在windows機器上,則必須運行在x64類型的windows機器上(即一節點同時包含windows x64兩個label),如果不是windows機器,則不必是x64系統.

  • a <-> b 這裡仍然舉例說明.比如windows<->datacenter1,如果主機是windows系統,則必須運行在datacenter1機房,如果不是windows系統,則必須不能運行在datacenter1機房.

其它示例:

  • linux-machine-42,任務運行在主機名為linux-machine-42的節點上,或者標籤為linux-machine-42的節點上

  • windows && jdk9,任務必須運行在windows主機上,並且jdk版本為9(需要注意的是這裡僅僅是邏輯上的限制,實際上我們為一個節點打上jdk9標籤,這台機器並不一定安裝了jdk9,這裡還是需要我們人為控制)

  • postgres && !vm && (linux || freebsd) 運行在有postgres資料庫的linux或者freebsd系統類型,並且不是虛擬機的節點上.

This build requires lockable resources

此構建需要鎖定的資源,鎖定的資源由我們在全局配置里使用.

  • 創建lockable resources

進入manage jenkins->system configuration,然後向下滾動找到Lockable Resources Manager,然後點擊Add lockable resource按鈕.出現輸入框,下面講解每一項的含義

  • Name lockable資源的名稱,只有定義的名稱創建項目的時候才可以使用它,比如printers定義了一個名叫作printers類型的lockable資源

  • Description 描述,可以隨便添加一些描述資訊

  • Labels 要選擇的節點,多個之間用空格分割.比如printer1 printer2 printer3

  • Reserved by 被某個對象預留,這裡可以填寫任意名稱,如果有值,則資源不可用,此選項用於對資源的維護,比如我們要對安裝了印表機的主機進行維護,則可以在這裡填寫一個值,此時任務不能使用此資源,直到值被清除.

我們返回jenkins主介面,點擊左側的Lockable Resources就可以看到有哪些lockable resource,並且可以看到資源的狀態

新建一個項目,general選項里選擇This build requires lockable resources便可以使用lockable資源,有Resourceslabels兩個選項可以選,此兩個選項是互斥的,即只能選擇一個,比如我們可以在Resources里指定printers,或者在labels里指定printer1或者printer2,具體要根據要鎖定的資源而定.如果僅僅要鎖定一個印表機,則可以用resoures,如果想要鎖定某個特定類型的資源,則可以使用lable.

我們構建完任務後,點擊構建號進入詳細構建資訊頁面,點擊左側的lockable resources則可以看到本次構建鎖定的資源.

這裡說鎖定資源,是指此構建對資源的獨佔,如果其它構建也鎖定了相同的資源,則需要排除等待.

由於jenkins里的資源都是節點資源,即沒有其它類型的資源,因此使用lockable resources能完成的工作使用label選擇也同樣能完成,使用kockable resources的好處在於對資源的管理更為方便,有些資源是有限的,如果lable過於複雜很難理清關係,而lockable resoure則有單獨的資源管理介面,方便對這些關鍵的資源進行管理.

高級選項之Quiet period

勾選後,會出現Quiet period,值默認為秒.此選項的意義為在實踐中有些用戶往往會在提交git後又馬上發現問題,緊接著進行數次提交.這樣就會觸發多個hook事件,導致多次構建,如果指定一個Quiet periodjenkins中待處理的隊列中在一個任務添加後的Quiet period範圍內再添加任務將不會被加入到隊列.保證一個相關的提交只構建一次,防止不必要的資源浪費.

高級選項之Retry Count

此選項也是對SCM的,如果一個構建使用了SCM(git,svn等),則在拉取程式碼失敗後會進行若干次重試,如果在指定的重試次數用完後仍然未能拉取,則此次構建標記為失敗.

此選項如果不勾選默認的行為是如果拉取程式碼失敗,則任務馬上標識為失敗,相當於Retry count值設置為0

高級選項之Execute concurrent builds if necessary

必要時執行並行構建.默認情況下,如果對同一任務觸發多次構建,這些任務會形成隊列,上一個完成後下一個才開始構建,如果機器資源充足的情況下可以勾選此選項,這樣jenkins就會並行調度任務(同一任務可能同時運行多個構建),我們不用擔心資源覆蓋問題,因為jenkins在構建時會自動為同一構建不同編號的任務創建不同的構建目錄.

需要注意的是,如果構建勾選了Use custom workspace並且指定了自定義構建目錄,則jenkins不會為不同的構建創建隔離的目錄,這種情況下同一任務並行構建就會出問題.

高級選項之Use custom workspace

jenkins並不只是構建項目用,還可以執行一些其它的任務,比如在特定的目錄下執行一些操作.但是jenkins會為每個任務創建一個固定的文件夾,此時如何指定Use custom workspace則會改變jenkins的默認行為,讓jenkins在特定的目錄上下文環境下執行任務.

任務組織和管理

創建view

默認情況下Jenkins里有一個All view,默認創建的任務都會顯示在這裡,隨著接入jenkins項目越來越多,這個view就會變得越來越臃腫,難以管理.這時候我們可以創建更多的view來對任任務進行邏輯上管理.創建view也很簡單,All後面一個+號就可以創建一個新的view,詳細步驟這裡就不再介紹了.創建完以後All後面就會多出一個標籤,點擊這個標籤就可以切換到這個視圖,在當前view激活的情況下,創建新的項目時,默認會勾選Add to current view把項目添加到當前視圖.

把部分已有任務添加到當前視圖

如果你新創建視圖後沒有進行任何操作,則當前視圖下有這樣一句話

This view has no jobs associated with it. You can either add some existing jobs to this view or create a new job in this view.

點擊add some existing jobs在出現的頁面里就可以從jobs里勾選想要添加進來的任務,然後點擊ok即可.

這個頁面和創建view頁面類似,創建view的介面里同樣也有添加job到view的選項,選擇即可.

如果我們已經添加了任務,則上面的鏈接就會消失了,此時我們可以在視圖激活的情況下,點擊左側的Edit view按鈕,進入和剛才一樣的介面,然後在這個頁面里選擇要添加的job.

刪除一個已有view

在當前view激活狀態下,左側有一個delete view按鈕,我們點擊它就可以刪除當前view

需要注意的是,刪除view並不刪除它裡面的任務,view刪除以后里面的任務會被移到All裡面

創建文件夾

文件夾也是用來組織任務的一種方式,我們點擊New Item下面有一個Folder類型,我們選擇它以後就可以創建一個文件夾.我們進入到裡面會發現,裡面也包含一個all類型的視圖,和外層一樣.也可以像在外層一下添加項目.點擊左側的delete folder按鈕則可以刪除當前文件夾.

把文件夾移動到其它視圖

點擊左側的move按鈕,就會出現一個下拉列表,列出了當前所有的view,選擇想要移動到的view即可.