部署Jenkins
一、jenkins 安裝
官網:?https://jenkins.io
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.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
2.3 啟動 jenkins
- ? 啟動之前修改以 root 用戶、群組身份運行 Jenkins, 確保后面 Jenkins 有權限使用 Docker 服務。
接下來啟動:
`[root@k8s-master-node1 ~]# systemctl start jenkins`
2.4 驗證安裝
[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
三、jenkins配置(web頁面)
3.1 管理員密碼獲取
?
[root@k8s-master-node1 ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
3.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.3 創建第一個管理員用戶
?
3.4 url 配置
之前版本沒有這個選項,這里默認即可:
?
3.5 安裝完成
出現如下頁面時,表示安裝完成
?
?
3.6 配置 jdk、git、maven
系統管理->全局工具配置
?
jdk:可以自動安裝,但是選擇本地安裝的適合項目jdk版本,寫入我們jdk的路徑即可
?
git:
?
maven:
?
3.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 核心功能使用
一、Jenkins 用戶權限管理
1.1 用戶管理背景
針對開發、運維、測試針對不同角色進行不同權限劃分,
基于插件: Role-based Authorization Strategy ,Authorize Project 來實現。
1.2 ?安裝用戶管理插件
安裝該插件:
系統管理->管理插件-可選插件->搜索該插件選中直接安裝即可。
?
?
1.3 開啟該插件功能
系統管理->全局安全設置-授權策略->選中該插件功能即可->保存
?
1.4 驗證用戶管理
關閉用戶管理功能來進行實踐測試
1、策略改回原來的(全局安全配置)
?
2、開啟允許用戶注冊(全局安全配置)
?
3、注冊一個新用戶
?
4、登錄之后,其默認就是管理員用戶,可以進行任何操作
?
5、開啟 Role-Based Strategy
6、重新登錄新創建 test1 用戶,顯示已經沒有任何權限了
?
1.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 項目角色正則匹配到的項目的權限了。
?
二、Jenkins 參數化構建
2.1 參數化構建背景
如果只是簡單的構建,jenkins自己默認的插件可以做,但是如果我們想要在構建過程中有更多功能,比如說:選擇性構建、傳參、項目指定變量等等其他功能,基礎的參數化構建可以實現一些簡單功能,但是要想使用更多功能這時候我們就需要借助參數化構建來實現交互的功能。此處我們來借助以下插件來進行實現:
-
? Extended Choice Parameter(更豐富的參數化構建插件)
-
? Git Parameter
2.2 安裝插件
首先還是安裝該插件,去管理插件里面進行安裝 Extended Choice Parameter
?
1、項目配置
?
2、構建選擇分支進行測試,添加branch參數?git配置中選$branch參數
?
?
3、參數化配置已經生效
?
2.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
-
? 然后再重啟即可。
三、Jenkins pipeline
3.1 概覽
?
3.2 安裝
在對 jenkins 進行初始化安裝時,默認已經安裝了 jenkins 的相關插件,如下圖所示:
?
3.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
四、Jenkins 構建郵件狀態通知
4.1 前提
前提:服務器開啟郵箱服務
(如果啟動失敗修改/etc/postfix/main.cf
,確保?inet_interfaces
?參數正確設置。默認是inet_interfaces = localhost,
如果你的服務器只想監聽 IPv4 地址,可以將該參數設置為?inet_interfaces = 127.0.0.1
如果想監聽所有地址(包括 IPv4 和 IPv6),可以將其設置為?inet_interfaces = all
。
)
?
4.2 ?基礎配置
需要安裝一個插件:
插件: Email Extension Plugin
進行配置:
系統管理->系統設置->相關配置如下圖:
?
可以在此處進行測試發送!檢驗配置是否正確