1. 程式人生 > 其它 >記一次因jenkins遷移由於imagePullPolicy策略而導致釋出內容不是最新的小問題

記一次因jenkins遷移由於imagePullPolicy策略而導致釋出內容不是最新的小問題

1.背景

  由於公司jenkins需要遷移到騰訊雲,所以進行jenkins的遷移,jenkins遷移的過程不在描述,由於使用的yum安裝,截止2022年4月1日時,jenkins老版本自動安裝很多預設外掛在國內安裝失敗,個人也不想去一個一個去下載安裝,於是將jenkins升級到了最新版本;(jenkins版本2.338-1.1,jenkins版本在這個文件這裡其實不重要,只是做個記錄)

  後面遷移完jenkins的job資料夾,雖然歷史資訊以及版本號都做了保留,但是隻要更改配置檔案就會出錯,覺得沒有必要去修復這個錯誤,於是便新建任務重新發布,便出現了以下問題:

  不管狀態釋出的多麼正常,但是最新的程式程式碼一直無法展示,出現的一直是很久之前的

程式程式碼。(具體的程式碼內容就不展示了)

  於是有了以下排錯的過程:

 

2.排錯過程

  由於這裡使用是jenkins完成ci/cd部分,於是排查以下流程。

  1. 檢查源站git上的程式碼是否正常。 (正常)
  2. 檢查構建的映象內的程式碼是否正常。 (正常)
  3. 檢查jenkins的工作目錄的job是否正常,害怕有快取或者什麼不確定因素。 (正常)
  4. 檢查執行中pod 容器的執行程式碼 (異常,為老程式碼)

  參考之前的部落格<jenkins-k8s-Class not found io.kubernetes.client.openapi.models.V1Service報錯 >,以為是降級了kubernetes cd外掛的問題而出現的bug,可能與新版本不相容。

  後面突然想到,負責專案的小夥子會不會重新建立job,最終導致映象名稱以及tag重複,而k8s的映象拉取策略是‘IfNotPresent’,於是查看了pod的yaml檔案,再次登入k8s中執行pod的node節點,果然,當前版本號構建次數為6,而該任務在之前的jenkins已經發布了42次。意思就是說在這42次之內,都不可能更新到最新程式碼。因為映象tag重複了,又因為k8s映象拉取策略,本地如果有映象,那麼就不去倉庫去拉取最新映象。在連續點選40次之後,程式碼才能顯示最新。於是這裡手動刪除了映象tag為10-30的,臨時解決了問題。

 

3.問題解決

  其實該問題也是一個很小的問題,解決方式有很多,但是竟然出現了,還是簡單記錄一下。有以下幾種解決方案。

 

3.1 刪除node上的下載的映象

  使用docker rmi刪除機器上所有重複的映象就可以解決,但是缺點在於如果你有100個node,每個node上隨機分佈了pod,那麼就得把所有node上重複的映象tag給刪除。

 

3.2 Jenkins pipeline不要起重複的名字

  比如之前任務是takt-home-frontend,那麼隨便加一個標識,如takt-home-frontend-new,改變映象名稱也可以。但是顯得不太整潔。

 

 

3.3 k8s映象的下載策略

  這裡不做過多解釋,直接上圖。

  檢視pod的詳細配置檔案,這裡的拉取策略就是‘IfNotPresent’。所以最簡單的方式還是手動直接指定 imagePullPolicy欄位為Always。

  以下附上官網連結:https://kubernetes.io/zh/docs/concepts/containers/images/