首頁

目前文章總數:190 篇

  

最後更新:2025年 07月 26日

0019. Jenkins 舊專案搬家 + Docker 容器化教學:設定轉移 + 插件自動安裝 (可復現 Jenkins 環境, Reproducible Jenkins Environment)

日期:2025年 07月 12日

標籤: Jenkins Continuous Integration(CI) Continuous Deployment(CD) Docker Docker-Compose Container Ubuntu Linux Windows Jenkins DotNETSDK

摘要:Jenkins


應用所需:1. jenkins 主機
     2. 已安裝 Docker-Compose Ubuntu 主機
解決問題:1. 將舊版 Jenkins (Windows)機器上的資料轉移到新機器的新版 Jenkins(Ubuntu 容器化) ,並且建議安全的做法來完整保存使用者、憑證與 Plugin 設定
     2. 打造可復現的 Jenins CI/CD 容器化環境,實現 Reproducible Jenkins Environment 達到任何人的機器執行容器化都有相同的 Jenkins 基本配置
範例專案:範例腳本
基本介紹:本篇分為 5 大部分。
第一部分:問題描述
第二部分:各轉移項目 - 安全的做法
第三部分:舊版遷移到新版 Jenkins
第四部分:建立可復現的 Jenkins 容器
第五部分:DEMO 成果 - 可復現容器






第一部分:問題描述

Step 1:舊版遷移到新版 Jenkins - 遭遇問題

需求上,會需要將舊版的 Windows Jenkins 機器淘汰,轉移到新版 Jenkins 並且使用 Ubuntu 作業系統安裝




此時不可能讓我們直接將舊的 Windows Jenkins 的所有內容貼上到Jenkins(Ubuntu 容器化) 的新機器上
首先面臨的問題就是作業系統不同版本差異 ,這就是要克服的部分。將在第二、第三部分說明

Step 2:建立可復現的 Jenkins 容器 - 目的

可復現容器是適合 團隊協作、CI/CD 穩定性與環境一致性需求強的場景
並且實現後有以下好處(目的):

1. 環境一致性 預設 job、agent、pipeline 設定等,以及減少 「在我的機器上可以跑」 的問題。
2. 快速重建與災難復原 出現故障或誤刪後,可以用 Docker + 設定檔重建一模一樣的 Jenkins 環境。
3. 可攜性與可遷移性 可以把 Jenkins 容器部署到任何一台裝有 Docker 的機器
4. 支援多環境部署 可在 dev/staging/prod 各環境建立獨立但一致的 Jenkins 部署,便於測試與上線前驗證


可以避免大量的重工 & 排查不同環境下的問題 & 可攜性 & 支援多環境部署




第二部分:各轉移項目 - 安全的做法

Step 1:版本落差太大 - 跨平台遷移的風險

以下是基本跨平台 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 找不到可執行檔。




Step 2:版本落差太大 & 需遷移的內容 - 安全的作法

基於風險上的描述後,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版本下,複製可搬移的方案才是最有可能的


Step 3:補充說明 - 以 Job 舉例,為何建議手動

我們隨意開啟舊版 Jenkins (Windows)機器下的 Job 目錄的作業中的 config.xml
一眼看去可以知道語言 UTF-8 、 Pluging 相依套件,若遷移的 Jenkins 語系不同會發生錯誤、套件不支援也會發生錯誤
因此 建議手動 搬遷,讓 Ubuntu 的 Jenkins 自動產出新的設定值




第三部分:舊版遷移到新版 Jenkins

Step 1:搬移項目說明

手動重建的項目會直接忽略,會依序對這些項目做搬移說明:

1. Views 視景 直接將 config.xml 檔案複製
2. Users 帳號 將 users 資料夾全部複製


以下 2 項會在 第四部分:建立可復現的 Jenkins 容器 說明:

1. Plugins 外掛插件 透過 plugin.txt 安裝
2. Tools 工具配置 DockerFile 安裝



Step 2:確保 Jenkins 容器可執行 - dotnet 已安裝

為了確保 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



Step 5:確保 Jenkins 容器可執行 - 權限足夠

為了確保 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


Step 6:Views 視景 - 將 config.xml 檔案複製 - 複製來源

將舊版 Jenkins (Windows)機器下的 config.xml 進行複製,檔案路徑 :

您的安裝目錄\\jenkins\\config.xml




Step 7:Views 視景 - 將 config.xml 檔案複製 - 覆蓋目標

直接覆蓋貼上


Step 8:Views 視景 - DEMO成果 - Views 建構完成

可以看到 Views 會出現,完成了 Views 的遷移
再次提醒:若有安裝大量 Views 插件,仍有可能因為 Windows -> Ubuntu 造成異常,出現 Jenkins OOPS!


Step 9:Users 帳號 - 將 users 資料夾全部複製 - 複製來源

將舊版 Jenkins (Windows)機器下的 users 資料夾全部複製,檔案路徑 :

您的安裝目錄\\jenkins\\users\\




Step 10:Users 帳號 - 將 users 資料夾全部複製 - 覆蓋目標

全部直接覆蓋貼上,複製的時候注意 admin 帳號,也會被取代


Step 11:Views 視景 - DEMO果 - Users 帳號建立完成

可以從Jenkins管理 -> 使用者設定 看到所以舊版 Jenkins (Windows)機器的所有使用者帳號



再次提醒:這個方法是有可能造成以下狀況,輸入相同帳號密碼無法登入,原因為新舊版、作業系統上加密方式有差異,因此解密會異常




第四部分:建立可復現的 Jenkins 容器

Step 1:新機器上 - 建立 DockerFile 與 DockerCompose

在 Ubuntu 宿主機上,開啟一個資料夾並且建立 dockerfiledocker-comopese.yml 檔案
※內容可從範例腳本


Step 2:新機器上 - Tools 工具配置 - DockerFile 腳本

此腳本實現了以下:
其中 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


Step 3:新機器上 - Tools 工具配置 - DockerCompose 腳本

此腳本實現了以下:

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:



Step 4:舊機器上 - Plugins 外掛插件 - 進入控制台

舊版 Jenkins (Windows)機器進入 Jenkins管理 -> Scripts 控制台


Step 5:舊機器上 - Plugins 外掛插件,取得 txt 檔案

輸入以下 Goovy Script

def plugins = Jenkins.instance.pluginManager.plugins 
plugins.each {println "${it.getShortName()}:${it.getVersion()}"}



Step 6:舊機器上 - Plugins 外掛插件 - 複製所需插件

將產生的內容,依照自己新的 Jenkins 機器所需要的插件,進行複製


Step 7:Plugins 外掛插件 - 建立 plugins.txt 檔案

複製並且貼上,格式符合 :

插件名稱:版本號






第五部分:DEMO 成果 - 可復現容器

Step 1:進入新機器,並到可復現的資料集合目錄下

進入安裝範例檔案(docker-compose.yml)的根目錄下

cd /home/containerbuild



Step 2:安裝 docker-compose

依序輸入以下指令安裝啟動
先關閉舊的安裝 (如果有安裝過的話)

docker compose donw -v


執行安裝

docker compose up -d




Step 3:登入新機器容器化的 Jenkins - 首次登入

啟動完成後,輸入網址列訪問

http://{你的機器IP}:8080


預設需要輸入 secret 做 admin 權限的登入,下一個 Step 說明如何取得容器化內的 initalAdminPassword


Step 4:首次登入 - 找出 Volumes 位置

輸入以下指令找出產生的掛載位置

docker inspect Jenkins




Step 5:首次登入 - 進入 Volumes 位置 - 取得 secret

進入新容器的宿主機此資料位置


複製金鑰,並且繼續登入 完成 Step 3. 的工作


Step 6:首次登入 - 開始使用 - 跳過設置插件

登入後,因為第一次登入,會跳出插件安裝,直接選擇右上角的 X ,因為已經在 dockerFile 步驟中完成


Step 7:檢查插件 - 可復現容器化 Jenkins - 完成

可以到 Jenkins管理 -> Plugins 配置 -> 可檢查到舊版Windows 的插件已經出現到新版的Ubuntu Jenkins 中


也可直接檢查容器掛載的 Plugins 資料夾,也都會自動安裝所有 plugins.txt 清單中的套件