分享程式代碼相關筆記
目前文章總數:190 篇
最後更新:2025年 07月 26日
需求上,會需要將舊版的 Windows Jenkins 機器淘汰,轉移到新版 Jenkins 並且使用 Ubuntu 作業系統安裝
此時不可能讓我們直接將舊的 Windows Jenkins 的所有內容貼上到Jenkins(Ubuntu 容器化) 的新機器上
首先面臨的問題就是作業系統不同與版本差異 ,這就是要克服的部分。將在第二、第三部分說明
可復現容器是適合 團隊協作、CI/CD 穩定性與環境一致性需求強的場景
並且實現後有以下好處(目的):
1. 環境一致性 | 預設 job、agent、pipeline 設定等,以及減少 「在我的機器上可以跑」 的問題。 |
2. 快速重建與災難復原 | 出現故障或誤刪後,可以用 Docker + 設定檔重建一模一樣的 Jenkins 環境。 |
3. 可攜性與可遷移性 | 可以把 Jenkins 容器部署到任何一台裝有 Docker 的機器 |
4. 支援多環境部署 | 可在 dev/staging/prod 各環境建立獨立但一致的 Jenkins 部署,便於測試與上線前驗證 |
可以避免大量的重工 & 排查不同環境下的問題 & 可攜性 & 支援多環境部署
以下是基本跨平台 Windows 轉移到 Linux 上的風險差異
1. 檔案路徑格式 | : | Windows 使用 \,Linux 使用 /,某些插件或 job config.xml 會儲存硬編碼路徑。 |
2. 憑證加密差異 | : | Jenkins Credentials 加密依賴 OS 上的 secrets/master.key 與環境,跨平台可能無法解密。 |
3. 權限問題 | : | Windows 檔案系統權限與 Linux 完全不同,導致 container 內部讀寫異常。 |
4. 插件相依性 | : | 某些插件只支援某 OS,例如某些用到 PowerShell 或 bat 的 plugin 會在 Linux 掛掉。 |
5. 工具安裝 | : | 工具(JDK、Maven)若原本配置為 Windows 路徑,會在 Linux 找不到可執行檔。 |
基於風險上的描述後,Jenkins 要搬遷從 Windows 的 Jenkins (安裝在作業系統上) 到 Linux Ubuntu 上的容器 Jenkins
分成以下可搬移的項目,分析說明
搬移項目 | 可考慮做法 | 最安全的作法 | 解釋說明 |
---|---|---|---|
1. Views 視景 | 直接將 config.xml 檔案複製 | 在新 Jenkins 上重建 | .xml 檔案會因為 Jenkins 版本差異、Plugings 套件差異而導致無法使用 |
2. Job 工作項目 | 手動重建 | 如左 | 很多 Plugings 套件相依於 Job 作業上,若升級導致 Plugins 失效無法安裝,會導致無法使用 |
3. System 配置 | 手動重建 | 如左 | Windows、Linux 的配置、路由、環境變數都不同,因此直接複製 .xml 設定檔案,會導致異常 |
4. Plugins 外掛插件 | 透過 plugin.txt 安裝 | 手動安裝 | 有些套件在新版 Jenknins 已不支援,並且作業系統的關係,會讓某些套件直接安裝時死亡 (EX: Windows 的 PowerShell) |
5. Credentials 配置權限 | 手動重建 | 如左 | 因為 credentials.xml 與 secrets 是基於特定 OS 和 key 加密 |
6. Users 帳號 | 將 users 資料夾全部複製 | 手動重建 | users.xml 加密方式會與 OS 環境有差異,會導致搬移後原本的用戶密碼無法登入,此外某些 Plugings 相依關係,不支援時直接導致異常 |
7. Tools 工具配置 | DockerFile 安裝 | 下指令手動安裝 | 絕對不可以複製 .xml 因為跨平台的關係 SDK 安裝版本會有差異 ; 此外 Dockerfile 裡面安裝的套件可能會與 Jenkins & OS 版本有相依關係,也可能間接導致異常 |
跨平台的升級 Jenkins 基本上都是手動重建,只有在 相同作業系統 、 相同Jenkins版本下,複製可搬移的方案才是最有可能的
我們隨意開啟舊版 Jenkins (Windows)機器下的 Job 目錄的作業中的 config.xml
一眼看去可以知道語言 UTF-8 、 Pluging 相依套件,若遷移的 Jenkins 語系不同會發生錯誤、套件不支援也會發生錯誤
因此 建議手動 搬遷,讓 Ubuntu 的 Jenkins 自動產出新的設定值
手動重建的項目會直接忽略,會依序對這些項目做搬移說明:
1. Views 視景 | 直接將 config.xml 檔案複製 |
2. Users 帳號 | 將 users 資料夾全部複製 |
以下 2 項會在 第四部分:建立可復現的 Jenkins 容器 說明:
1. Plugins 外掛插件 | 透過 plugin.txt 安裝 |
2. Tools 工具配置 | DockerFile 安裝 |
為了確保 Jenkins 容器可建置 DotNet Core,首先要進入 Jenkins 容器中
docker exec -u root -it {你的 Jenkins 容器 ID} bash
並且安裝 DotNet Core,依序執行:
curl -O https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb
dpkg -i packages-microsoft-prod.deb
apt-get update
apt-get install -y apt-transport-https
apt-get install -y dotnet-sdk-8.0
全部安裝完後,可以在容器內輸入以下檢查:
dotnet -v
為了確保 Jenkins 容器權限足夠,可以用 root 權限啟動容器:
備註:依照實際情況使用,若為開發環境 100% 可以這樣配置
docker run -d --name jenkins --user root --rm -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts
將舊版 Jenkins (Windows)機器下的 config.xml 進行複製,檔案路徑 :
您的安裝目錄\\jenkins\\config.xml
直接覆蓋貼上
可以看到 Views 會出現,完成了 Views 的遷移
再次提醒:若有安裝大量 Views 插件,仍有可能因為 Windows -> Ubuntu 造成異常,出現 Jenkins OOPS!
將舊版 Jenkins (Windows)機器下的 users 資料夾全部複製,檔案路徑 :
您的安裝目錄\\jenkins\\users\\
全部直接覆蓋貼上,複製的時候注意 admin 帳號,也會被取代
可以從Jenkins管理 -> 使用者設定 看到所以舊版 Jenkins (Windows)機器的所有使用者帳號
再次提醒:這個方法是有可能造成以下狀況,輸入相同帳號密碼無法登入,原因為新舊版、作業系統上加密方式有差異,因此解密會異常
在 Ubuntu 宿主機上,開啟一個資料夾並且建立 dockerfile 與 docker-comopese.yml 檔案
※內容可從範例腳本
此腳本實現了以下:
其中 Tools 工具
1. Jenkins 版本固定,容器化始終用 2.452.2 |
2. 此為 Tools 工具配置,在 Jenkins Pluging 只有支援 dotnet 5.0 ,因此需要安裝自行安裝 8.0 SDK |
3. 複製 plugins.txt 自動安裝所需插件,並且會執行 jenkins-plugin-cli |
4. 使用時區 - 亞洲上海時區(同台灣) |
FROM jenkins/jenkins:2.452.2
USER root
RUN curl -O https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb && \
dpkg -i packages-microsoft-prod.deb && \
apt-get update && \
apt-get install -y apt-transport-https && \
apt-get install -y dotnet-sdk-8.0
COPY plugins.txt /usr/share/jenkins/ref/plugins.txt
RUN jenkins-plugin-cli --plugin-file /usr/share/jenkins/ref/plugins.txt
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone
USER jenkins
補充:Microsoft 不支援 Jenkins 的 Plugin 安裝 dotnet 8.0 SDK ,停留在 5.0
此腳本實現了以下:
1. build : 使用 Dockerfile |
2. 容器映射宿主機 8080 Port 與 50000 Port |
3. 掛載 volumes 將容器內的 /var/jenkins_home 掛載到宿主機啟動的根目錄(動態配置) |
version: '3.8'
services:
jenkins:
container_name: Jenkins
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
- "50000:50000"
volumes:
- jenkins_home:/var/jenkins_home
- ./jenkins_root:/container_root
restart: unless-stopped
volumes:
jenkins_home:
舊版 Jenkins (Windows)機器進入 Jenkins管理 -> Scripts 控制台
輸入以下 Goovy Script
def plugins = Jenkins.instance.pluginManager.plugins
plugins.each {println "${it.getShortName()}:${it.getVersion()}"}
將產生的內容,依照自己新的 Jenkins 機器所需要的插件,進行複製
複製並且貼上,格式符合 :
插件名稱:版本號
進入安裝範例檔案(docker-compose.yml)的根目錄下
cd /home/containerbuild
依序輸入以下指令安裝啟動
先關閉舊的安裝 (如果有安裝過的話)
docker compose donw -v
執行安裝
docker compose up -d
啟動完成後,輸入網址列訪問
http://{你的機器IP}:8080
預設需要輸入 secret 做 admin 權限的登入,下一個 Step 說明如何取得容器化內的 initalAdminPassword
輸入以下指令找出產生的掛載位置
docker inspect Jenkins
進入新容器的宿主機此資料位置
複製金鑰,並且繼續登入 完成 Step 3. 的工作
登入後,因為第一次登入,會跳出插件安裝,直接選擇右上角的 X ,因為已經在 dockerFile 步驟中完成
可以到 Jenkins管理 -> Plugins 配置 -> 可檢查到舊版Windows 的插件已經出現到新版的Ubuntu Jenkins 中
也可直接檢查容器掛載的 Plugins 資料夾,也都會自動安裝所有 plugins.txt 清單中的套件