1、概述
在《Jenkins部署架構概述 》這篇博文中對Jenkins部署架構進行了講解。對於分散式架構,Jenkins包括固態Agent和動態Agent兩種方案。
- 固定Agent(常用於虛擬機器):Agent容器一直執行,任務構建完成後不會銷燬,建立完成後將一直佔用叢集資源,配置過程較簡單。
- 動態Agent(常用於K8s):構建任務時動態建立Agent容器,並在任務構建完成後銷燬容器,可實現資源動態分配,資源利用率高,但是配置過程較為複雜。
本文將對Jenkins新增固定Agent進行詳細講解。
2、Jenkins新增固定Agent
(1)登入Jenkins Dashboard,單擊左側“Manage Jenkins”,選擇“Security→代理配置頁面(TCP port for JNLP)”,如圖所示。我們可以選擇開放固定埠或者隨機開放Jenkins Master的一個埠來提供JNLP服務。
新安裝完的Jenkins Master節點上面的代理預設是禁用狀態, 如果這裡不開啟代理,後面新增JNLP連線模式的固定節點時會報以下報錯。
java.io.IOException: http://10.20.31.153:8080/jenkins/tcpSlaveAgentListener/ is invalid: 404 null at org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver.resolve(JnlpAgentEndpointResolver.java:222) at hudson.remoting.Engine.innerRun(Engine.java:809) at hudson.remoting.Engine.run(Engine.java:563)
(2)單擊左側“Manage Jenkins”,選擇“Nodes”。
(3)單擊頁面右上角的“New Node”,輸入節點名稱為node203(該名稱可自定義),型別選擇固定節點。
配置以下節點資訊:
- Name:agent名稱。
- Number of executors(併發構建的最大數目):執行器,是真正執行專案的單元,預設值是1。一個執行器可以被理解為一個單獨的程序(事實上是執行緒)。在一個節點上可以執行多個執行器。
- Remote root directory(遠端工作目錄): agent機器上的工作目錄,使用絕對路徑。
- Labels:agent的標籤。當agent數量變多時,如何知道哪些agent支援JDK 8、哪些agent支援Node.js環境呢?我們可以透過給agent打標籤(有時也稱為tag)來確定。同一個agent可以擁有多個標籤。
- Usage:agent的使用策略,有兩種:
- Use this node as much as possible,儘可能使用此agent。
- Only build jobs with label expressions matching this node,只有當構建任務符合本agent的標籤時,才使用此agent。
- Launch method(啟動方式),有兩種:
- Launch agent by connecting it to the controller,透過Java Web啟動代理(JNLP,跨平臺,但是必須提前在固定節點安裝配置JRE環境,最常用方式)。
- Launch agent via SSH,Jenkins Master透過SSH連線到固定Agent(此方式比較簡單,但是不能跨平臺,用的較少)。
其餘引數可保持預設,無需填寫,並單擊“儲存”。
(4)在“節點列表”中單擊新增的節點名稱,可看到Agent狀態未連線,並提供了節點連線Jenkins的方式。
(5)在固定Agent節點上,開啟命令終端,執行Master提示的命令。
注意 1:Agent節點需要提前安裝好與Jenkins版本匹配的JRE,不然報has been compiled by a more recent version of the Java Runtime(class file version 5x.0)錯誤。其中5x:51=Jdk7、52=Jdk8、53=Jdk9、54=Jdk10、55=Jdk11,以此延續。
注意 2:SSH和JNLP 2種啟動方式區別,主要核心區別是:
- SSH是Master主動連線Slave,當你在Master配好了一臺機器的賬密,那麼Master就可以透過賬密SSH到這臺機器執行命令,所以
SSH是Master主動連線Slave
。- JNLP是Slave主動連線Master,Slave接收並執行Master傳遞的Job,然後將結果反饋給Master。
(6)在Jenkins Master“節點列表”中單擊新增的節點名稱,可看到Agent狀態已連線,下面就可以使用固定節點構建流水線任務了。
3、使用固定Agent執行流水線任務
(1)新建個流水線,Pipeline如下,代理節點根據標籤接收構建任務。
pipeline { agent { node { label 'node203' } } stages { stage('test node203') { steps { echo '使用node203執行流水線' sh 'sleep 1h' } } } }
(2)執行流水線,再次檢視node203節點狀態,可以看到代理節點正在執行流水線任務。
注意 1:上面示例只是個Hello World,如果流水線裡面需要執行mvn命令,需要在固定節點安裝配置指定版本的mvn;如果流水線需要執行npm命令,需要在固定節點安裝配置指定版本的nodejs.....。
4、Jenkins使用JNLP啟動Agent原理詳解
4.1 概述
Java網路啟動協議(JNLP)是一種允許客戶端啟動託管在遠端Web伺服器上的應用程式的協議,用於在Java應用程式之間建立安全、高效的通訊。
JNLP只是技術方式,其核心是:
- Slave節點主動執行一個Agent程式與Master建立連線,接收並執行Master傳遞的Job,然後將結果反饋給Master。
- Master透過JNLP協議與從節點進行通訊,將構建任務分發到Slave節點執行。
4.2 為什麼使用 JNLP 協議
- 自動化:JNLP 協議允許 Jenkins Master 和 Agent 之間的連線和配置過程自動化,而不需要手動干預。Agent 啟動時自動處理與 Master 的連線和認證,簡化了配置過程。
- 安全性:JNLP 協議中的認證機制可以確保只有授權的 Agent 可以連線到 Jenkins Master,從而提高了系統的安全性。
- 動態更新:JNLP 檔案可以包含最新的配置資訊,這使得 Agent 可以在啟動時動態地獲取和使用這些資訊。
4.3 Master節點和Slave節點之間的通訊過程
(1)從節點透過JNLP協議與主節點建立TCP/IP長連線,這個長連線的機制允許Jenkins Master和Agent之間保持持續的通訊,以便實時地進行任務排程、執行和狀態更新。
java -jar agent.jar -url http://10.20.31.153:8080/jenkins/ -secret 800b585576416c0041ed6ee9783f895118193e443309a2d557cfb319b057a8a9 -name node203 -workDir "/opt/jenkins"
以下是關於長連線的詳細資訊:
- 長連線的建立:
-
- Agent 啟動:當 Jenkins Agent 啟動時,它會連線到 Jenkins Master 並建立一個持久的 TCP 連線。這種連線使用 JNLP 協議。
- 通訊保持:這個連線用於傳輸任務配置、執行步驟、日誌資訊等。它確保 Jenkins Master 和 Agent 之間的通訊可以實時進行。
-
通訊過程:
- 實時互動:在任務執行過程中,Agent 會定期向 Jenkins Master 傳送任務進度、構建日誌和其他狀態資訊。Master 會接收這些更新,並在 Web 介面中顯示實時進展。
- 指令傳送:Jenkins Master 會透過這個長連線向 Agent 傳送任務指令和配置更新。
-
連線的穩定性:
- TCP 連線:Jenkins 使用 TCP 連線來維持與 Agent 的長連線。TCP 協議提供了可靠的資料傳輸,確保資料包的順序和完整性。
- 心跳機制:為了保持連線的活躍性,Jenkins Master 和 Agent 通常會使用心跳機制(即定期傳送空閒的網路包)來檢測連線是否仍然有效。如果連線中斷,Master 會嘗試重新連線,或者標記 Agent 為離線狀態。
(2)主節點排程構建任務,從節點根據標籤接收構建任務,並按照主節點的指示執行構建作業,並將構建結果和日誌傳送回主節點。
(3)主節點將構建結果和日誌釋出到Jenkins介面上,供使用者檢視和監控。
5、總結
本文詳細講解了如何在Jenkins中新增固定Agent並使用固定節點執行流水線任務,同時闡述了Jenkins JNLP連線方式的原理。透過本文,您可以更好地理解和最佳化Jenkins的節點配置和任務管理。
參考:Jenkins 安裝 JNLP 節點
參考:jenkins釋出多臺java jenkins併發構建