關於 Jenkins master 共享 JENKINS_HOME 目錄的實驗

本文首發於:Jenkins 中文社區java

做者:翟志軍 審校:王冬輝linuxsurenlinux

Jenkins master 的高可用是個老大難的問題。和不少人同樣,筆者也想過兩個 Jenkins master 共享同一個 JENKINS_HOME 的方案。瞭解 Jenkins 原理的人,都會以爲這個方案不可行。可是真的不可行嗎?git

因爲工做緣由,筆者須要親自驗證以上猜測。github

JENKINS_HOME 介紹

Jenkins 全部狀態數據都存放文件系統的目錄中,這個目錄被稱爲 JENKINS_HOME 目錄。docker

實驗環境介紹

筆者經過 Docker compose 啓動兩個獨立的 Jenkins master,分別爲 jenkins-a 和 jenkins-b。它們共用同一個 JENKINS_HOME 目錄。相應的代碼倉庫的連接放在文章底部。瀏覽器

將代碼克隆到本地後,進入倉庫,執行 docker-compose up -d 便可啓動實驗環境。啓動完成,在瀏覽器中輸入 http://localhost:7088 可訪問 jenkins-a,jenkins-b 的地址是 http://localhost:7089 。可是你會發現它們啓動後的界面顯示是不同的。ui

jenkins-b 的界面以下圖所示:rest

而 jenkins-a 的界面以下圖所示:日誌

這時,將 jenkins-a 日誌中的解鎖密碼(Unlock password)輸入到 jenkins-b 的頁面中,會獲得報錯信息:code

ERROR: The password entered is incorrect, please check the file for the correct password

這時,再次 jenkins-b 日誌中的解鎖密碼(Unlock password)輸入到表單中便可進入下一步。接下來就是按照提示一步步完成了。在 jenkins-b 安裝步驟的最後一步,咱們設置了管理員的用戶名密碼:admin/admin。而後就算完成任務了。

而後咱們再在 jenkins-a 使用 admin/admin 進行登陸,登陸是報錯的:用戶密碼不正確。

接下來,執行 docker-compose restart jenkins-a 命令重啓 jenkins-a。再次使用 admin/admin 就能夠登陸成功了。

當兩個 Jenkins 啓動完成後,接下來開始作實驗。

實驗1:建立任務

在 jenkins-a 建立任務 x,刷新 jenkins-b 的頁面,jenkins-b 上會不會顯示出任務 x ?

結果:jenkins-b 不會出現任務 x。重啓 jenkins-b 後,任務 x 出如今任務列表中。

實驗2:任務結果可見性

jenkins-a 上任務執行,jenkins-b 上可否看到任務執行結果?

jenkins-a 執行任務 x,而且執行成功。刷新 jenkins-b 看不到任何執行記錄。重啓 jenkins-b 後,可看到執行記錄。

實驗3:兩 master 同時執行同一任務

分別在兩個 Jenkins master 上(幾乎)開始同一個任務 x。其中一個任務的 build number 會更新,可是另外一個不會。

其中 jenkins-a 任務 x 的 build number 會升到 2,而 jenkins-b 保持的是 1。這時,單獨執行 jenkins-b 的任務 x,日誌會出現錯誤:

jenkins-b_1  | WARNING: A new build could not be created in job x
jenkins-b_1  | java.lang.IllegalStateException: JENKINS-23152: /var/jenkins_home/jobs/x/builds/2 already existed; will not overwrite with x #2

實驗4:編輯任務

jenkins-a 上設置任務 x 定時執行,刷新 jenkins-b 頁面,任務 x 中並無定時執行的設置。重啓 jenkins-b 後,任務 x 更新。

實驗5:定時任務的結果是什麼?

若是 jenkins-a 和 jenkins-b 兩個任務均爲定時任務,並且都生效了。它們運行結果是什麼的呢?

看到的現象是,兩個任務都會按時執行,可是隻有一個任務能將運行結果寫入到磁盤中。界面以下圖:

另,從日誌中,能夠確認 jenkins-a 和 jenkins-b 確實按時執行了。以下圖日誌中,看出 jenkins-a 定時執行 #6 次構建時報錯,由於 jenkins-b 已經執行過 #6 次構建了:

小結

能夠確認的是,當兩個 Jenkins 進程共用同一個 JENKINS_HOME 目錄時,其中一個 Jenkins 進程更新了 JENKINS_HOME 的內容,另外一個是不會實時更新的。因此,同時啓動兩個 Jenkins master 共用同一個 JENKINS_HOME 的方案是不可行的。咱們不能在 jenkins-a 掛了後,直接將流量切到 jenkins-b。由於 jenkins-b 必須重啓。

最後結論:多個 Jenkins master 共享同一個 JENKINS_HOME 的方案是沒法使用 Jenkins master 的高可用。

附錄

相關文章
相關標籤/搜索