我們在使用jenkins的時候,一般來說肯定是有slave節點的,本來網上也有好多關於jenkins節點配置的教程,我也就不寫了。簡單說明一下:任務一般是在slave上面運行的。當然不是講master節點不能跑任務,master節點主要是處理調度構建作業,把構建分發到slave節點進行實際執行,監視slave節點的狀態(必要時讓它們進行上線或者離線),記錄和發布構建產物。
注意:構建結果和構建產物最后還是傳回到master節點,比如說在jenkins工作目錄下面的workspace里面的東西,其實在master節點照樣是有一份的。(網上的文章很少有提到這一點的)
主要常用的的連接slave節點的方式就是通過ssh和jnlp。兩個特點分別如下:
- ssh來說,我們一般用的服務器都是linux系統,當然最方便的就是通過ssh啟動jenkins節點,但是這個有個前提的要求就是master和slave之前能進行ssh連接
- jnlp連接方式有個好處就是不用master和slave之間能夠ssh連接,只需要能夠ping即可。並且如果slave的機器是windows的話,也是可以的這個其實是非常實用的,因為有時候,可能一些權限或者防火牆的原因,這master和slave真的不能夠ssh連接,還有一些未知的原因無法ssh到slave節點(我下面說的公司這個例子就是這樣),都可以通過jnlp的方式進行連接。
本來是中秋節放假之期,微信群里就有人進行說,jenkins的slave節點好像不好使,上去看了下,slave節點連接掛了。下面只是我個人處理問題的一次記錄,僅供大家進行參考。
問題:在slave節點上面的job不能正常的運行。
1、先登錄jenkins看了一下節點,好像節點真的是掛了。看了一下是通過ssh進行連接的,點擊重啟了一下還是不行。
2、然后我就隨手ping了一下機器,發現機器是可以ping通的,但是丟包好像是挺嚴重的,因為這台機器是在🇧🇷,也可以理解。我以為網絡不好很有可能是slave節點不能用的原因,但不敢確認。
3、我用ssh登錄機器,這時候比較奇怪的事情就來了,我發現死活都等錄不上去,報了一個connection reset peer,看了一篇文章大概是說對端的端口是關閉的。(因為自己對tcp/ip協議只知道一個皮毛,所以下決心要好好研究一下),但是。。。。,我竟然telnet端口的時候,發現22端口是通的,這時候我就比較郁悶了。
4、又嘗試了幾次還是登陸不上去,這時候我比較迷惑,我覺得可能是機器有問題,所以跑到AWS上面,把機器重啟了一下,本地ssh登陸是可以了,但是slave節點還是不能啟動。
5、ssh到這台slave節點機器,發現在jenkins的界面點擊的重啟的命令根本沒有生效,沒有相關的jenkins進程。然后我就想着手工方式啟動,嘗試使用Java -jar的方式啟動,好像得要什么參數(也沒有去查),當然也啟動不了。
6、我又想了一下,如果是正常的話,應該咋界面點擊重啟之后,會有命令傳到slave的節點。之前是ssh登錄有問題,但是現在ssh登錄是好的,所以我覺得現在的可能就是因為網絡的問題。
7、這時候其實是jnlp方式表演的時候了,其實很簡單,就是在選擇連接方式的時候,選擇Launch slave agent via JNLP。因為是改變連接方式,所以其他的工作目錄啥的可以不用動。完成后其實很簡單,有兩種啟動的方式,界面就能看到,我是下載了agent.jar這個包到本地,然后傳到slave節點,然后執行下面一條很長的自動生成的命令就可以啟動了。至此今天的問題就解決了。
8、其實,我早就應該這樣做了,只是初到公司,各種不熟悉,也不敢自己擅自亂改,嘿嘿~ 但是這樣做也不是很完美的,因為通過JNLP連接有下面的缺點:
- 從節點不能被jenkins自動啟動或者重啟,因此,如果從節點,發生故障,則master是無法重啟它的,得去slave節點去看。
9、反思:關於網絡的tcp/ip協議真的是需要看一下,還有就是感覺勇敢嘗試!