持續整合高階篇之Jenkins資源排程
系列目錄
之前的示例我們主要關注點在於功能的實現,都是在一個節點的完成了.有了多個節點後,必須涉及到資源的排程問題.本節我們講解在建立任務時與資源排程的有關選項以及一些平時沒有注意到的但在生產環境需要精細控制的選項.
我們隨便建立一個自由式風格任務,這裡主要講解General裡的一些選項
Restrict where this project can be run
限制專案執行的節點,勾選後出現Label Expression
選項供輸入要限制此任務執行節點的標籤,可以指定多個標籤,也可以使用一些邏輯運算子以構建更為複雜的標籤選擇.
此選項除了可以輸入標籤外,也可以輸入節點的名稱.
比如輸入的是master
支援的運算子:
(表示式)用於複雜的表示式,類似程式語言中的括號
!表示式,邏輯運算,例如!linux則任務執行在不包含linux標籤的機器上
a&&b 邏輯且
a||b邏輯或
a -> b 這裡舉個例子說明它的使用方法.比如
windows->x64
則限定如果節點執行在windows機器上,則必須執行在x64
型別的windows機器上(即一節點同時包含windows x64兩個label),如果不是windows機器,則不必是x64系統.a <-> b 這裡仍然舉例說明.比如
windows<->datacenter1
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資源,有Resources
和labels
兩個選項可以選,此兩個選項是互斥的,即只能選擇一個,比如我們可以在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 period
jenkins中待處理的佇列中在一個任務新增後的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即