當我們使用 Jenkins 構建的項目達到一定規模后,一個 Jenkins 服務可能承受不了負載,會導致很多的構建任務堆積,嚴重的話還會拖垮這台服務器,導致上面的服務無法使用。例如我們公司目前在 Jenkins 上要構建的項目多達百個,開發環境需要構建部署,測試環境需要構建部署,甚至正式環境也是,開發環境的部署構建頻率是最高的,我們目前的做法是每一個代碼的提交都會觸發構建操作,單個 Jenkins 已經滿足不了頻繁的構建的要求了,這時候就需要增加我們 Jenkins 的構建節點,由主節點自己進行調度,將構建任務分配到不同的節點。
這里可能有人會問,我們的項目有必要這么頻繁的構建部署嗎?答案是肯定的,在持續交付里面有一個理念就是快速的交付可用的產品,要想快速的交付,肯定就免不了需要頻繁的構建。一個研發團隊能做到短平快的交付才是正常的,是研發效能高的表現。試想一下,現在還有哪個互聯網研發團隊,一年半載才交付一次產品呢。
配置 Jenkins 的節點也比較簡單,准備好要作為 Jenkins 構建節點的服務器,同時要確保服務器上有 git 和構建項目需要的各個工具。例如 Java 棧,就需要確保節點機器上有 JDK、Maven 和 Gradle 等。構建需要的工具可以不用到節點機器上去單獨安裝,我們可以在 Jenkins 主節點上配置需要的構建工具。
例如我這里在 Jenkins 主節點上,【全局工具配置】里面增加了一個 JDK 工具:
然后去到 Jenkins 的【系統管理】下面的【節點管理】里面,進行【新建節點】:
全部設置如下圖:
需要注意的是設置一個工作目錄,我這里是 /home/jenkins/jenkins_node_work_dir
,否則 Jenkins 節點上的一些文件就會在用戶的 home 目錄。【用法】這里選擇【只允許運行綁定到這台機器的Job】,如果各個項目的構建方式相同,你可以選擇【盡可能的使用該節點】,兩者的區別在於機器的環境差異,如果我要構建一個 nodejs 項目,但是只有 A 節點才有 nodejs 環境,那么就要將 nodejs 項目的構建任務綁定到 A 節點,否則其他機器沒有 nodejs 環境是沒法構建項目的,同理如果項目必須要在 Mac 系統上構建,那么節點也必須是 Mac 系統才行,推薦的設置是將其設置為【盡可能的使用該節點】,如果某些構建任務需要用到特定的構建節點,在該各自的任務上設置即可。這樣的好處是既可以讓 Jenkins 根據各個節點的負載情況自行調度使用閑置機器來構建各個節點都能構建的任務,又可以讓特定任務綁定在特定的節點上構建。
節點添加好后我們來驗證下看看能否正常使用。去到我們之前創建的 jenkins-freestyle-test-task
任務進行如下下設置,如果沒有新建一個自由風格的任務:
然后我們連續多次點擊【立即構建】就會出現如下效果,該任務在並行構建,並且是多個節點在並行構建:
如果你想讓任務綁定到特定的節點上運行,可以在任務的設置里面配置【限制項目的運行節點】,如果有多個節點可以運行該任務可以用或符號連接,例如我這里是 jenkins-node-192.168.31.200 || master
,表示這個任務可以在這兩個節點上運行,至於具體怎么調度,Jenkins 自己會做選擇,我們不用操心。
到此我們 Jenkins 節點的配置就完成了,如果你有多的閑置機器可以按照介紹的方式都添加上來,提高 Jenkins 的構建能力,多一台機器那么構建能力理論上就增加一倍。
隨便我們也看看節點機器上的工作目錄有什么變化:
剛添加好節點,會產生這些文件。
[jenkins@asus-centos jenkins_node_work_dir]$ pwd
/home/jenkins/jenkins_node_work_dir
[jenkins@asus-centos jenkins_node_work_dir]$ ls -lah
總用量 1.5M
drwxrwxr-x. 3 jenkins jenkins 42 3月 14 19:54 .
drwx------. 8 jenkins jenkins 189 3月 14 19:54 ..
drwxrwxr-x. 4 jenkins jenkins 34 3月 14 19:54 remoting
-rw-rw-r--. 1 jenkins jenkins 1.5M 3月 14 19:54 remoting.jar
當構建任務被分配到該節點進行構建時產生的文件,workspace 是任務構建目錄,和 Jenkins 安裝目錄下的 workspace 目錄一樣。tools 目時構建用到的工具目錄,例如用到JDK。
總用量 1.5M
drwxrwxr-x. 5 jenkins jenkins 72 3月 14 19:57 .
drwx------. 8 jenkins jenkins 189 3月 14 19:54 ..
drwxrwxr-x. 4 jenkins jenkins 34 3月 14 19:54 remoting
-rw-rw-r--. 1 jenkins jenkins 1.5M 3月 14 19:54 remoting.jar
drwxrwxr-x. 3 jenkins jenkins 30 3月 14 19:57 tools
drwxrwxr-x. 3 jenkins jenkins 27 3月 14 19:57 workspace
[jenkins@asus-centos jenkins_node_work_dir]$ ls tools/ -lah
總用量 0
drwxrwxr-x. 3 jenkins jenkins 30 3月 14 19:57 .
drwxrwxr-x. 5 jenkins jenkins 72 3月 14 19:57 ..
drwxrwxr-x. 3 jenkins jenkins 18 3月 14 19:57 hudson.model.JDK
[jenkins@asus-centos jenkins_node_work_dir]$ ls tools/hudson.model.JDK/ -lah
總用量 0
drwxrwxr-x. 3 jenkins jenkins 18 3月 14 19:57 .
drwxrwxr-x. 3 jenkins jenkins 30 3月 14 19:57 ..
drwxrwxr-x. 7 jenkins jenkins 271 3月 14 19:58 JDK8
[jenkins@asus-centos jenkins_node_work_dir]$ ls tools/hudson.model.JDK/JDK8/ -lah
總用量 26M
drwxrwxr-x. 7 jenkins jenkins 271 3月 14 19:58 .
drwxrwxr-x. 3 jenkins jenkins 18 3月 14 19:57 ..
drwxr-xr-x. 2 jenkins jenkins 4.0K 7月 4 2019 bin
-r--r--r--. 1 jenkins jenkins 3.2K 7月 4 2019 COPYRIGHT
drwxr-xr-x. 3 jenkins jenkins 132 7月 4 2019 include
-rw-rw-r--. 1 jenkins jenkins 17 3月 14 19:58 .installedByHudson
-rw-r--r--. 1 jenkins jenkins 5.0M 6月 12 2019 javafx-src.zip
drwxr-xr-x. 5 jenkins jenkins 185 7月 4 2019 jre
drwxr-xr-x. 5 jenkins jenkins 245 7月 4 2019 lib
-r--r--r--. 1 jenkins jenkins 44 7月 4 2019 LICENSE
drwxr-xr-x. 4 jenkins jenkins 47 7月 4 2019 man
-r--r--r--. 1 jenkins jenkins 159 7月 4 2019 README.html
-rw-r--r--. 1 jenkins jenkins 424 7月 4 2019 release
-rw-r--r--. 1 jenkins jenkins 21M 7月 4 2019 src.zip
-rw-r--r--. 1 jenkins jenkins 114K 6月 12 2019 THIRDPARTYLICENSEREADME-JAVAFX.txt
-r--r--r--. 1 jenkins jenkins 166K 7月 4 2019 THIRDPARTYLICENSEREADME.txt
我這里的節點上沒有單獨設置和安裝 JDK 工具,但是任務用到了 Java 命令 卻能正常構建,是因為我在 Jenkins 主節點上添加過 JDK,當其他構建節點需要工具工具時就會自動安裝到 tools 目錄。當然目前可以在 Jenkins 上配置的工具 有限,只支持如下工具的配置:
對於其他不支持在 Jenkins 管理面板配置的工具,我們可以在節點上自行安裝到全局,也可以將工具放到自己喜歡的目錄,然后配置環境變量指向到工具目錄。
如果你在使用 Jenkins 時遇到什么棘手的問題,歡迎留言討論。