在當今快速變化的軟體開發領域,微服務架構與敏捷開發模式已成為主流。為了應對頻繁的功能更新、修復與部署需求,自動化成為了提升開發團隊效率與軟體品質的關鍵。持續整合(Continuous Integration, CI)與持續交付/部署(Continuous Deployment, CD)不僅是一種技術,更是一種開發文化的核心實踐。
在這套實踐中,jenkins jenkins 扮演了不可或不可或缺的靈魂角色。它是一款功能強大且極具擴展性的開源自動化伺服器,由 Java 撰寫而成,其前身為昇陽電腦(Sun Microsystems)的 Hudson 專案。憑藉其活躍的社群與數以千計的插件,Jenkins 能夠協助開發人員自動化處理從程式碼提交、建置、測試到最終產品部署的整個生命週期。
本篇文旨在提供一份詳盡且深入的 Jenkins 教學,無論您是初次接觸 CI/CD 的新手,還是希望深化 Jenkins 使用技巧的開發者,都能從中獲益。我們將從核心概念出發,涵蓋安裝設定、專案實作,並逐步引導您建構從簡單到複雜的自動化 Pipeline,最終輔以常見問答集,為您的 Jenkins 學習之旅提供全方位的指引。
Jenkins 與 CI/CD 核心概念
什麼是 Jenkins?
簡單來說,Jenkins 是一個自動化伺服器。它的核心任務是監控並執行一系列重複性的軟體開發任務,將原本需要人工介入的繁瑣步驟轉化為自動化流程。當開發人員將程式碼提交到版本控制系統(如 Git)時,Jenkins 能夠自動觸發後續的一系列動作,例如:
- 程式碼拉取 (Checkout): 從 Git、SVN 等版本控制系統拉取最新的程式碼。
- 編譯與建置 (Build): 執行如 Maven、Gradle、npm 等建置工具,將原始碼編譯成可執行的應用程式或套件。
- 自動化測試 (Test): 執行單元測試、整合測試等,確保產品品質。
- 程式碼品質分析 (Code Analysis): 整合 SonarQube 等工具,檢測潛在的 bug、安全漏洞和程式碼風格問題。
- 封裝與部署 (Package & Deploy): 將建置好的應用程式封裝成 Docker 映像檔,並執行自動化部署到開發、測試或生產環境。
為何選擇 Jenkins?
市面上有許多 CI/CD 工具,但 Jenkins 之所以能歷久不衰,穩坐龍頭地位,主要歸功於以下幾點優勢:
- 開源與龐大社群: Jenkins 完全免費,並擁有全球最活躍的開發者社群之一。這意味著快速的版本迭代、豐富的學習資源以及遇到問題時容易找到解決方案。
- 強大的插件生態系: Jenkins 的核心功能精簡,但其強大之處在於擁有超過一千種以上的插件。無論您使用何種程式語言、框架、雲端平台或工具,幾乎都能找到對應的插件來進行無縫整合。
- 高度靈活性與可擴展性: Jenkins 不僅支援傳統的 Freestyle 專案(透過網頁 UI 設定),更推崇使用 Jenkinsfile 進行「Pipeline-as-Code」(流程即程式碼)的實踐,讓 CI/CD 流程本身也能被版本控制、審核與重用。任何修改都會留下紀錄。
- 分散式建置能力: 透過 Controller-Agent(早期稱為 Master-Slave)架構,Jenkins 可以將建置任務分派到多台代理機器(Agent)上執行。這不僅解決了單一主機的效能瓶頸,還能為不同專案提供隔離且乾淨的建置環境,有效應對大規模團隊的協作需求。
- 視覺化流程與報告: Jenkins Pipeline 提供直觀的階段視圖(Stage View),讓團隊成員能清楚了解每次建置的進度與結果。測試報告、程式碼覆蓋率等也可以透過圖形化方式呈現,一目了然。
安裝與初始設定
安裝 Jenkins 前,請確保您的系統已安裝 Java Development Kit (JDK)。根據近期 Jenkins 與其生態系工具(如 SonarQube)的要求,建議安裝 OpenJDK 17 或更新版本。
安裝方式選擇
您可以根據需求選擇最適合的安裝方式:
1. Docker 容器化部署(推薦)
這是現代開發環境中最推薦的方式,它能提供一個乾淨、隔離且易於管理的運行環境。
docker run -u root --rm -d \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
指令解析:
- -p 8080:8080: 將本機的 8080 連接埠映射到容器的 8080 連接埠(Jenkins Web 介面)。
- -p 50000:50000: 映射 Agent 連線用的連接埠。
- -v jenkins_home:/var/jenkins_home: 將 Jenkins 的主目錄掛載到本機的 Docker volume,確保容器重啟後資料(如設定、專案)不會遺失。
- -v /var/run/docker.sock:/var/run/docker.sock: 允許 Jenkins 容器內部直接呼叫宿主機的 Docker,以便在 Pipeline 中執行 docker build、docker run 等指令。
- jenkinsci/blueocean: 使用官方推薦的映像檔,內建了更現代化的 Blue Ocean 操作介面。
2. 使用作業系統套件庫
您也可以在 Linux 系統上透過套件管理員進行安裝。除了這種方式,官網也提供獨立的安裝檔供下載。以 Ubuntu 為例:
# 安裝 OpenJDK 17
sudo apt update
sudo apt install openjdk-17-jre
# 添加 Jenkins PPA 並安裝
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \
/usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt-get update
sudo apt-get install jenkins
首次啟動與解鎖
安裝完成後,在瀏覽器中開啟 http://您的主機IP:8080。
- 解鎖 Jenkins: 畫面會提示您輸入初始管理員密碼。請在伺服器上執行以下指令取得密碼,並貼到網頁中。
- 若使用 Docker,執行 docker logs <容器名稱或ID>,密碼會顯示在日誌中。
- 若使用套件安裝,執行 sudo cat /var/lib/jenkins/secrets/initialAdminPassword。
- 安裝插件: 選擇「安裝建議的插件 (Install suggested plugins)」。Jenkins 會自動安裝最常用的一系列插件,如 Git、Pipeline 等。
- 建立第一位管理員使用者: 設定您的管理員帳號與密碼,即可完成初始設定,並進入 Jenkins 主畫面。
實戰演練:建構你的第一個 Pipeline
Jenkins 提供了多種專案類型,其中最主要的是 Freestyle project 和 Pipeline。
特性 | Freestyle (自由風格) 專案 | Pipeline (管線) 專案 |
---|---|---|
設定方式 | 透過網頁 UI 介面點擊與填寫表單 | 透過撰寫 Jenkinsfile 腳本 (Groovy 語法) |
核心理念 | UI-Driven (使用者介面驅動) | Code-Driven (程式碼驅動) |
優點 | 直觀易上手,適合簡單、固定的任務 | 流程即程式碼 (Pipeline-as-Code),可版本控制、可重用、可審核、更強大靈活 |
缺點 | 不易版本控制,複製與遷移複雜 | 需要學習 Groovy 語法,有一定學習曲線 |
適用場景 | 簡單的自動化工作 | 所有正式的 CI/CD 流程,特別是複雜的多階段流程 |
我們強烈建議所有新的 CI/CD 工作都使用 Pipeline 專案,這是現代 Jenkins 的最佳實踐。
Lab 1: 建立第一個 Pipeline 專案
我們將以一個簡單的 Python Flask 專案為例,將其打包成 Docker 映像檔並執行,最終交付給客戶。
準備工作:
在您的 GitHub 建立一個新的 Repository,並加入以下兩個檔案:
app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, Jenkins Pipeline!'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
Dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY . .
RUN pip install Flask
CMD ["python", "app.py"]
Lab 2: 撰寫 Jenkinsfile
在您的專案根目錄下,建立一個名為 Jenkinsfile 的檔案(沒有副檔名),這個檔案就是一份純文字文件。並貼上以下內容:
// pipeline 關鍵字宣告了這是一個宣告式的 Pipeline,其語法結構受到許多英美開發者的喜愛
pipeline {
agent any // 指定此 pipeline 可在任何可用的 agent 上執行
stages {
stage('Checkout') { // 第一階段:拉取程式碼
steps {
git 'https://github.com/您的帳號/您的專案.git' // 替換成您的專案 URL
}
}
stage('Build Docker Image') { // 第二階段:建置 Docker 映像檔
steps {
script {
def imageName = "my-flask-app:${env.BUILD_NUMBER}"
sh "docker build -t ${imageName} ."
}
}
}
stage('Run Docker Container') { // 第三階段:執行 Docker 容器
steps {
script {
def imageName = "my-flask-app:${env.BUILD_NUMBER}"
// 先停止並移除同名舊容器,避免衝突
sh "docker stop my-flask-container || true"
sh "docker rm my-flask-container || true"
sh "docker run -d --name my-flask-container -p 5000:5000 ${imageName}"
}
}
}
stage('Smoke Test') { // 第四階段:執行簡易的測試程式
steps {
sh 'sleep 5' // 等待容器啟動
sh 'curl http://localhost:5000'
}
}
}
post { // 後置處理:無論成功或失敗都會執行的步驟
always {
echo 'Pipeline finished. Cleaning up...'
sh "docker stop my-flask-container || true"
sh "docker rm my-flask-container || true"
}
}
}
Lab 3: 在 Jenkins 中建立 Pipeline 專案
- 回到 Jenkins 儀表板,點擊左側「新增作業 (New Item)」。
- 輸入專案名稱(例如 my-first-pipeline),選擇「Pipeline」,然後點擊「OK」。
- 在設定頁面,向下捲動到 Pipeline 區塊。
- 將 Definition 欄位從 “Pipeline script” 改為 “Pipeline script from SCM”。
- 在 SCM 欄位選擇 “Git”。
- 在 Repository URL 填入您的專案 Git URL。
- 確保 Branch Specifier 是 */main 或您主要分支的名稱。
- Script Path 保持預設的 Jenkinsfile 即可,這代表 Jenkins 會在專案的根位置尋找此檔案。
- 點擊「儲存 (Save)」。
現在,點擊左側選單的「馬上建置 (Build Now)」,Jenkins 將會自動從您的 Git 倉庫拉取 Jenkinsfile 並執行其中定義的 CI/CD 過程!您可以在 Stage View 中看到每個階段的執行狀況。
常見問答集 (FAQ)
問:什麼是 Jenkins?
答:Jenkins 是一種以 Java 撰寫的開源持續整合工具。它是一個自動化伺服器,提供適用於軟體開發的自訂整合服務,可自動化處理建置、測試與部署等重複性任務。
問:為什麼要使用 Jenkins?
答:使用 Jenkins 可以加速軟體開發生命週期 (SDLC)。它能讓您在各種環境中整合建置、部署與測試,有效縮短開發人員的等待時間,並減少人為錯誤。因為能夠實現持續整合,Jenkins 非常適合 DevOps 與敏捷開發模式。
問:為什麼要在 AWS 上執行 Jenkins?
答:AWS 提供可靠、可擴展且安全的基礎設施資源,非常適合執行 Jenkins。在 AWS 上執行 Jenkins,您只需按實際用量付費,還可隨著您的特定需求垂直或水平擴展容量。
問:使用 Jenkins 的費用是多少?
答:Jenkins 本身是免費的開源軟體。您只需要為執行 Jenkins 的底層基礎設施(如 AWS EC2 執行個體、儲存等)支付費用。
問:如何保護 Jenkins 的安全?
答:應至少採取以下措施:
- 網路層級: 使用雲端平台的安全群組(或防火牆),將存取範圍限制在必要的 IP 地址。
- 應用程式層級: 為 Jenkins 使用者設定強式密碼,並啟用權限控管機制。
- 系統層級: 定期更新 Jenkins 主程式、所有插件以及伺服器作業系統,以獲取最新的安全性修補程式。
問:如何擴展 Jenkins?
答:主要有兩種方式:
- 垂直擴展: 增加 Jenkins Controller (Master) 主機的硬體規格(如 CPU、記憶體)。這是最直接但有其上限的方法。
- 水平擴展: 建立 Controller-Agent(主從)架構。將建置任務分派給多台 Agent 機器執行,這是最推薦的可擴展方式,能有效分散負載並提供隔離的建置環境。
問:是否可在私有子網路中執行 Jenkins?
答:可以。將 Jenkins 執行個體放置在私有子網路中是更安全的做法。若要從外部網路存取,您需要配置一個負載平衡器(如 Application Load Balancer)作為公有端點;若要從企業內部資料中心存取,則需建立 VPN 或 Direct Connect 連線。
總結
Jenkins 作為 CI/CD 領域的基石,其強大與靈活性無庸置疑。透過本文的引導,您已經了解了 Jenkins 的核心價值、掌握了現代化的 Docker 安裝方式,並親手實踐了從零到一的 Pipeline-as-Code 流程。這只是 Jenkins 世界的開端,真正的威力在於將其與您專案的實際需求相結合。
我們強烈建議您深入探索「Pipeline-as-Code」的理念,將 Jenkinsfile 視為專案的一部分來管理。未來,您可以透過學習參數化建置、使用共享函式庫(Shared Libraries)來重用流程邏輯,以及整合 SonarQube、Artifactory 等更多工具,打造出更為成熟與穩健的自動化體系。自動化是一段持續優化的旅程,而 jenkins 正是這段旅程中最值得信賴的夥伴。