1、概述
在《Jenkins部署架構(gòu)概述 》這篇博文中對Jenkins部署架構(gòu)進行了講解。對于分布式架構(gòu),Jenkins包括固態(tài)Agent和動態(tài)Agent兩種方案。
- 固定Agent(常用于虛擬機):Agent容器一直運行,任務(wù)構(gòu)建完成后不會銷毀,創(chuàng)建完成后將一直占用集群資源,配置過程較簡單。
- 動態(tài)Agent(常用于K8s):構(gòu)建任務(wù)時動態(tài)創(chuàng)建Agent容器,并在任務(wù)構(gòu)建完成后銷毀容器,可實現(xiàn)資源動態(tài)分配,資源利用率高,但是配置過程較為復(fù)雜。
本文將對Jenkins添加固定Agent進行詳細講解。
2、Jenkins添加固定Agent
(1)登錄Jenkins Dashboard,單擊左側(cè)“Manage Jenkins”,選擇“Security→代理配置頁面(TCP port for JNLP)”,如圖所示。我們可以選擇開放固定端口或者隨機開放Jenkins Master的一個端口來提供JNLP服務(wù)。

新安裝完的Jenkins Master節(jié)點上面的代理默認(rèn)是禁用狀態(tài), 如果這里不開啟代理,后面添加JNLP連接模式的固定節(jié)點時會報以下報錯。
1 2 3 4 | 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)單擊左側(cè)“Manage Jenkins”,選擇“Nodes”。

(3)單擊頁面右上角的“New Node”,輸入節(jié)點名稱為node203(該名稱可自定義),類型選擇固定節(jié)點。

配置以下節(jié)點信息:
- Name:agent名稱。
- Number of executors(并發(fā)構(gòu)建的最大數(shù)目):執(zhí)行器,是真正執(zhí)行項目的單元,默認(rèn)值是1。一個執(zhí)行器可以被理解為一個單獨的進程(事實上是線程)。在一個節(jié)點上可以運行多個執(zhí)行器。
- Remote root directory(遠程工作目錄): agent機器上的工作目錄,使用絕對路徑。
- Labels:agent的標(biāo)簽。當(dāng)agent數(shù)量變多時,如何知道哪些agent支持JDK 8、哪些agent支持Node.js環(huán)境呢?我們可以通過給agent打標(biāo)簽(有時也稱為tag)來確定。同一個agent可以擁有多個標(biāo)簽。
- Usage:agent的使用策略,有兩種:
- Use this node as much as possible,盡可能使用此agent。
- Only build jobs with label expressions matching this node,只有當(dāng)構(gòu)建任務(wù)符合本agent的標(biāo)簽時,才使用此agent。
- Launch method(啟動方式),有兩種:
- Launch agent by connecting it to the controller,通過Java Web啟動代理(JNLP,跨平臺,但是必須提前在固定節(jié)點安裝配置JRE環(huán)境,最常用方式)。
- Launch agent via SSH,Jenkins Master通過SSH連接到固定Agent(此方式比較簡單,但是不能跨平臺,用的較少)。
其余參數(shù)可保持默認(rèn),無需填寫,并單擊“保存”。

(4)在“節(jié)點列表”中單擊新增的節(jié)點名稱,可看到Agent狀態(tài)未連接,并提供了節(jié)點連接Jenkins的方式。

(5)在固定Agent節(jié)點上,打開命令終端,運行Master提示的命令。

注意 1:Agent節(jié)點需要提前安裝好與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,以此延續(xù)。
注意 2:SSH和JNLP 2種啟動方式區(qū)別,主要核心區(qū)別是:
- SSH是Master主動連接Slave,當(dāng)你在Master配好了一臺機器的賬密,那么Master就可以通過賬密SSH到這臺機器執(zhí)行命令,所以
SSH是Master主動連接Slave。
- JNLP是Slave主動連接Master,Slave接收并執(zhí)行Master傳遞的Job,然后將結(jié)果反饋給Master。
(6)在Jenkins Master“節(jié)點列表”中單擊新增的節(jié)點名稱,可看到Agent狀態(tài)已連接,下面就可以使用固定節(jié)點構(gòu)建流水線任務(wù)了。

3、使用固定Agent執(zhí)行流水線任務(wù)
(1)新建個流水線,Pipeline如下,代理節(jié)點根據(jù)標(biāo)簽接收構(gòu)建任務(wù)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | pipeline {
agent {
node {
label 'node203'
}
}
stages {
stage('test node203') {
steps {
echo '使用node203執(zhí)行流水線'
sh 'sleep 1h'
}
}
}
}
|

(2)運行流水線,再次查看node203節(jié)點狀態(tài),可以看到代理節(jié)點正在執(zhí)行流水線任務(wù)。

注意 1:上面示例只是個Hello World,如果流水線里面需要執(zhí)行mvn命令,需要在固定節(jié)點安裝配置指定版本的mvn;如果流水線需要執(zhí)行npm命令,需要在固定節(jié)點安裝配置指定版本的nodejs.....。
4、Jenkins使用JNLP啟動Agent原理詳解
4.1 概述
Java網(wǎng)絡(luò)啟動協(xié)議(JNLP)是一種允許客戶端啟動托管在遠程Web服務(wù)器上的應(yīng)用程序的協(xié)議,用于在Java應(yīng)用程序之間建立安全、高效的通信。
JNLP只是技術(shù)方式,其核心是:
- Slave節(jié)點主動運行一個Agent程序與Master建立連接,接收并執(zhí)行Master傳遞的Job,然后將結(jié)果反饋給Master。
- Master通過JNLP協(xié)議與從節(jié)點進行通信,將構(gòu)建任務(wù)分發(fā)到Slave節(jié)點執(zhí)行。
4.2 為什么使用 JNLP 協(xié)議
- 自動化:JNLP 協(xié)議允許 Jenkins Master 和 Agent 之間的連接和配置過程自動化,而不需要手動干預(yù)。Agent 啟動時自動處理與 Master 的連接和認(rèn)證,簡化了配置過程。
- 安全性:JNLP 協(xié)議中的認(rèn)證機制可以確保只有授權(quán)的 Agent 可以連接到 Jenkins Master,從而提高了系統(tǒng)的安全性。
- 動態(tài)更新:JNLP 文件可以包含最新的配置信息,這使得 Agent 可以在啟動時動態(tài)地獲取和使用這些信息。
4.3 Master節(jié)點和Slave節(jié)點之間的通信過程
(1)從節(jié)點通過JNLP協(xié)議與主節(jié)點建立TCP/IP長連接,這個長連接的機制允許Jenkins Master和Agent之間保持持續(xù)的通信,以便實時地進行任務(wù)調(diào)度、執(zhí)行和狀態(tài)更新。
1 | java -jar agent.jar -url http://10.20.31.153:8080/jenkins/ -secret 800b585576416c0041ed6ee9783f895118193e443309a2d557cfb319b057a8a9 -name node203 -workDir "/opt/jenkins"
|
以下是關(guān)于長連接的詳細信息:
- 長連接的建立:
-
- Agent 啟動:當(dāng) Jenkins Agent 啟動時,它會連接到 Jenkins Master 并建立一個持久的 TCP 連接。這種連接使用 JNLP 協(xié)議。
- 通信保持:這個連接用于傳輸任務(wù)配置、執(zhí)行步驟、日志信息等。它確保 Jenkins Master 和 Agent 之間的通信可以實時進行。
-
通信過程:
- 實時交互:在任務(wù)執(zhí)行過程中,Agent 會定期向 Jenkins Master 發(fā)送任務(wù)進度、構(gòu)建日志和其他狀態(tài)信息。Master 會接收這些更新,并在 Web 界面中顯示實時進展。
- 指令發(fā)送:Jenkins Master 會通過這個長連接向 Agent 發(fā)送任務(wù)指令和配置更新。
-
連接的穩(wěn)定性:
- TCP 連接:Jenkins 使用 TCP 連接來維持與 Agent 的長連接。TCP 協(xié)議提供了可靠的數(shù)據(jù)傳輸,確保數(shù)據(jù)包的順序和完整性。
- 心跳機制:為了保持連接的活躍性,Jenkins Master 和 Agent 通常會使用心跳機制(即定期發(fā)送空閑的網(wǎng)絡(luò)包)來檢測連接是否仍然有效。如果連接中斷,Master 會嘗試重新連接,或者標(biāo)記 Agent 為離線狀態(tài)。
(2)主節(jié)點調(diào)度構(gòu)建任務(wù),從節(jié)點根據(jù)標(biāo)簽接收構(gòu)建任務(wù),并按照主節(jié)點的指示執(zhí)行構(gòu)建作業(yè),并將構(gòu)建結(jié)果和日志發(fā)送回主節(jié)點。
(3)主節(jié)點將構(gòu)建結(jié)果和日志發(fā)布到Jenkins界面上,供用戶查看和監(jiān)控。
5、總結(jié)
本文詳細講解了如何在Jenkins中添加固定Agent并使用固定節(jié)點運行流水線任務(wù),同時闡述了Jenkins JNLP連接方式的原理。通過本文,您可以更好地理解和優(yōu)化Jenkins的節(jié)點配置和任務(wù)管理。
參考:Jenkins 安裝 JNLP 節(jié)點
參考:jenkins發(fā)布多臺java jenkins并發(fā)構(gòu)建
|