一、什么是 Jenkins
????????Jenkins 是一個功能強大的應用程序,允許持續集成和持續交付項目(持續部署),無論用的是什么平臺。這是一個免費的源代碼,可以處理任何類型的構建或持續集成。集成 Jenkins 可以用于一些測試和部署技術。
Jenkins 原名 Hudson,2011 年改為現在的名字,它是一個開源的實現持續集成的軟件工具。官方網站網址:https://jenkins.io/ 。Jenkins 能實時監控持續集成過程中所存在的問題,提供詳細的日志文件和提醒功能,還能通過圖表的形式,形象地展示項目構建的趨勢和穩定性。
Jenkins 是一個開源軟件項目,是基于 Java 開發的一種持續集成工具,用于監控持續重復的工作,旨在提供一個開放易用的軟件平臺,使軟件項目可以進行持續集成。
jenkins 提供了一種易于使用的持續集成系統,使開發者從繁雜的集成中解脫出來,專注于更為重要的業務邏輯實現上。同時 Jenkins 能實時監控集成中存在的錯誤,提供詳細的日志文件和提醒功能,還能用圖表的形式形象地展示項目構建的趨勢和穩定性。
Jenkins 可以構建一個自動化的持續集成環境可以使用它來 “自動化” 編譯、打包、分發部署應用,它兼容 ant、maven、gradle 等多種第三方構建工具,同時與 svn、git 能無縫集成,也支持直接與知名源代碼托管網站,如 github、bitbucket 直接集成。1:為什么要用 Jenkins
????????目前持續集成 (CI) 已成為當前許多軟件開發團隊在整個軟件開發生命周期內側重于保證代碼質量的常見做法。它是一種實踐,旨在緩和和穩固軟件的構建過程。并且能夠幫助您的開發團隊應對如下挑戰:
(1) 軟件構建自動化
????????配置完成后,CI 系統會依照預先制定的時間表,或者針對某一特定事件,對目標軟件進行構建。
(2) 構建可持續的自動化檢查
????????CI 系統能持續地獲取新增或修改后簽入的源代碼,也就是說,當軟件開發團隊需要周期性的檢查新增或修改后的代碼時,CI 系統會不斷確認這些新代碼是否破壞了原有軟件的成功構建。這減少了開發者們在檢查彼此相互依存的代碼中變化情況需要花費的時間和精力 (說直接一點也是錢啊,呵呵)。
(3) 構建可持續的自動化測試
????????構建檢查的擴展部分,構建后執行預先制定的一套測試規則,完成后觸發通知 (Email,RSS 等等) 給相關的當事人。
(4) 生成后后續過程的自動化
????????當自動化檢查和測試成功完成,軟件構建的周期中可能也需要一些額外的任務,諸如生成文檔、打包軟件、部署構件到一個運行環境或者軟件倉庫。這樣,構件才能更迅速地提供給用戶使用。
2、Jenkins 的特點
特點 描述 易安裝 從官網僅需下載一個 jenkins.war 文件后,直接運行,無需額外安裝,更無需安裝數據庫 易配置 提供友好的 GUI 配置界面 變更支持 能從代碼倉庫(SVN/Git)中獲取并產生代碼更新列表,并顯示到編譯輸出信息中 支持永久鏈接 用戶通過 Web 訪問 Jenkins,Web 頁面鏈接地址是永久鏈接地址,可在各種文檔中直接使用該鏈接 集成 E-Mail/RSS/IM 完成一次集成后,可通過這些工具實時收取集成結果(構建集成需花費一定時間,有此功能可在等待結果時干別的事 ) JUnit/TestNG 測試報告 以圖表等形式提供詳細的測試報表功能 支持分布式構建 可以把集成構建等工作分發到多臺計算機中完成 文件指紋信息 會保存構建集成所產生的 jars 文件、集成構建使用了哪個版本的 jars 文件等構建記錄 支持第三方插件 支持第三方插件,使 Jenkins 功能變得越來越強大 二、什么是 CI/CD
????????持續集成 (Continuous integration) 是一種軟件開發實踐,即團隊開發成員經常集成它們的工作,通過每個成員每天至少集成一次,也就意味著每天可能會發生多次集成。每次集成都通過自動化的構建(包括編譯,發布,自動化測試)來驗證,從而盡早地發現集成錯誤。
????????持續部署(continuous deployment)是通過自動化的構建、測試和部署循環來快速交付高質量的產品。某種程度上代表了一個開發團隊工程化的程度,畢竟快速運轉的互聯網公司人力成本會高于機器,投資機器優化開發流程化相對也提高了人的效率,讓 engineering productivity 最大化。
????????持續交付(Continuous delivery),是一種軟件工程手法,讓軟件產品的產出過程在一個短周期內完成,以保證軟件可以穩定、持續的保持在隨時可以釋出的狀況。它的目標在于讓軟件的建置、測試與釋出變得更快以及更頻繁。這種方式可以減少軟件開發的成本與時間,減少風險。
CICD 是 持續集成(Continuous Integration,簡稱 CI ) 和 持續交付 / 持續部署(Continuous Delivery/Continuous Deployment,簡稱 CD ) 的合稱,是一套自動化流程體系,幫你高效、穩定地把代碼變成可用的軟件,下面結合你給的流程圖,拆解講講 :
1、持續集成(CI)—— 解決 “代碼整合沖突、盡早發現問題”流程邏輯:
????????程序員在本地開發(比如用 IDEA 寫代碼),寫完提交到「版本控制服務器」(像 Git/SVN 這類,存著完整代碼庫 )。每次提交后,版本控制里的鉤子程序會觸發操作,給 Jenkins 發通知。Jenkins 收到通知,用 git/svn 插件 拉取最新代碼,再通過 maven 插件 自動編譯、打包(生成 war/jar 這些包)。這一步核心是 “頻繁合并小改動,自動驗證” ,比如多人開發同一個項目,每天多次提交代碼,Jenkins 自動幫你整合、檢查編譯和單元測試是否能過,避免最后合并代碼一堆沖突、問題藏到上線才爆。
價值:
早發現 bug:代碼一提交就自動跑檢查,有問題立刻知道,不用等到上線才返工。
減少合并痛苦:小步提交、頻繁整合,比 “憋大招式開發”(很久才合并代碼)沖突少太多。2、持續交付 / 持續部署(CD)—— 解決 “手動部署繁瑣、發布效率低”
持續交付(Continuous Delivery):
????????Jenkins 打包好 war/jar 包后,會通過 Publish over SSH(遠程執行命令)或 Deploy to container(比如把 war 包丟到 Tomcat 里)這些方式,把包推到測試 / 預發布環境。這一步是 “讓可部署的產物隨時能交付” ,測試團隊可以快速拿到最新包驗證,流程到這一步可能還需要人工點一下 “確認發布到生產”。
持續部署(Continuous Deployment):
是持續交付的 “升級版”,如果流程足夠成熟、自動化測試足夠可靠,Jenkins 打完包直接自動部署到生產環境(比如服務器 1、服務器 2… ),全程不用人工干預。這一步追求 “極致自動化,代碼合并后自動上線” ,適合成熟的高頻迭代項目,像互聯網大廠頻繁發版的業務。
結合流程圖看完整 CICD 閉環:
開發側:程序員在本地寫代碼(工作區 [idea] ),提交到版本控制服務器,觸發 CI 流程。
集成側:Jenkins 自動拉取、打包、驗證,把 “半成品” 變成 “可部署包”,完成 CI。
發布側:包通過自動化手段推到測試 / 生產環境,完成 CD(交付或部署 )。
反饋側:測試、前端等最終使用人員拿到部署好的環境,發現問題又能快速反饋給開發,進入下一輪迭代,形成 “開發→集成→部署→反饋→開發” 的閉環。簡單說,CICD 就是用自動化把 “寫代碼→上線可用” 的鏈路串起來,讓開發更順滑、迭代更快、問題更早暴露,特別適合團隊協作、高頻更新的項目(像互聯網應用、 SaaS 系統 )。你可以理解成 “把手動干的‘代碼整合、打包、部署’這些重復活,交給機器自動做,人只聚焦寫業務邏輯” ,效率和穩定性都會飛升~
三、部署GitLab
1、基礎環境配置
(1) 關閉防火墻及內核
hostnamectl set-hostname gitlab bash systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
(2) 解壓并安裝
tar zxf gitlab-ce-17.8.2.rpm.tar.gz cd gitlab-ce-17.8.2.rpm ls dnf -y install gitlab-ce-17.8.2-ce.0.el9.x86_64.rpm
(3) 修改配置文件
vim /etc/gitlab/gitlab.rb
?
external_url 'http://192.168.10.105'
?是 GitLab 配置中的核心參數,用于指定 GitLab 服務對外提供訪問的基礎 URL
(4) 解決版本兼容問題
ln -s /usr/lib64/libcrypt.so.1 /usr/lib64/libcrypt.so.2
具體來說:
libcrypt.so
?是系統中負責密碼加密相關功能的共享庫文件- 某些版本的 GitLab(或其依賴的組件)可能編譯時依賴?
libcrypt.so.2
?這個庫文件- 但部分 Linux 系統(如 CentOS 7 等)默認只安裝了?
libcrypt.so.1
(通常是?glibc
?提供的版本)- 通過創建從?
libcrypt.so.1
?到?libcrypt.so.2
?的軟鏈接,可以讓依賴?libcrypt.so.2
?的程序 “誤以為” 找到了所需的庫文件,從而避免因庫版本不匹配導致的啟動失敗或功能異常這個操作本質上是一種兼容處理,在系統庫版本與軟件依賴版本不一致時,通過鏈接方式臨時解決依賴問題。如果系統環境允許,更規范的做法是安裝對應版本的?
libcrypt
?庫(如?libcrypt2
)。2、部署
(1) GitLib初始化
gitlab-ctl reconfigure
(2) 找到初始化密碼
cat /etc/gitlab/initial_root_password EDgqXDTjQnTGv/gMKYyFBS2yfp/BHaHntPA6cQ/e3to=
(3) 登錄
(4) 修改root密碼
四、jenkins部署
1、資源清單
操作系統 配置 主機名 IP openEuler 24.03 2C4G jenkins 192.168.10.104 openEuler 24.03 2C4G gitlab 192.168.10.105 2、基礎環境
hostnamectl set-hostname jenkins bash systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
3、安裝git
dnf -y install git
4、安裝字體庫
dnf -y install fontconfig
5、部署JDK
(1) 解壓并移動到合適位置
tar zxf jdk-11.0.16.1_linux-x64_bin.tar.gz mv jdk-11.0.16.1 /usr/local/java
(2) 設置環境變量
export JAVA_HOME=/usr/local/java export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$PATH
(3) 加載環境變量
source /etc/profile
(4) 查看版本
java -version
6、部署Tomcat
tar zxf apache-tomcat-8.5.56.tar.gz mv apache-tomcat-8.5.56 /usr/local/tomcat
7、部署Meven
(1) 解壓并移動到合適位置
tar zxf apache-maven-3.6.0-bin.tar.gz mv apache-maven-3.6.0 /usr/local/maven
(2) 設置環境變量
export MAVEN_HOME=/usr/local/maven export PATH=$PATH:$MAVEN_HOME/bin
?(3) 加載環境變量
source /etc/profile
(4) 查看版本
mvn -version
(5) 修改配置文件
將Maven倉庫改為國內
vim /usr/local/maven/conf/settings.xml
<mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共倉庫</name><url>https://maven.aliyun.com/repository/public</url> </mirror>
8、部署nodejs(運行時)?
(1) 部署nodejs的依賴環境
dnf -y install gcc automake autoconf libtool
?(2) 解壓并移動到合適位置
tar zxf node-v14.18.0-linux-x64.tar.gz mv node-v14.18.0-linux-x64 /usr/local/nodejs14
(3) 優化路徑并查看版本
ln -s /usr/local/nodejs14/bin/* /usr/local/bin node -v
(4) 查看node包管理工具(構建工具)
npm -v
9、部署jenkins
mv jenkins.war /usr/local/tomcat/webapps/ cd /usr/local/tomcat/webapps/ ls /usr/local/tomcat/bin/startup.sh
10、設置Jenkins插件更新源
cd cd .jenkins/updates/ sed -i 's/https:\/\/www.jenkins.io/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json sed -i 's/https:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
11、找到初始密碼
cat /root/.jenkins/secrets/initialAdminPassword
12、登錄Jenkins
13、安裝插件(選離線)
14、跳過在線安裝插件
15、創建管理員用戶生成永久鏈接
16、開始使用
17、后續如需安裝插件
18、拉取本地插件(原先下載好的)
19、然后重啟 Jenkins
/usr/local/tomcat/bin/shutdown.sh /usr/local/tomcat/bin/startup.sh
重新查看插件是否已經被添加
20、安裝JDK
21、安裝Maven
22、安裝NodeJS
五、Jenkins角色與權限管理
????????我們可以利用Role-basedAuthorization Strategy 插件來管理 Jenkins 用戶權限,在前面的插件安裝中已經安裝過此插件。
1、全局安全配置
“Dashboard”-->“ManageJenkins”-->“Security”-->“Authentication”
將授權策略修改為“Role-Based Strategy”,并保存設置。
2、創建角色
為了更方便的為用戶授權,jenkins 中使用角色作為一類權限的容器。角色是一組相關權限的集合。可以為用戶指定角色,而不是直接指定權限。
(1) 角色種類
Global roles:Global roles(全局角色):管理員等高級用戶可以創建基于全局的角色
Item roles:針對某個或者某些項目的角色
Agent roles:節點相關的權限
(2) 設置角色
“Dashboard”-->“Manage Jenkins”-->“Manage and AssingRoles”。點擊“Manage Roles”
(3) 創建全局角色
????????baseRole:該角色為全局角色。這個角色需要綁定 Overall 下面的 Read 權限,是為了給所有用戶綁定最基本的 Jenkins 訪問權限。注意:如果不給后續用戶綁定這個角色,會報錯誤:用戶名ismissing the Overall/Read permission
(4) 創建項目角色
role1:該角色為項目角色。使用正則表達式綁定"my-item01.*",意思是只能操作名稱為“my-item01”開頭的項目。
role2:該角色也為項目角色。綁定"my-item02.*",意思是只能操作“my-item02”開頭的項目。
為角色分配權限
3、創建用戶
(1) 添加用戶
Dashboard”-->“Manage Jenkins”-->“Users”,在右上角點擊“CreateUser”,創建用戶。
添加兩個用戶zhangsan、lisi
(2) 用戶綁定到角色
????????“Dashboard”-->“Manage Jenkins”-->“Manage and Assign Roles”,然后點擊“Assign Roles”。
為 zhangsan 用戶綁定 baseRole 和 role1 角色
4、創建項目
5、憑證管理
????????有許多第三方網站和應用程序可以與Jenkins 進行交互,例如程序代碼倉庫,云存儲系統和服務等。此類應用程序的系統管理員可以在應用程序中配置憑據以專供 Jenkins 使用。通常通過將訪問控制應用于這些憑據來完成這項工作,以“鎖定”Jenkins 可用的應用程序功能區域。一旦 Jenkins 管理員(即管理 Jenkins 站點的 Jenkins 用戶)在 Jenkins 中添加/配置這些憑據,Pipeline 項目就可以 使用憑據與這些第三方應用程序進行交互。
用管理員登錄到 jenkins。
????????要在 Jenkins 使用憑證管理功能,需要安裝 CredentialsBinding 插件,前面已經安裝過此插件, 這里不再安裝。
????????憑據可以用來存儲需要密文保護的數據庫密碼、Gitlab 密碼信息、Docker 私有倉庫密碼等,以便Jenkins 可以和這些第三方的應用進行交互。
憑據的種類
????????jenkins 提供了多種類型的憑據,適應與不同的業務需求,具體類型如下:
- Username with password:用戶名和密碼
- GitHub App:GitHub 應用進行身份驗證
- GitLab API token:存儲 Gitlab 的用戶API token
- OpenShift Username and password:存儲OpenShift 的用戶名和密碼
- SSH Username with private key: 使用 SSH 用戶和密鑰
- Secret file:需要保密的文本文件,使用時Jenkins 會將文件復制到一個臨時目錄中,再將文件路徑設置到一個變量中,等構建結束后,所復制的 Secret file 就會被刪除。
- Secret text:需要保存的一個加密的文本串,如釘釘機器人或Github 的 api token
- Certificate:通過上傳證書文件的方式
????????其中,常用的憑證類型有:Username with password(用戶密碼)和 SSH Username with private key(SSH 密鑰)。接下來以使用 Git 工具到 Gitlab 拉取項目源碼為例,演示 Jenkins 的如何管理 Gitlab的憑證。
????????注意:為了讓 Jenkins 支持從 Gitlab 拉取源碼,需要安裝 Git 插件以及在 CentOS7 系統上安裝 Git工具。
(1) 憑據的作用范圍
????????憑證具有與它們相關聯的范圍。這是一種表示它們如何才能被暴露的方式。Jenkins使用的主要范圍有如下 2 種。
System(系統)
????????顧名思義,這個范圍與根上下文,也就是Jenkins 系統相關聯。此范圍中的憑證只被暴露給系統和后臺任務,并且一般被用于連接到構建節點或代理節點等。
全局
全局范圍是默認選項,通常用來確保 Jenkins中的任務可以使用憑證。
(2) 添加用戶密碼類型的憑據
添加憑據
????????“Manage jenkins”-->“Credentials”,打開如下頁面,并點擊“System”,進入全局憑據管理界面,如下圖所示。
在如下界面中,點擊右上角的“Add Credentials”按鈕,添加憑據
填寫憑據參數
這里主要的內容有:
憑據類型:Username withpassword
范圍:Global
用戶名:root(該賬號是 gitlab 中添加的賬號)
密碼:gitlab 中為 root 用戶設置的密碼(本案例此處為 pwd12345,注意不是系統的 root 密碼)
ID:選填(設置憑據的唯一標識,不設置會自行分配一個唯一標識)
描述:選填(憑據名稱,此處最好填寫一下,使用憑據的時候便于識別,不設置就使用用戶名)
6、使用憑據
(1) 賬號密碼模式
創建test01任務
(2) 配置源碼管理
登錄gitlab
創建項目
導入一個項目
設置參數
(3)添加SSH類型的憑據
SSH 類型的憑據可以使Jenkins 在拉取gitlab 中的代碼時使用秘鑰對的方式,不僅實現了免密連接,同時也會對數據進行加密,是一種安全可靠的憑據方式。
在 jenkins 主機上以root 身份生成密鑰對
ssh-keygen cd cd .ssh/ ls cat id_ed25519.pub cat id_ed25519
公鑰
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHA8FJ6slmXppZahXmTtq/MLWLU9rBWIszNs2W7lE7EB root@jenkins
私鑰
-----BEGIN OPENSSH PRIVATE KEY----- b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW QyNTUxOQAAACBwPBSerJZl6aWWoV5k7avzC1i1PawViLMzbNlu5ROxAQAAAJA1NAuONTQL jgAAAAtzc2gtZWQyNTUxOQAAACBwPBSerJZl6aWWoV5k7avzC1i1PawViLMzbNlu5ROxAQ AAAEAd5GuCXddppIoVcfLDaM4Gy3b7DznVapqX6rD2Rv8n3XA8FJ6slmXppZahXmTtq/ML WLU9rBWIszNs2W7lE7EBAAAADHJvb3RAamVua2lucwE= -----END OPENSSH PRIVATE KEY-----
將公鑰存放的gitlab
????????用 root 用戶登錄 gitlab,點擊右上角的頭像,在下拉菜單中點“preferences”,然后在左側列表點擊“SSH Keys”。
在Jenkins種添加SSH憑據
“Manage jenkins”-->“Credentials”,打開如下頁面,并點擊“System”,進入全局憑據管理界
添加憑據參數
這里主要的參數有:
類型:SSH
范圍:Global
ID:可選
描述:可選
Username:root(這個秘鑰對是用 root 的身份生成的)
Private Key:填寫 root 生成的私鑰。
創建test02任務
配置源碼管理
????????如果報一下錯誤可以使用Jenkins節點手動使用ssh登錄一下
????????在使用秘鑰對時,要提前在 jenkins 主機上生成 gitlab 主機的 fingerprint,否則,此處會提示錯誤。錯誤信息如下:
????????第一次連接的話可以看到提示: “Are yousure you want to continue connecting (yes/no)? yes”,輸入 yes 并回車即可生成 gitlab 主機的 fingerprint。
發布結果