GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
字體大小: +
5 分鐘閱讀時間 (927 個字)

Jenkins Node - 無法存取網路磁碟機

2021-07-11-3.33.06

團隊有自己維護一台 Jenkins Node ,前陣子有成員反應 Auto deploy 執行失敗,但不知道是什麼原因造成的

打開 job 的 Console Output ,發現失敗的原因是:

The system cannot find the specified drive

嗯? 系統找不到指令的磁碟機,續查 job 確認他是要執行 xcopy 將檔案複製到遠端主機,這個遠端主機有在 Node 上掛載網路磁碟機

照這樣看來,是不是網路磁碟機沒有連上去呢? 隨即連到 Node 上確認

看起來是有通的,但為什麼 Jenkins 會說不存在呢?

確認了一下這個 job 的狀況

  1. 前幾天都有建置成功
  2. 這個 job 沒有調整過設定
  3. 磁碟代碼是正確的

嗯? 莫非是乖乖過期了? (並沒有

想了想,最近唯一有改變的就是:將 Node 上的 Jenkins slave agent 改隨著電腦啟動時啟動,應該不會是這個原因吧?

於是,將 agent 停掉,以人工的方式重新啟動,這個 job 居然順利進行了?!

咦~為什麼會這樣? 難道說只能認命每次 Server 重啟時進來開了嗎?

本持著懶人的精神,開始尋找解決方案

問題原因?

上網查了一下,發現有人有同樣的情況

You might run into permission issues. Jenkins might be executed with different user credentials; so it does not know the configured drive for the windows share.

batch file - The system cannot find the specified drive in Jenkins - Stack Overflow

主要是因為 Jenkins 在執行時會以不同的身份下去執行 job ,所以有可能是因為我們改了 agent 的啟動方式 (雖然執行的身份還是我們指定的那個帳號,但實際上權限沒有很完整)

如何解決?

在 job 中掛載網路磁碟機

既然身份不同會導致這樣的結果,那直接從 job 裡面掛載網路磁碟機呢?

於是在 job 中去執行重新掛載磁碟機的 batch 檔

執行完成後,重新執行失敗的 job ,發現他正常運作了

問題解決是解決了,但總不能每個 job 執行前都要加上這個吧?

於是找了個方法來檢測網路磁碟機有沒有被正確的掛載

建立一個 job 監測網路磁碟機

寫了一個 PowerShell 的 script ,藉由 win32_logicaldisk 取得目前使用中的磁碟代號資訊,本身回傳的是一個陣列,透過陣列大小就可以判斷目前 Server 上是不是有掛載網路磁碟機

chcp 65001
Write-Host 'Checking network disk status...' -NoNewline
$nc = @(gwmi win32_logicaldisk -filter "DriveType=4").count
if ($nc -eq 0) {
  Write-Host 'FAILED'
  exit 1
} else {
  Write-Host 'OK'
  exit 0
}

每天固定時間執行,檢查網路磁碟機是不是有正確掛載,如果沒有就去觸發掛載的 job (把上一節掛載的指令抽出來設定成獨立的 job)

沒有正確掛載:

有正確掛載:

這樣就可以不用修改到其他的 job ,也能確保 job 執行前網路磁碟機能正確地掛載

不過..這方法也是有缺點的,假如 Node 真的因為某些原因停機了一段時間,導致排定的 job 沒有執行卡在 Queue 上,當 Node 上線時,這些在 Queue 上的 job 就會搶在重新掛載前執行,這部分目前沒有想到一個比較好的方法解決,或許真的要每個 job 執行前都先檢查自己需要的網路磁碟機有沒有正確掛載吧?

 

×
Stay Informed

When you subscribe to the blog, we will send you an e-mail when there are new updates on the site so you wouldn't miss them.

以容器取代虛擬機
C#-Linq-給你起迄日把這中間的日期都抓出來

相關文章

 

評論

尚無評論
已經注冊了? 這裡登入
2025年9月29日, 星期一

Captcha 圖像