Jenkins企業應用進階詳解(一)
鏈接:https://pan.baidu.com/s/1NZZbocZuNwtQS0eGkkglXQ
提取碼:z7gj
復制這段內容后打開百度網盤手機App,操作更方便哦
1.CI/CD,DevOps介紹
- 持續集成(Continuous Integration,CI): 代碼合並,構建,部署,測試都在一起,不斷地執行這個過程,並對結果反饋
- 持續交付(Continuous Delivery,CD): 部署到生產環境,給用戶使用
- 持續部署(Continuous Deployment,CD): 部署到生產環境
2.部署Git版遠程倉庫
2.1 系統環境要求
主機名 | IP地址 | 備注 |
---|---|---|
Git | 192.168.200.61 | Git服務器 |
Jenkins | 192.168.200.62 | Jenkins服務器 |
[root@Git ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@Git ~]# uname -r
3.10.0-862.3.3.el7.x86_64
[root@Git ~]# systemctl stop firewalld
[root@Git ~]# systemctl disable firewalld
[root@Git ~]# systemctl stop NetworkManager
[root@Git ~]# systemctl disable NetworkManager
2.2 部署Git版遠程倉庫
#在Git服務器上進行如下操作
#安裝Git
[root@Git ~]# yum -y install git
[root@Git ~]# rpm -qa git
git-1.8.3.1-14.el7_5.x86_64
#創建Git賬戶
[root@Git ~]# useradd git
[root@Git ~]# passwd git
更改用戶 git 的密碼 。
新的 密碼:yangwenbo
重新輸入新的 密碼:yangwenbo
passwd:所有的身份驗證令牌已經成功更新。
#切換git普戶創建Git遠程倉庫
[root@Git ~]# su git
[git@Git ~]$ mkdir repos #創建Git倉庫目錄
[git@Git ~]$ cd repos/
[git@Git repos]$ mkdir app.git #創建app的項目目錄
[git@Git repos]$ cd app.git/
[git@Git app.git]$ pwd
/home/git/repos/app.git
[git@Git app.git]$ git --bare init #--bare創建一個裸倉庫(只用做遠程推送倉庫不支持本地git命令)
初始化空的 Git 版本庫於 /home/git/repos/app.git/
[git@Git app.git]$ ls
branches config description HEAD hooks info objects refs
說明:
使用”git init –bare”方法創建一個所謂的裸倉庫,之所以叫裸倉庫是因為這個倉庫只保存git歷史提交的版本信息,而不允許用戶在上面進行各種git操作,如果你硬要操作的話,只會得到下面的錯誤(”This operation must be run in a work tree”)
[git@Git app.git]$ git status
fatal: This operation must be run in a work tree
2.3 在Jenkins服務器進行git代碼遠程推送測試
#在Jenkins服務器上進行如下操作
#安裝Git
[root@Jenkins ~]# yum -y install git
[root@Jenkins ~]# rpm -qa git
git-1.8.3.1-14.el7_5.x86_64
#創建一個目錄,嘗試git clone遠程Git服務器倉庫的代碼
[root@Jenkins ~]# git clone git@192.168.200.61:/home/git/repos/app.git
正克隆到 'app'...
git@192.168.200.61's password: yangwenbo
warning: 您似乎克隆了一個空版本庫。
##創建一個文件進行測試
[root@Jenkins ~]# cd app/
[root@Jenkins app]# touch test #創建一個文件
[root@Jenkins app]# echo "welcome to yunjisuan" >> test
[root@Jenkins app]# cat test
welcome to yunjisuan
#配置git全局配置
[root@Jenkins app]# git config --global user.email "1773464408@qq.com"
[root@Jenkins app]# git config --global user.name "Mr.yang"
#進行代碼提交測試
[root@Jenkins app]# git add * #將文件添加到本地暫存區
[root@Jenkins app]# git commit -m '測試提交' #將代碼提交到本地git倉庫
[master(根提交) 25f1387] 測試提交
1 file changed, 1 insertion(+)
create mode 100644 test
[root@Jenkins app]# git remote -v #發現遠程倉庫地址已經被添加過了(之前clone時自動添加)
origin git@192.168.200.61:/home/git/repos/app.git (fetch)
origin git@192.168.200.61:/home/git/repos/app.git (push)
[root@Jenkins app]# git push -u origin master #將代碼推送到遠程倉庫的master分支
git@192.168.200.61's password: yangwenbo
Counting objects: 3, done.
Writing objects: 100% (3/3), 238 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.200.61:/home/git/repos/app.git
* [new branch] master -> master
分支 master 設置為跟蹤來自 origin 的遠程分支 master。
#查看分支情況
[root@Jenkins app]# git branch -a
* master #本地當前所處分支
remotes/origin/master #遠程倉庫已有分支
2.4 在Jenkins服務器進行SSH免密鑰操作
[root@Jenkins ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:90j/AJhD6+G3lCJte/4RXn7Xgf1JSwbqv0lLldmXnK0 root@Jenkins
The key's randomart image is:
+---[RSA 2048]----+
| |
| |
| . . |
| . + . = B|
| S +....&+|
| + =.B +=.B|
| . * =.*oEo=|
| o =..++o..|
| .oo..=o |
+----[SHA256]-----+
#進行公鑰分發
[root@Jenkins ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub git@192.168.200.61
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
git@192.168.200.61's password: yangwenbo
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'git@192.168.200.61'"
and check to make sure that only the key(s) you wanted were added.
#測試免密鑰的git推送測試
[root@Jenkins ~]# cd app/
[root@Jenkins app]# ls
test
[root@Jenkins app]# echo "yunwei" >> test
[root@Jenkins app]# tail -1 test
yunwei
[root@Jenkins app]# git add *
[root@Jenkins app]# git commit -m "免密鑰推送測試"
[master 21c373a] 免密鑰推送測試
1 file changed, 1 insertion(+)
[root@Jenkins app]# git push -u origin master
Counting objects: 5, done.
Writing objects: 100% (3/3), 288 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.200.61:/home/git/repos/app.git
25f1387..21c373a master -> master
分支 master 設置為跟蹤來自 origin 的遠程分支 master。
3. Jenkins的企業應用管理
jenkins官網:https://jenkins.io/
redhat版jenkins官方頁面:https://pkg.jenkins.io/redhat-stable/
3.1 Jenkins的安裝與基礎配置
安裝Jenkins的三種方法
- 利用Yum源安裝
- 下載jenkins的rpm包安裝
- jenkins的war包安裝
3.1.1 利用Yum方式安裝最新版本jenkins
#下載Jenkins的yum源文件
[root@Jenkins ~]# wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
#導入jenkins的rpm證書
[root@Jenkins ~]# rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
#利用Yum安裝最新版本jenkins
[root@Jenkins ~]# yum -y install jenkins
[root@Jenkins app]# rpm -qa jenkins
jenkins-2.138.2-1.1.noarch
#查看jenkins安裝路徑
[root@Jenkins ~]# rpm -ql jenkins
/etc/init.d/jenkins
/etc/logrotate.d/jenkins
/etc/sysconfig/jenkins #jenkins配置文件
/usr/lib/jenkins
/usr/lib/jenkins/jenkins.war
/usr/sbin/rcjenkins
/var/cache/jenkins
/var/lib/jenkins
/var/log/jenkins
3.1.2 安裝和配置jdk環境
由於jenkins是java開發的所以需要jdk支持
#解壓安裝jdk
[root@Jenkins ~]# tar xf jdk-8u171-linux-x64.tar.gz -C /usr/local
[root@Jenkins ~]# cd /usr/local
[root@Jenkins local]# mv jdk1.8.0_171 jdk
[root@Jenkins local]# /usr/local/jdk/bin/java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
#配置java環境
[root@Jenkins ~]# sed -i.org '$a export JAVA_HOME=/usr/local/jdk/' /etc/profile
[root@Jenkins ~]# sed -i.org '$a export PATH=$PATH:$JAVA_HOME/bin' /etc/profile
[root@Jenkins ~]# sed -i.org '$a export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
[root@Jenkins ~]# tail -3 /etc/profile
export JAVA_HOME=/usr/local/jdk/
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
[root@Jenkins ~]# source /etc/profile
[root@Jenkins ~]# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
3.1.3 安裝和配置maven環境
#解壓安裝maven
[root@Jenkins ~]# tar xf apache-maven-3.5.0-bin.tar.gz -C /usr/local/
[root@Jenkins ~]# cd /usr/local/
[root@Jenkins local]# mv apache-maven-3.5.0 maven
#配置maven環境變量
[root@Jenkins ~]# sed -i '$a MAVEN_HOME=/usr/local/maven' /etc/profile
[root@Jenkins ~]# sed -i '$a export PATH=${MAVEN_HOME}/bin:$PATH' /etc/profile
[root@Jenkins ~]# tail -2 /etc/profile
MAVEN_HOME=/usr/local/maven
export PATH=${MAVEN_HOME}/bin:$PATH
[root@Jenkins ~]# source /etc/profile
[root@Jenkins ~]# mvn -v
Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-04T03:39:06+08:00)
Maven home: /usr/local/maven
Java version: 1.8.0_171, vendor: Oracle Corporation
Java home: /usr/local/jdk/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-862.14.4.el7.x86_64", arch: "amd64", family: "unix"
3.1.4 啟動jenkins
#做一個java命令的軟連接
[root@Jenkins ~]# ln -s /usr/local/jdk/bin/java /usr/bin/
[root@Jenkins ~]# which java
/usr/bin/java
#再次啟動jenkins
[root@Jenkins ~]# systemctl start jenkins
[root@Jenkins ~]# systemctl status jenkins #正常啟動
● jenkins.service - LSB: Jenkins Automation Server
Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
Active: active (running) since 日 2018-10-21 10:08:41 CST; 3s ago
Docs: man:systemd-sysv-generator(8)
Process: 16017 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/jenkins.service
└─16036 /usr/bin/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME...
10月 21 10:08:36 Jenkins systemd[1]: Starting LSB: Jenkins Automation Server...
10月 21 10:08:36 Jenkins runuser[16022]: pam_unix(runuser:session): session opened for user jenkins b...d=0)
10月 21 10:08:41 Jenkins jenkins[16017]: Starting Jenkins [ 確定 ]
10月 21 10:08:41 Jenkins systemd[1]: Started LSB: Jenkins Automation Server.
Hint: Some lines were ellipsized, use -l to show in full.
#查看jenkins監聽端口8080
[root@Jenkins ~]# netstat -antup | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 16036/java
#添加開機自啟動
[root@Jenkins ~]# systemctl enable jenkins
jenkins.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig jenkins on
3.1.5 初始化jenkins
#查看jenkins解鎖密碼,並復制到jenkins的web界面,解鎖jenkins
[root@Jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
3a0f9dd9e961458cb2ef514a4c5b4405
使用默認插件配置安裝即可
3.1.6 常用的系統模塊介紹
3.1.7 系統管理--->全局工具配置介紹
- Maven配置: 配置maven的settings.xml配置文件的位置路徑(不修改為默認路徑)。
- 配置JDK: 配置java命令的執行路徑;JDK是java語言的軟件開發工具包。
- 配置Git: 配置Git的命令執行路徑;Git是分布式版本控制軟件。
- 配置Gradle: 配置Gradle的執行路徑;Gradle是面向java的自動化構建開源工具,同maven。
- 配置Ant: 配置Ant的執行路徑;Ant是面向java的自動化構建開源工具,同maven。
- 配置Maven:配置maven的命令執行路徑;maven是面向java的自動化構建開源工具。
- 配置Docker: 配置Docker的命令執行路徑;Docker是最近大熱的容器級虛擬化產品。
3.1.8 全局工具配置----> 配置JDK
3.1.9 全局工具配置----> 配置Git
3.1.10 全局工具配置----> 配置maven
- Apache Maven是一種創新的軟件項目管理工具,提供了一個項目對象模型(POM)文件的新概念來管理項目的構建,相關性和文檔。最強大的功能就是能夠自動下載項目依賴的庫文件。
- 在開發中,為了保證編譯通過,開發會到處去尋找項目依賴的jar包(類似rpm安裝軟件時需要的一堆依賴包)
- 因此,就要用到Maven(Ant和gradle也是干這個的)
- Maven其實就類似Linux的Yum倉庫,可以自動幫我們下載(公網源)和安裝java項目所依賴的支持包。
3.2 用戶權限管理
- 在一個成熟的企業應用環境中,jenkins是需要通過權限來控制角色功能使用的
- 開發人員利用jenkins====>生產環境項目代碼版本發布(A/B測試等)
- 測試人員利用jenkins====>測試環境自動化部署
- 運維人員利用jenkins====>生產環境項目代碼版本回滾
3.2.1 安裝插件Role-based Authorization Strategy
3.2.2 全局安全配置--->授權策略--->Role-Based Strategy
3.2.3 注冊兩個用戶(開發和測試)
由於開啟了Role-Based Strategy,此時用戶沒有任何權限
3.2.4 系統管理--->Manage and Assign Roles
- Manage Roles:權限管理
- Assign Roles:授權管理
(1)進入權限管理
Golbal roles:全局權限管理
- jenkins的整體權限分配,至少要開讀的權限
Project roles:項目權限管理
- 正則匹配具體的項目,分配管理權限
(2)進入授權管理
- Global roles:全局權限授權
- Item roles:項目權限授權
(3)創建兩個項目分別以A-和B-開頭
(4)登陸用戶user1和user2進行權限登陸測試
3.3 參數化構建
3.3.1 什么是參數化構建?
參數化構建就是在執行自動構建之前可以對構建過程手動傳入外部參數,從而改變構建的過程。
(1)配置一個構建腳本,然后執行
(2)添加參數化構建功能
(3)執行參數構建
當然,我們在構建的時候也可以修改參數的默認值
3.3.2 安裝插件Extended Choice Parameter
- Extended Choice Parameter:作用就是在參數化構建時可以出現一個下拉框讓用戶直接選擇多個值
我們還可以在一個文件里創建參數,然后讓插件引用這個參數
#創建一個參數定義文件
[root@Jenkins ~]# vim /opt/jenkins.property
[root@Jenkins ~]# cat /opt/jenkins.property
yunjisuan=test01,test02,test06
3.4 Git參數化構建插件
Git Parameter插件可以直接獲取Git倉庫的branch,tag等信息
3.4.1 安裝插件Git Parameter
3.4.3 進行Git參數化構建
(1)配置Git Parameter插件
(2)配置Git遠程倉庫
(3)進行Git參數化構建
(4)給Git遠程倉庫增加分支
#在jenkins上操作
[root@Jenkins ~]# mkdir -p /test
[root@Jenkins ~]# cd /test/
[root@Jenkins test]# git init
初始化空的 Git 版本庫於 /test/.git/
[root@Jenkins test]# git clone git@192.168.200.61:/home/git/repos/app.git
正克隆到 'app'...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
接收對象中: 100% (6/6), done.
[root@Jenkins test]# ls
app
[root@Jenkins test]# cd app/
[root@Jenkins app]# ls
test
[root@Jenkins app]# cat test
welcome to yunjisuan
yunwei
[root@Jenkins app]# git branch
* master
[root@Jenkins app]# git branch dev
[root@Jenkins app]# git checkout dev
切換到分支 'dev'
[root@Jenkins app]# git branch
* dev
master
[root@Jenkins app]# git add *
[root@Jenkins app]# git commit -m "開發分支提交"
# 位於分支 dev
無文件要提交,干凈的工作區
[root@Jenkins app]# git push -u origin dev
Total 0 (delta 0), reused 0 (delta 0)
To git@192.168.200.61:/home/git/repos/app.git
* [new branch] dev -> dev
分支 dev 設置為跟蹤來自 origin 的遠程分支 dev。
(5)進行jenkins項目代碼拉取測試
3.5 Master-Slave架構
主機名 | IP地址 | 備注 |
---|---|---|
Git | 192.168.200.61 | Git服務器(Jenkins的slave節點) |
Jenkins | 192.168.200.62 | Jenkins服務器 |
jenkins的分布式構建操作,可以通過slave代理節點來執行項目任務;
3.5.1 添加一個用於連接slave代理節點的SSH證書
3.5.2 系統管理--->節點管理
特別提示:如果沒有設置工具位置--->jdk ,那么jenkins會默認去/var/lib/jenkins/jdk下找java命令 ,如果找不到代理就會連接不上
3.5.3 slave節點安裝java環境
#解壓安裝jdk
[root@Git ~]# tar xf jdk-8u171-linux-x64.tar.gz -C /usr/local
[root@Git ~]# cd /usr/local
[root@Git local]# mv jdk1.8.0_171 jdk
[root@Git local]# /usr/local/jdk/bin/java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
#配置java環境
[root@Git ~]# sed -i.org '$a export JAVA_HOME=/usr/local/jdk/' /etc/profile
[root@Git ~]# sed -i.org '$a export PATH=$PATH:$JAVA_HOME/bin' /etc/profile
[root@Git ~]# sed -i.org '$a export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
[root@Git ~]# tail -3 /etc/profile
export JAVA_HOME=/usr/local/jdk/
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
[root@Git ~]# source /etc/profile
[root@Git ~]# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
3.5.4 啟動slave節點代理程序
3.5.5 查看slave節點啟動日志
3.5.6 強制讓項目A-Web01運行在slave1節點上,並運行項目
3.5.7 查看A-WebA的構建日志
[root@Git ~]# cd /var/lib/jenkins/workspace/
[root@Git workspace]# ls
A-web01 A-web01@tmp
[root@Git workspace]# cat A-web01/test
welcome to yunjisuan
yunwei
[root@Git workspace]# hostname -I
192.168.200.61