目錄
Jenkins詳解
一、Jenkins介紹
1、Jenkins 功能
2、Jenkins 概念
3、Jenkins 目的
4、Jenkins 特性
5、產品發布流程
二、Jenkins CI/CD 流程
三、部署Jenkins
git
1、jenkins 安裝
yum 安裝 jenkins *jenkins 依賴 java 環境 #注意2.346之后的版本不再支持jdk8
2、配置文件
1、查詢 yum 下載 Jenkins 安裝的文件
2、修改配置文件
3、啟動 jenkins
3、驗證安裝
3、jenkins配置(web頁面)
1、管理員密碼獲取
2、安裝插件 (選擇在線安裝)
1、修改 /var/lib/jenkins/updates/default.json
2、 修改/var/lib/jenkins/hudson.model.UpdateCenter.xml
3、創建第一個管理員用戶
4、url 配置
5、安裝完成
6、配置 jdk、git、maven
7、jenkins 下載插件失敗處理辦法
四、使用Jenkins
1、Jenkins 用戶權限管理
1、 用戶管理背景
2、 安裝用戶管理插件
3、 開啟該插件功能
4、 驗證用戶管理
1、策略改回原來的(全局安全配置)
2、開啟允許用戶注冊(全局安全配置)
3、注冊一個新用戶
4、登錄之后,其默認就是管理員用戶,可以進行任何操作
5、開啟 Role-Based Strategy
6、重新登錄新創建 test1 用戶,顯示已經沒有任何權限了
5、 權限劃分
1、Manage Roles(管理角色)
1、Global roles
2、Item roles
2、Assigin roles(分配角色)
1、給予test用戶分配 user 角色
2、針對指定用戶分配項目角色(一般最常用的就是針對不同用戶進行項目角色分配)
2、Jenkins 參數化構建
1、 參數化構建背景
2、安裝插件
1、項目配置
2、構建選擇分支進行測試,添加branch參數 git配置中選$branch參數
3、參數化配置已經生效
3、Git 插件
1、安裝插件 Git Parameter
2、進行配置
3、Jenkins pipeline
1、概覽
2、安裝
3、實操
1、新建任務
2、編寫 pipeline 腳本
3、構建測試
4、Jenkins 構建郵件狀態通知
1、 前提
2、 基礎配置
Jenkins詳解
一、Jenkins介紹
簡單歷史
Jenkins 的前身是 Hudson,一個采用 Java 編寫的開源持續集成工具。Hudson 項目由 Sun 公司在 2004 年啟動,2005 年發布了第一個版本,并逐漸在持續集成工具領域占據主導地位。2008 年,Hudson 在 JavaOne 大會上獲得了杜克選擇大獎(Duke's Choice Award)。
2010 年 11 月,Oracle 收購 Sun 后,Hudson 的所有權問題引發了爭議。主要項目貢獻者和 Oracle 之間在“Hudson”商標名稱上存在分歧。2011 年 1 月,社區投票決定將項目名稱改為“Jenkins”,并于 1 月 29 日獲得批準,正式創建了 Jenkins 項目。
Oracle 繼續開發 Hudson,認為 Jenkins 只是一個分支。隨著時間的推移,Jenkins 社區迅速壯大,到 2013 年 12 月,GitHub 上的 Jenkins 項目成員遠超 Hudson。如今,Jenkins 已全面超越 Hudson,成為持續集成工具領域的領導者。
為什么 Jenkins 更受歡迎
由開發者主導、面向開發者:
首先,曾經是Hudson開發人員中的99%都轉向了Jenkins的開發,其中包括最初的創建者川口清子(Kohsuke Kawaguchi)。他獨自寫了大部分代碼,并且他的經驗是Hudson各種高級特性的關鍵來源。Jenkins的開發社區更活躍。所以對很多人而言,從血統上看Hudson是后娘養的,Jenkins才是親生的!
治理和社區:
-
Jenkins 開發社區管理開放,設有獨立董事會,定期舉行治理會議并征求公眾意見,所有代碼捐贈給公共利益軟件組織(SPI),確保社區持續開放。
穩定性:
-
Jenkins 社區不斷貢獻新功能和改進,定期發布長期支持版本,確保穩定性和可靠性。
豐富的插件生態:
-
Jenkins 支持超過 1000 個插件,覆蓋構建、部署、測試等各個環節,使其成為開發生命周期的核心工具。
1、Jenkins 功能
Jenkins 是一個開源的自動化服務器,可以通過插件支持構建、部署和自動化的各個方面。它的主要功能包括:
-
持續集成/持續交付(CI/CD):自動化的軟件版本發布和測試項目,確保每次代碼變更都能快速且可靠地集成和交付。
-
構建自動化:支持各種構建工具和語言,如 Maven、Gradle、Ant、以及 shell 腳本等。
-
測試自動化:能夠集成各種測試工具和框架,如 JUnit、TestNG 等,自動化執行測試并生成報告。
-
部署自動化:自動化應用程序的部署過程,可以集成 Docker、Kubernetes 等工具。
-
監控和報告:監控外部調用的執行工作,生成詳細的構建和測試報告,幫助快速定位和處理問題。
2、Jenkins 概念
Jenkins是一個功能強大的應用程序,允許持續集成和持續交付項目,旨在實現持續集成和持續交付。通過豐富的插件生態系統,Jenkins 可以集成各種構建、測試和部署工具,滿足不同團隊的需求。其主要概念包括:
-
Pipeline(流水線):定義構建、測試和部署的過程,可以通過代碼(Jenkinsfile)配置。
-
Node(節點):執行構建任務的機器,可以是主節點(Master)或從節點(Agent)。
-
Job(任務):具體的構建任務,可以配置多個步驟和觸發條件。
-
Plugin(插件):擴展 Jenkins 功能的組件,支持多種第三方工具和平臺。
3、Jenkins 目的
-
持續、自動地構建和測試軟件項目:每次代碼變更后,自動觸發構建和測試,確保代碼的持續集成和交付。
-
監控軟件開發流程:通過監控構建和測試過程,快速定位和處理問題,提高開發效率。
4、Jenkins 特性
-
開源的java語言開發持續集成工具,支持CI,CD。
-
易于安裝部署配置:可通過yum安裝,或下載war包以及通過docker容器等快速實現安裝部署,可方便web界面配置管理。
-
消息通知及測試報告:集成RSS/E-mail通過RSS發布構建結果或當構建完成時通過e-mail通知,生成JUnit/TestNG測試報告。
-
分布式構建:支持Jenkins能夠讓多臺計算機一起構建/測試。
-
文件識別:Jenkins能夠跟蹤哪次構建生成哪些jar,哪次構建使用哪個版本的jar等。
-
豐富的插件支持:支持擴展插件,你可以開發適合自己團隊使用的工具,如git,svn,maven,docker等。
5、產品發布流程
產品設計成型 -> 開發人員開發代碼 -> 測試人員測試功能 -> 運維人員發布上線
-
持續集成(Continuous integration,簡稱CI):每次代碼變更后,自動構建和測試。
-
持續交付(Continuous delivery):在 CI 的基礎上,自動化部署到預生產環境,確保代碼隨時可發布。
-
持續部署(continuous deployment):在 CD 的基礎上,進一步自動化部署到生產環境,實現無縫發布。
二、Jenkins CI/CD 流程
說明:這張圖稍微更形象一點,上線之前先把代碼git到版本倉庫,然后通過Jenkins將Java項目通過maven去構建,這是在非容器之前,典型的自動化的一個版本上線流程。那它有哪些問題呢?
如:它的測試環境,預生產環境,測試環境。會存在一定的兼容性問題 (環境之間會有一定的差異)
說明:阿里云鏡像倉庫,把環境打包為一個鏡像,通過鏡像的方式來部署。
三、部署Jenkins
IP | 主機名 |
---|---|
10.1.0.25 | k8s-master-node1 |
git
linux(centos7.9)下載安裝git2.32.0_git下載 linux-CSDN博客
#拉取代碼
[root@k8s-master-node1 ~]# yum install -y git #首先還是安裝git
[root@k8s-master-node1 ~]# mkdir -p test
[root@k8s-master-node1 ~]# cd test
[root@k8s-master-node1 ~]# git clone git@xxx.xx.xx.x:/xx/xx/xx/xx ##測試clone倉庫#push 測試
[root@k8s-master-node1 ~]# touch index.html
[root@k8s-master-node1 ~]# git add .
[root@k8s-master-node1 ~]# git commit -m "test"
#第一次有報錯警告,讓配置郵箱和姓名。配置一下即可,或者直接執行給出的命令執行。
[root@k8s-master-node1 ~]# git push origin master #提交到主分支(默認分支)
1、jenkins 安裝
官網: https://jenkins.io
插件:Index of /download/plugins
yum 安裝 jenkins *jenkins 依賴 java 環境 #注意2.346之后的版本不再支持jdk8
卸載舊jenkins
#查詢以前是否安裝jenkins
rpm -qa |grep jenkins
#卸載 jenkins
yum -y remove jenkins
rpm -e jenkins
#徹底刪除jenkins殘留文件
find / -iname jenkins | xargs -n 1000 rm -rf# 導入jenkins源
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
# 導入jenkins官方證書
rpm --import https://pkg.jenkins.io/redhat/jenkins.io-2023.key
?
#安裝jdk11
yum install fontconfig java-17-openjdk -y
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm
#有點慢,可以在Windows上提前下載導入。
sudo yum -y install ./jdk-17_linux-x64_bin.rpm
java -version
?
#安裝jenkins
yum install jenkins -y
#設置開機自啟動
systemctl enable jenkins #rpm安裝
wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.346.1-1.1.noarch.rpm
#安裝
rpm -ivh jenkins-2.346.1-1.1.noarch.rpm
2、配置文件
1、查詢 yum 下載 Jenkins 安裝的文件
[root@k8s-master-node1 ~]# rpm -ql jenkins
/usr/bin/jenkins # Jenkins 服務二進制文件
/usr/lib/systemd/system/jenkins.service #systemd 服務單元文件,定義Jenkins啟動參數
/usr/share/java/jenkins.war # war 包
/var/cache/jenkins # war包解壓目錄 jenkins網頁代碼目錄
/var/lib/jenkins # jenkins 工作目錄
2、修改配置文件
配置文件說明:
[root@k8s-master-node1 ~]# grep -Ev "^(#|$)" /usr/lib/systemd/system/jenkins.service
[Unit]
Description=Jenkins Continuous Integration Server # Jenkins 持續集成服務器的描述
Requires=network.target # 依賴于網絡服務,表示網絡必須先啟動
After=network.target # 在網絡服務啟動后再啟動 Jenkins
[Service]
Type=notify # 服務類型為 notify,表示服務啟動后會通知
NotifyAccess=main # 僅監聽主進程的通知
ExecStart=/usr/bin/jenkins # 啟動 Jenkins 的命令
Restart=on-failure # 在服務失敗時自動重啟
SuccessExitStatus=143 # 指定退出狀態碼 143 為正常退出
User=root # 以 root 用戶身份運行 Jenkins
Group=root # 以 root 用戶組身份運行 Jenkins
Environment="JENKINS_HOME=/var/lib/jenkins" # 設置 Jenkins 主目錄的環境變量
WorkingDirectory=/var/lib/jenkins # 指定工作目錄為 /var/lib/jenkins
Environment="JENKINS_WEBROOT=%C/jenkins/war" # 設置 Jenkins Web 根目錄的環境變量
Environment="JAVA_OPTS=-Djava.awt.headless=true" # 設置 Java 選項為無頭模式
Environment="JENKINS_PORT=3333" # 設置 Jenkins 監聽的端口為 3333
[Install]
WantedBy=multi-user.target # 在多用戶目標(運行級別)下啟動 Jenkins
3、啟動 jenkins
-
啟動之前修改以 root 用戶、群組身份運行 Jenkins, 確保后面 Jenkins 有權限使用 Docker 服務。
接下來啟動:
[root@k8s-master-node1 ~]# systemctl start jenkins
3、驗證安裝
[root@k8s-master-node1 /data]# ps -ef|grep jenkins
root 3523 7329 0 14:04 pts/0 00:00:00 grep --color=auto jenkins
jenkins 12697 1 7 14:01 ? 00:00:15 /usr/local/java/jdk1.8.0_121/bin/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --daemon --httpPort=8080 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20
3、jenkins配置(web頁面)
1、管理員密碼獲取
[root@k8s-master-node1 ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
2、安裝插件 (選擇在線安裝)
如果采用最新版的 一般不一會出現這個情況
出現離線安裝解決方法:
1、修改 /var/lib/jenkins/updates/default.json
jenkins 在下載插件之前會先檢查網絡連接,其會讀取這個文件中的網址。默認是訪問谷歌,肯定監測失敗,所以將圖下的google改為www.baidu.com即可,更改完重啟服務。
2、 修改/var/lib/jenkins/hudson.model.UpdateCenter.xml
該文件為jenkins下載插件的源地址,默認為:https://updates.jenkins.io/update-center.json,就是因為https的問題,此處我們將其改為http即可,之后重啟jenkins服務即可。
其他國內備用地址(也可以選擇使用):
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
http://mirror.esuni.jp/jenkins/updates/update-center.json
在修復完之后,我們發現離線問題已經解決
選擇安裝推薦的插件:
3、創建第一個管理員用戶
4、url 配置
之前版本沒有這個選項,這里默認即可:
5、安裝完成
出現如下頁面時,表示安裝完成
6、配置 jdk、git、maven
系統管理->全局工具配置
jdk:可以自動安裝,但是選擇本地安裝的適合項目jdk版本,寫入我們jdk的路徑即可
git:
maven:
7、jenkins 下載插件失敗處理辦法
jenkins 下載插件失敗,提示:
java.io.IOException: Downloaded file /app/jenkins_home/plugins/jacoco.jpi.tmp does not match expected SHA-1, expected 'CtK02wHdFOxTutqhUQzmue6uvpg=', actual 'YGO05utKyaaFzpGCgCE95GS0WsU='at hudson.model.UpdateCenter.verifyChecksums(UpdateCenter.java:1783)at hudson.model.UpdateCenter.access$1100(UpdateCenter.java:147)at hudson.model.UpdateCenter$InstallationJob.replace(UpdateCenter.java:1934)at hudson.model.UpdateCenter$UpdateCenterConfiguration.install(UpdateCenter.java:1178)at hudson.model.UpdateCenter$DownloadJob._run(UpdateCenter.java:1653)at hudson.model.UpdateCenter$InstallationJob._run(UpdateCenter.java:1848)at hudson.model.UpdateCenter$DownloadJob.run(UpdateCenter.java:1624)at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)at java.util.concurrent.FutureTask.run(FutureTask.java:266)at hudson.remoting.AtmostOneThreadExecutor$Worker.run(AtmostOneThreadExecutor.java:110)at java.lang.Thread.run(Thread.java:745)
中國源的問題。需要換個源就可,換源方法:
jenkins->系統管理->管理插件->高級 選擇升級站點
把:http://updates.jenkins-ci.org/update-center.json
換成:http://mirror.esuni.jp/jenkins/updates/update-center.json
鏡像地址查詢:
http://mirrors.jenkins-ci.org/status.html
四、使用Jenkins
1、Jenkins 用戶權限管理
1、 用戶管理背景
針對開發、運維、測試針對不同角色進行不同權限劃分,
基于插件: Role-based Authorization Strategy ,Authorize Project 來實現。
2、 安裝用戶管理插件
安裝該插件:
系統管理->管理插件-可選插件->搜索該插件選中直接安裝即可。
3、 開啟該插件功能
系統管理->全局安全設置-授權策略->選中該插件功能即可->保存
4、 驗證用戶管理
關閉用戶管理功能來進行實踐測試
1、策略改回原來的(全局安全配置)
2、開啟允許用戶注冊(全局安全配置)
3、注冊一個新用戶
4、登錄之后,其默認就是管理員用戶,可以進行任何操作
5、開啟 Role-Based Strategy
6、重新登錄新創建 test1 用戶,顯示已經沒有任何權限了
5、 權限劃分
安裝 Role-Based Strategy 插件后,系統管理 中多了如圖下所示的一個功能,用戶權限的劃分就是靠他來做的。
1、Manage Roles(管理角色)
-
Manage Roles:管理角色,相當于針對角色賦予不同權限,然后在將該角色分配給用戶。角色就相當于一個組。其里面又有Global roles(全局)、Project roles(項目)、Slave roles(),來進行不同劃分。
默認如圖下所示:
1、Global roles
默認是有一個admin用戶的,是所有權限都有的,所有權限都是勾選了的。
接下來我們來添加一個角色:user
給其一個讀的權限。
2、Item roles
-
roles to add:表示項目角色
-
Pattern:是用來做正則匹配的(匹配的內容是Job(項目名)),比如說根據正則匹配到的項目項目角色就都有權限;
接下來新建一個island 項目角色,改項目角色一般給其構建、取消、讀取、讀取空間權限,一般配置這4個即可
-
Agent roles (代理角色):節點相關的權限
-
roles to add:表示項目角色
-
Pattern:是用來做正則匹配的(匹配的內容是節點(Agent節點)),比如說根據正則匹配到的項目項目角色就都有權限;
2、Assigin roles(分配角色)
1、給予test用戶分配 user 角色
這樣其就有 manage roles 中剛才創建的user角色的權限了。
此時再去看 test1用戶,已有查看的權限了
2、針對指定用戶分配項目角色(一般最常用的就是針對不同用戶進行項目角色分配)
比如將test用戶分配有 island 項目角色,這樣其就可以有剛才我們創建的island 項目角色正則匹配到的項目的權限了。
2、Jenkins 參數化構建
1、 參數化構建背景
如果只是簡單的構建,jenkins自己默認的插件可以做,但是如果我們想要在構建過程中有更多功能,比如說:選擇性構建、傳參、項目指定變量等等其他功能,基礎的參數化構建可以實現一些簡單功能,但是要想使用更多功能這時候我們就需要借助參數化構建來實現交互的功能。此處我們來借助以下插件來進行實現:
-
Extended Choice Parameter(更豐富的參數化構建插件)
-
Git Parameter
2、安裝插件
首先還是安裝該插件,去管理插件里面進行安裝 Extended Choice Parameter
1、項目配置
2、構建選擇分支進行測試,添加branch參數 git配置中選$branch參數
3、參數化配置已經生效
3、Git 插件
再用 git 時使用該插件是非常方便的。
1、安裝插件 Git Parameter
2、進行配置
在配置之前有一個坑,當我們在配置git中寫了遠端地址后,會有報錯:
這個是和前面docker報錯是一樣的
這是因為 jenkins 我們 yum 裝的運行用戶是 jenkins 用戶,此處是 jenkins 用戶去 git 倉庫進行拉取,而 jenkins 用戶的話默認是 /bin/false 的,不但不能登錄,也沒有 git 命令權限,所以肯定是失敗的。
解決此問題兩種辦法:
-
更改jenkins用戶為root用戶;
-
更改jenkins用戶為正常的普通用戶/bin/bash,將其的公鑰加入到git服務器的git用戶中。
此處暫時先用第一種解決辦法,更改 jenkins 的運行用戶為 root 用戶,通過如下方式進行更改:
-
將/usr/lib/systemd/system/docker.service;文件中user和group改為root
-
然后再重啟即可。
3、Jenkins pipeline
1、概覽
2、安裝
在對 jenkins 進行初始化安裝時,默認已經安裝了 jenkins 的相關插件,如下圖所示:
3、實操
1、新建任務
2、編寫 pipeline 腳本
可以借助流水線語法去做。
roads流水線腳本:
pipeline { agent any // 參數化parameters {// string defaultValue: '2.0.0', description: '選擇版本', name: 'version'gitParameter branchFilter: 'origin/(.*)', defaultValue: 'master', name: 'BRANCH', type: 'PT_BRANCH'string(name: 'version', defaultValue: '2.0.0', description: '選擇版本')
}tools {jdk 'jdk1.8' maven 'maven-3.9.6'}stages {stage('pull code') {steps {cleanWs() //清空workspaceecho 'pull start'git branch: "${params.BRANCH}", credentialsId: 'xxxxxxxxxxxxxxxxxxxx', url: 'xxxxxxxxxxxxxxxxxxxxxxx'echo 'pull end'}}stage('mvn install xxxxxxxxxx') {steps {echo 'build xxxxxxxx'dir('xxxxxxxx') {sh "mvn -v"sh "mvn clean install -Dmaven.test.skip=true"} }}stage('mvn install xxxxxxxxxx') {steps { echo 'build xxxxxxxx' dir('xxxxxxxxxxx') {sh "mvn clean install -Dmaven.test.skip=true"} }}stage('mvn install xxxxx') {steps {echo 'build xxxxxxxxx'dir('xxxxxxxx') {sh "mvn clean install -Dmaven.test.skip=true"} }}stage('mvn install island-opple') {steps {echo 'build island-opple'sh "mvn clean install -Dmaven.test.skip=true"}}// stage('login docker') {// steps {// echo 'start login docker'// sh "docker login --username=xxxxxxxxxxxx --password=xxxxxxxxx registry.cn-hangzhou.aliyuncs.com" // }}stage('make image and push') {steps {echo 'start build image'script {def selectedProjects = "${project_name}".split(',')if(selectedProjects.size()>0){for(int i=0;i<selectedProjects.size();i++){aaa = selectedProjects[i].replace("\"", "")dir(aaa){sh "pwd"sh '''sed -i "1c FROM xxxxxxxxxxxxxxxxxx" Dockerfile '''sh "mvn -Ddocker.image.tag=${version} dockerfile:build"sh '''sleep 3image=$(docker images | sed -n '2p' | awk '{print $1":"$2}')echo $image'''// docker push $image
?}}}}}}}
}
3、構建測試
具體配置詳解請參考 Pipeline
4、Jenkins 構建郵件狀態通知
1、 前提
前提:服務器開啟郵箱服務
(如果啟動失敗修改/etc/postfix/main.cf
,確保 inet_interfaces
參數正確設置。默認是inet_interfaces = localhost,
如果你的服務器只想監聽 IPv4 地址,可以將該參數設置為 inet_interfaces = 127.0.0.1
如果想監聽所有地址(包括 IPv4 和 IPv6),可以將其設置為 inet_interfaces = all
。
)
2、 基礎配置
需要安裝一個插件:
插件: Email Extension Plugin
進行配置:
系統管理->系統設置->相關配置如下圖:
可以在此處進行測試發送!檢驗配置是否正確
未完待續。。。。。。。。。