90DaysOfDevOps 第 71 天:認識 Jenkins——以開源自動化伺服器串起 CI/CD 流程
发布时间:2026/10/9 1:20:24 锦皓数字建站

文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载Jenkins 是現代 DevOps 環境中最具代表性的持續整合Continuous IntegrationCI工具之一本篇文章以 90DaysOfDevOps 挑戰第 71 天的學習筆記為主軸完整介紹 Jenkins 的定位、兩種程式碼整合方式、核心特性、Pipeline 概念與七步驟架構運作流程並結合本倉庫2022/Days/CICD/Jenkins/目錄下的實際部署配置說明如何在 minikube Kubernetes 環境中透過 Helm Chart 安裝 Jenkins。讀完本篇你將能清楚掌握 Jenkins 為何被視為 CI/CD 工具鏈的樞紐以及從「程式碼提交」到「生產環境釋出」的完整自動化循環。什麼是 JenkinsJenkins 是一個持續整合Continuous Integration工具它讓新寫好的程式碼可以持續地進行開發、測試與部署。簡單來說Jenkins 作為一台CI 伺服器CI Server負責接管程式碼提交之後的測試與建置流程將過去需要人工作業的整合過程自動化。在 第 70 天CI/CD 管線總覽 中我們已經從宏觀角度認識了 CI/CD Pipeline 是現代 DevOps 環境的骨幹它透過自動化建置、測試與部署填補了開發與維運之間的鴻溝。而 Day 71 則正式進入工具層面把目光聚焦在 Jenkins 這套具體的 CI 工具上。要達成程式碼的持續整合主要有兩種做法做法一夜間建置Nightly Builds——傳統整合方式開發人員在白天各自開發手上的任務到了設定的時間點把變更全部推送到原始碼儲存庫Source Code Repository接著在夜間執行單元測試與軟體建置。這種「先各自開發、再集中整合」的方式被視為整合所有程式碼的舊方法問題通常要等到隔天早上才會被發現回饋週期長、風險集中。做法二持續開發Continuous Development——推薦做法開發人員仍然隨時把變更提交Commit到原始碼儲存庫但差別在於一旦程式碼提交完成建置流程便會立刻被觸發形成持續不斷的整合循環。以上兩種方法背後的核心訴求是當開發團隊分散在全球各地時不應該存在一個「每天必須停止提交程式碼」的固定時間點。此時 Jenkins 便扮演 CI 伺服器的角色統一控制這些測試與建置流程讓任何時刻的提交都能被驗證。為什麼是 Jenkins——其他 CI 工具的比較第 71 天的筆記同時整理了其他幾套 CI 工具作為對照有助於理解 Jenkins 為何被視為最普遍的選擇以及各家工具的差異TravisCI一套託管式hosted、分散式的持續整合服務用於建置與測試託管在 GitHub 上的軟體專案。Bamboo可平行執行多個建置以加快編譯速度內建連接儲存庫的功能並提供 Ant、Maven 的建置任務。Buildbot開放原始碼的自動化框架用於自動化軟體的建置、測試與釋出流程以 Python 撰寫支援跨平台、分散式與平行執行任務。Apache Gump專門針對 Java 專案設計目標是每晚建置並測試這些 Java 專案確保所有專案在 API 與功能層面上彼此相容。相較之下Jenkins 與上述工具一樣是開放原始碼但它是一套以 Java 撰寫的自動化伺服器Automation Server用於透過持續整合自動化軟體開發流程並促成持續交付Continuous Delivery。Jenkins 的核心特性Jenkins 的特性橫跨許多面向第 71 天的筆記重點整理出以下五項安裝容易Easy InstallationJenkins 是自包含self-contained的 Java 應用程式提供 Windows、macOS 與 Linux 的安裝套件下載後即可執行。設定容易Easy Configuration透過 Web 介面即可輕鬆設定與配置介面內建錯誤檢查error checks與內建說明built-in help大幅降低上手門檻。外掛生態Plug-ins在 Update Centre 中提供大量外掛可與 CI/CD 工具鏈中的許多工具整合例如 Git、Docker、Kubernetes 等。可擴展Extensible除了現成外掛Jenkins 本身可透過外掛架構持續擴展幾乎提供無限的使用可能。分散式DistributedJenkins 可輕鬆將工作分散到多台機器執行加速跨平台的建置、測試與部署。Jenkins Pipeline從提交到部署的自動化流程「Pipeline管線」這個詞在 CI/CD 的宏觀討論中我們已經見過多次但在 Day 71 開始進入具體工具層面你把程式碼提交給 JenkinsJenkins 會建置你的應用程式、執行所有自動化測試並在每個步驟完成後釋出與部署程式碼——Jenkins 正是讓這個過程自動化的關鍵。這一條管線本質上涵蓋了 CI建置 測試與 CD釋出 部署兩個階段Jenkins 在其中充當編排者Orchestrator串起整條工具鏈。Jenkins 架構從 commit 到 production 的七個步驟Jenkins 可以安裝在許多不同的作業系統上Windows、Linux、macOS也支援以 Docker 容器方式部署甚至可以在 Kubernetes 內執行。Day 71 的筆記特別預告後續會嘗試在minikube 叢集中安裝 Jenkins模擬部署到 Kubernetes 的情境這也正是本倉庫2022/Days/CICD/Jenkins/目錄下配置文件的由來。接下來把下方架構圖拆解成七個步驟來理解Step 1開發人員把變更提交到原始碼儲存庫。Step 2Jenkins 定期檢查儲存庫拉取任何新程式碼。Step 3建置伺服器把程式碼建置成可執行檔——在此例中使用Maven作為知名的建置伺服器這也是一個值得深入的主題。Step 4若建置失敗回饋Feedback會送回給開發人員。Step 5Jenkins 將建置好的應用程式部署到測試伺服器——在此例中使用Selenium作為知名的測試伺服器同樣值得另闢主題。Step 6若測試失敗回饋會傳遞給開發人員。Step 7若測試成功則可釋出到生產環境Production。這個循環是持續不斷的正是這種自動化循環讓應用程式可以在「幾分鐘」內完成更新而不是耗費數小時、數天、數月甚至數年Master-Slave 架構與企業級版本Jenkins 的架構遠不止於此它具備Master-Slave主從能力讓 Master 可以把任務分配distribute給 Slave 的 Jenkins 環境執行這正是前述「分散式Distributed」特性的底層支撐。此外由於 Jenkins 是開放原始碼專案許多需要商業支援的企業會尋求CloudBees這套 Jenkins 的企業版——它為付費企業客戶帶來技術支援以及其他可能的功能。筆記中以Bosch博世作為實際客戶案例的參考。在本專案中的實戰minikube 上的 Jenkins 部署Day 71 筆記預告了「在 minikube 叢集中安裝 Jenkins 模擬 Kubernetes 部署」的計畫而本倉庫的 2022/Days/CICD/Jenkins/ 目錄恰好保留了這套完整部署的實作配置可以作為理解 Jenkins 架構的絕佳佐證。部署步驟一覽2022/Days/CICD/Jenkins/steps.md 記錄了完整的部署步驟以下為整理後的精簡命令序列啟動本機叢集minikube start建立命名空間kubectl create namespace jenkins或kubectl create -f jenkins-namespace.yml確認命名空間kubectl get namespaces加入官方 Helm Chart 儲存庫helm repo add jenkinsci https://charts.jenkins.io與helm repo update套用持久化儲存與服務帳號kubectl apply -f jenkins-volume.yml、kubectl apply -f jenkins-sa.yml透過 Helm 安裝helm install jenkins -n jenkins -f jenkins-values.yml $chart修正 PV 目錄權限minikube ssh後執行sudo chown -R 1000:1000 /data/jenkins-volume重啟 Pod 使權限生效kubectl delete pod jenkins-0 -n jenkins接著kubectl get pods -n jenkins -w觀察啟動取得管理員密碼kubectl exec --namespace jenkins -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/chart-admin-password開放本機存取kubectl --namespace jenkins port-forward svc/jenkins 8080:8080開啟瀏覽器登入http://localhost:8080執行外掛更新配套的 Kubernetes 資源檔這套部署並非單一命令而是由多個 YAML 資源共同組成各自扮演架構圖中的一環jenkins-namespace.yml建立名為jenkins的獨立 Namespace讓 Jenkins 及其 Agent 與叢集其他資源隔離。jenkins-volume.yml定義一個 20Gi 的 PersistentVolumestorageClassName: jenkins-pv、accessModes: ReadWriteOnce、persistentVolumeReclaimPolicy: Retain透過 hostPath 掛載到節點的/data/jenkins-volume/。這保證 Jenkins 的$JENKINS_HOME預設/var/jenkins_home在 Pod 重建後仍能保留組態與 Job 資料呼應架構中「建置資料需要持久化」的需求。jenkins-sa.yml建立 ServiceAccount、ClusterRole 與 ClusterRoleBinding授予 Jenkins 對 pods、deployments、statefulsets、configmaps、secrets、persistentvolumeclaims 等資源的完整操作權限。這正是 Jenkins 能在 Kubernetes 內部動態調度 Agent Pod 的權限基礎也是「Master 把任務分配給 Slave」架構在 K8s 上的具體實現。jenkins-values.ymlJenkins Helm Chart 的自訂值檔重點包含controller.image: jenkins/jenkins、tagLabel: jdk11、servicePort/targetPort: 8080、serviceType: ClusterIPminikube 情境可改 NodePortrunAsUser: 1000與fsGroup: 1000以非 root 的jenkins使用者執行對應到jenkins/jenkins官方映像內建的使用者installPlugins預先安裝kubernetes:1.31.3、workflow-aggregator:2.6、git:4.10.2、configuration-as-code:1.55.1等外掛佐證了筆記中「外掛生態豐富、可與 CI/CD 工具鏈整合」的特性JCasC.securityRealm以 Configuration-as-Code 方式定義本地使用者admin / chart-admin-password體現「設定容易、Web 介面 聲明式配置」的設計persistence.storageClass: jenkins-pv、size: 8Gi與前面手動建立的 PV 對應agent區塊定義 Agent 映像jenkins/inbound-agent:4.11.2-4與資源限制呼應 Master-Slave / 分散式執行架構。一份真實的 Jenkins Pipeline 範例目錄下的 2022/Days/CICD/Jenkins/Pipeline/Jenkinsfile 是一份可直接對照筆記概念的 Declarative PipelinepodTemplate(yaml: apiVersion: v1 kind: Pod spec: containers: - name: maven image: maven:3.8.1-jdk-8 command: [sleep] args: [99d] - name: kaniko image: gcr.io/kaniko-project/executor:debug command: [sleep] args: [9999999] volumeMounts: - name: kaniko-secret mountPath: /kaniko/.docker restartPolicy: Never volumes: - name: kaniko-secret secret: secretName: dockercred items: - key: .dockerconfigjson path: config.json ) { node(POD_LABEL) { stage(Clone Repository) { git url: https://github.com/MichaelCade/Jenkins-HelloWorld.git, branch: main container(maven) { stage(Build Image) { sh echo Tests passed } } } stage(Test Image) { container(kaniko) { stage(Build Hello World App) { sh /kaniko/executor --context pwd --destination michaelcade1/helloworld:1.0 } } } } }從這份檔案可以清楚看到 Jenkins Pipeline 的實際樣貌它透過podTemplate定義一個包含Maven建置與Kaniko建置 Docker 映像兩個容器的 Agent Pod然後以stage劃分「Clone Repository → Build Image → Test Image → Build Hello World App」等階段——這正是 Day 71 架構圖中「建置伺服器Maven」與「測試/打包」環節在真實專案中的落地。配套的 Pipeline/Dockerfile一個基於 busybox 的簡易 HTTP 伺服器映像預設埠 8000提供 Hello World 頁面與 Pipeline/index.html 則是這個被建置與部署的示範應用程式本身。總結第 71 天的重點可以歸納為Jenkins 是 CI 工具與自動化伺服器用於持續開發、測試與部署新寫的程式碼讓分散在全球的開發團隊不必受制於固定的提交時間。兩種整合方式夜間建置舊方法vs 提交即觸發的持續開發推薦做法Jenkins 正是後者落地執行的 CI 伺服器。特色鮮明安裝容易、Web 介面配置、外掛生態豐富、可擴展、分散式執行。七步驟架構循環commit → Jenkins 拉取 → Maven 建置 → 失敗回饋 → Selenium 測試 → 失敗回饋 → 成功釋出至生產讓應用程式得以在分鐘級完成更新。可延伸的部署模型支援 Master-Slave 分散架構也可透過 minikube Helm 在 Kubernetes 內部署本倉庫 2022/Days/CICD/Jenkins/ 目錄保留了完整的部署步驟、Kubernetes 資源檔與 Pipeline 範例可供後續章節與其他工具如 ArgoCD、GitHub Actions串接演練。下一步將在第 72 天 繼續深入 Jenkins 的實作環節。赞分享文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载相关推荐90DaysOfDevOps 第 71 天什么是 JenkinsCI 服务器原理与架构拆解90DaysOfDevOps 第 71 天什么是 JenkinsCI 服务器原理与架构拆解 导读本文是 90DaysOfDevOps 学习路线图中 CI/文档/教程90DaysOfDevOps 第 71 天认识 Jenkins——开源的持续集成与持续交付自动化服务器90DaysOfDevOps 第 71 天认识 Jenkins——开源的持续集成与持续交付自动化服务器 本文是 90DaysOfDevOps 学习路线中 CI文档/教程90DaysOfDevOps 第 71 天什么是 Jenkins——从 CI 工具定位到 Kubernetes 集群部署实战90DaysOfDevOps 第 71 天什么是 Jenkins——从 CI 工具定位到 Kubernetes 集群部署实战 本篇文章以 90DaysOfD文档/教程上一篇React Scroll 性能优化7个技巧提升滚动体验下一篇深度解析Awesome Prompts项目5个实战技巧提升AI提示工程效率创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。