之前的示例我們主要關注點在於功能的實現,都是在一個節點的完成了.有了多個節點后,必須涉及到資源的調度問題.本節我們講解在創建任務時與資源調度的有關選項以及一些平時沒有注意到的但在生產環境需要精細控制的選項.
我們隨便創建一個自由式風格任務,這里主要講解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資源,有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即可.