Jenkins配置分散式構建環境——新增固定Agent並使用JNLP啟動Agent詳解

人艰不拆_zmc發表於2024-08-13

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只是技術方式,其核心是:

  1. Slave節點主動執行一個Agent程式與Master建立連線,接收並執行Master傳遞的Job,然後將結果反饋給Master。
  2. 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"

以下是關於長連線的詳細資訊:

  1. 長連線的建立:
    • Agent 啟動:當 Jenkins Agent 啟動時,它會連線到 Jenkins Master 並建立一個持久的 TCP 連線。這種連線使用 JNLP 協議。
    • 通訊保持:這個連線用於傳輸任務配置、執行步驟、日誌資訊等。它確保 Jenkins Master 和 Agent 之間的通訊可以實時進行。
  1. 通訊過程:

    • 實時互動:在任務執行過程中,Agent 會定期向 Jenkins Master 傳送任務進度、構建日誌和其他狀態資訊。Master 會接收這些更新,並在 Web 介面中顯示實時進展。
    • 指令傳送:Jenkins Master 會透過這個長連線向 Agent 傳送任務指令和配置更新。
  2. 連線的穩定性:

    • TCP 連線:Jenkins 使用 TCP 連線來維持與 Agent 的長連線。TCP 協議提供了可靠的資料傳輸,確保資料包的順序和完整性。
    • 心跳機制:為了保持連線的活躍性,Jenkins Master 和 Agent 通常會使用心跳機制(即定期傳送空閒的網路包)來檢測連線是否仍然有效。如果連線中斷,Master 會嘗試重新連線,或者標記 Agent 為離線狀態。

(2)主節點排程構建任務,從節點根據標籤接收構建任務,並按照主節點的指示執行構建作業,並將構建結果和日誌傳送回主節點。

(3)主節點將構建結果和日誌釋出到Jenkins介面上,供使用者檢視和監控。

5、總結

本文詳細講解了如何在Jenkins中新增固定Agent並使用固定節點執行流水線任務,同時闡述了Jenkins JNLP連線方式的原理。透過本文,您可以更好地理解和最佳化Jenkins的節點配置和任務管理。

參考:Jenkins 安裝 JNLP 節點

參考:jenkins釋出多臺java jenkins併發構建

相關文章