Docker 內的 Jenkins 遷移詳細教學

之前在建立 Jenkins 的時候沒有想那麼多,隨便找一台 server 來裝,反正就是先能夠自動化再說。筆者在之前有介紹過 Jenkins 自動刪除歷史建置資料,有稍稍減緩,但專案越來越多,容量也越來越不夠使用,於是下定決心要幫 Jenkins 搬家。

本文要示範的新、舊兩個 Jenkins 是放在不同的 Linux 主機,不過都是放在 Docker 內部,透過搬移 jenkins_home 的方式完成資料的移轉。建議兩個 Jenkins 的版本相同,或是新的 Jenkins 版本較高比較不容易出現問題。

首先先將舊 Jenkins 容器裡面, /var/jenkins_home 資料夾打包為 tar 格式(加快傳輸速度),因為容器內沒有 tar 指令,所以我們在主機傳達指令進 docker 執行打包,完成後放置到根目錄下,且一般使用者權限不足,所以使用 root 身份進入容器。
註:本文示範的 Jenkins 容器名稱都叫做 Jenkins
  
docker exec -u root -it jenkins tar cvf /jenkins_home.tar /var/jenkins_home


使用 scp 指令將 jenkins_home.tar 檔案複製到放置新 Jenkins 的 Linux 主機

註1:目標主機需要開啟 ssh 連線,延伸閱讀:設定 Linux 開放 ssh 連線
註2:需要等待所有檔案傳輸完畢,筆者的檔案大小為 4.6GB,花費時間約 7 分鐘
註3:-P 1234 代表使用指定的 ssh port,若為標準 port,可以省略。
  
docker exec -u root -it jenkins scp -p -C -P 1234 /jenkins_home.tar dev@192.168.0.3:~


執行輸出內容:
  
$ docker exec -u root -it jenkins scp -p -C -P 1234 /jenkins_home.tar dev@192.168.0.3:~
The authenticity of host '[192.168.0.3]:1234 ([192.168.0.3]:1234)' can't be established.
ECDSA key fingerprint is SHA256:2sxsw9Oqzj/RuywqaAaGGaAafvRuyutRpf123WsOqpk.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[192.168.0.3]:1234' (ECDSA) to the list of known hosts.
dev@192.168.0.3's password:
jenkins_home.tar                                                                             100% 4640MB  11.0MB/s   07:01     


這個時候到新的主機下面查看,就會看到該檔案
  
dev@ci-cd:~$ ls
jenkins_home.tar


jenkins_home.tar 將檔案複製到 Jenkins 容器內的 var 目錄下
  
docker cp jenkins_home.tar jenkins:/var


建議先進入容器內將新的 jenkins_home 資料夾備份,避免發生意外(雖然是新的沒有資料)

在 Linux 下(非容器內)使用 root 帳號將容器內的 jenkins_home.tar 檔案解開
  
docker exec -u root -it jenkins tar xvf /var/jenkins_home.tar


Jenkins 的資料遷移到這裡就完成了!

不過如果新的 Jenkins ip 和舊的不一樣,會提示 「Reverse Proxy 設定好像有點問題喔」

可以在資訊主頁 > 管理 Jenkins > 設定系統 > Jenkins 位置 > Jenkins URL 調整設定



延伸閱讀:[教學] docker 中的 Jenkins 更新

留言