一、前言
Jenkins是一款開源 CI&CD 軟件,用于自動(dòng)化各種任務(wù),包括構(gòu)建、測(cè)試和部署軟件。Jenkins 支持各種運(yùn)行方式,可通過系統(tǒng)包、Docker
或者通過一個(gè)獨(dú)立的 Java 程序。
Jenkins是一個(gè)廣泛用于持續(xù)構(gòu)建的可視化Web工具,持續(xù)構(gòu)建就是將項(xiàng)目自動(dòng)化編譯、打包、部署。通過規(guī)范化來完成,簡(jiǎn)單,繁瑣,浪費(fèi)時(shí)間的重復(fù)工作。
?Jenkins名言:構(gòu)建偉大,無(wú)所不能!?
Jenkins用戶手冊(cè)傳送門:https://jenkins.io/zh/doc/ <https://jenkins.io/zh/doc/>
二、發(fā)布流程
?工作詳細(xì)流程:
三、環(huán)境準(zhǔn)備
服務(wù)器角色 IP地址 主機(jī)名 運(yùn)行服務(wù) 系統(tǒng)版本
?Jenkins/Docker ?192.168.115.21 ?jenkins
安裝Docker、Tomcat運(yùn)行Jenkins、Git客戶端、JDK、Maven CentOS 7.4?
?Git/Registry ?192.168.115.22 ?git ?安裝Docker、Git服務(wù)、Registry私有倉(cāng)庫(kù)容器 ?CentOS 7.4
?Docker ?192.168.115.23 ?docker ?安裝Docker、拉取Tomcat鏡像運(yùn)行Java項(xiàng)目 ?CentOS 7.4
四、部署思路梳理
五、三臺(tái)機(jī)器上操作
i. 配置好yum源安裝必要的一些系統(tǒng)工具
[root@jenkins ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
?ii. 添加軟件源信息
[root@jenkins ~]# yum-config-manager --add-repo http://
mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
iii. 更新并安裝 Docker-CE
[root@jenkins ~]# yum makecache fast [root@jenkins ~]# yum -y install docker-ce
iv. 開啟Docker服務(wù)
[root@jenkins ~]# systemctl start docker [root@jenkins ~]# systemctl enable
docker
v. 檢查docker版本
注:以上步驟三臺(tái)服務(wù)器都需要同樣的操作。
六、Git機(jī)器上操作
6.1、部署Git倉(cāng)庫(kù),Git機(jī)器上操作
i. 安裝Git
[root@git ~]# yum install git -y
ii. 創(chuàng)建Git用戶和設(shè)置密碼
[root@git ~]# useradd git [root@git ~]# passwd git Changing password for user
git. New password:******* BAD PASSWORD: The password is shorter than 8
characters Retypenew password: ******* passwd: all authentication tokens
updated successfully.
iii. 創(chuàng)建倉(cāng)庫(kù)
[root@git ~]# su - git [git@git ~]$ mkdir test-jenkins.git [git@git ~]$ cd
test-jenkins.git/ [git@git test-jenkins.git]$ git --bare init Initialized empty
Git repositoryin /home/git/test-jenkins.git/
6.2、訪問Git倉(cāng)庫(kù)測(cè)試,Jenkins機(jī)器上操作
i. 安裝Git客戶端
[root@jenkins ~]# yum install git -y
ii. 生成公鑰,拷貝到Git服務(wù)器
[root@jenkins ~]# ssh-keygen -t rsa // 三個(gè)回車 [root@jenkins ~]# ssh-copy-id git@
192.168.115.22 // 注意是git用戶
iii. 拉取Git項(xiàng)目測(cè)試
[root@jenkins ~]# git clone [email protected]:/home/git/test-jenkins.git
Cloning into'test-jenkins'... warning: You appear to have cloned an empty
repository.
6.3、部署Docker私有倉(cāng)庫(kù),Git機(jī)器上操作
i. 創(chuàng)建Registry容器
[root@git ~]# docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000
--restart=always --name rregistry registry
ii. 檢查Registry容器狀態(tài),已經(jīng)成功啟動(dòng)了
七、Docker機(jī)器上操作
i. 配置私有倉(cāng)庫(kù)
[root@docker ~]# cat /etc/docker/daemon.json {"registry-mirrors": ["
http://abcd1234.m.daocloud.io"], "insecure-registries": [ "192.168.115.22:5000"
]}
注:第2行是192.168.115.22 Docker私有倉(cāng)庫(kù)地址。
ii. 重啟Docker服務(wù)
[root@docker ~]# systemctl restart docker
iii. 配置JDK
JDK1.8下載:
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
<https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html>
[root@docker ~]# tar zxvf jdk-8u221-linux-x64.tar.gz [root@docker ~]# mv jdk1.8
.0_221/ /usr/local/jdk
iv. 構(gòu)建Tomcat基礎(chǔ)鏡像
[root@docker ~]# cat Dockerfile # 基礎(chǔ)鏡像 FROM centos:7 # 維護(hù)者信息 MAINTAINER test-
Jenkins # Tomcat版本 ENV VERSION=8.5.45 # jdk目錄 ENV JAVA_HOME /usr/local/jdk #
安裝wget命令 RUN yum install wget-y # 下載Tomcat RUN wget http://
mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz
&& \ # 解壓tomcat tar zxf apache-tomcat-${VERSION}.tar.gz && \ # 移動(dòng)解壓出來的tomcat文件
mv apache-tomcat-${VERSION} /usr/local/tomcat-jenkins && \ # 刪除不需要的文件,減輕容器體積 rm
-rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat-jenkins/webapps/* && \ #
創(chuàng)建ROOT,tomcat默認(rèn)目錄 mkdir /usr/local/tomcat-jenkins/webapps/ROOT # 映射端口 EXPOSE
8080 # 啟動(dòng)tomcat CMD ["/usr/local/tomcat-jenkins/bin/catalina.sh", "run"]
v. 構(gòu)建鏡像上傳Registry倉(cāng)庫(kù)
[root@docker ~]# docker build -t 192.168.115.22:5000/tomcat-jenkins -f
Dockerfile .
vi. 推送到鏡像倉(cāng)庫(kù)
[root@docker ~]# docker push 192.168.115.22:5000/tomcat-jenkins
vii. 驗(yàn)證是否上傳Registry鏡像倉(cāng)庫(kù)
[root@docker ~]# curl -XGET http://192.168.115.22:5000/v2/_catalog {"
repositories":["tomcat-jenkins"]}
八、Jenkins機(jī)器上操作
8.1、配置私有倉(cāng)庫(kù)、Git、JDK、Maven
i. 配置私有倉(cāng)庫(kù)
[root@docker ~]# cat /etc/docker/daemon.json {"registry-mirrors": ["
http://abcd1234.m.daocloud.io"], "insecure-registries": [ "192.168.115.22:5000"
]} 重啟Docker服務(wù): [root@docker~]# systemctl restart docker
注:第2行是192.168.115.22 Docker私有倉(cāng)庫(kù)地址。
ii. 安裝JDK?
JDK1.8下載:
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
<https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html>
[root@jenkins ~]# tar zxvf jdk-8u221-linux-x64.tar.gz [root@jenkins ~]# mv
jdk1.8.0_221/ /usr/local/jdk
iii. 配置JDK
[root@jenkins ~]# vim /etc/profile
--------------------添加環(huán)境變量--------------------- JAVA_HOME=/usr/local/jdk PATH
=$PATH:$JAVA_HOME/bin CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/
tools.jar export JAVA_HOME PATH CLASSPATH
iv. 更新系統(tǒng)環(huán)境變量
[root@jenkins ~]# source /etc/profile
v. 驗(yàn)證
[root@jenkins ~]# java -version
vi. 安裝Maven?
Maven下載連接:http://maven.apache.org/download.cgi
<http://maven.apache.org/download.cgi>
[root@jenkins ~]# tar zxvf apache-maven-3.6.1-bin.tar.gz [root@jenkins ~]# mv
apache-maven-3.6.1 /usr/local/maven
8.2、安裝Jenkins和Tomcat
Jenkins下載鏈接:https://jenkins.io/zh/download/ <https://jenkins.io/zh/download/>?
Tomcat下載鏈接:
http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.45/bin/apache-tomcat-8.5.45.tar.gz
<http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.45/bin/apache-tomcat-8.5.45.tar.gz>
i. 解壓和拷貝Jenkins.war到Tomcat目錄下
[root@jenkins ~]# tar zxvf apache-tomcat-8.5.45.tar.gz [root@jenkins ~]# mv
apache-tomcat-8.5.45 /usr/local/tomcat-jenkins [root@jenkins ~]# rm -rf
/usr/local/tomcat-jenkins/webapps/* [root@jenkins ~]# unzip jenkins.war -d
/usr/local/tomcat-jenkins/ROOT
ii. 啟動(dòng)Tomcat
[root@jenkins ~]# /usr/local/tomcat-jenkins/bin/startup.sh
8.3、配置Jenkins
i. 訪問Jenkins(http://IP:8080 <http://ip:8080/>)
ii. 獲取密碼
[root@jenkins ~]# cat /var/jenkins_home/secrets/initialAdminPassword
e3218946860a4e62b5b4808db0a7f2b6
iii. 選擇插件的安裝(不熟悉的情況下推薦安裝即可,省得麻煩)
iv. 創(chuàng)建用戶
v. 配置Maven、jdk、git環(huán)境
注:系統(tǒng)管理 —> ?全局工具配置,指定JDK、Maven路徑,Git保持默認(rèn)
vi. Jenkins安裝必要插件
注:系統(tǒng)管理 —> 管理插件(安裝SSH與Git Parameter插件)
插件說明:
SSH:用于SSH遠(yuǎn)程Docker主機(jī)執(zhí)行Shell命令; Git Parameter:動(dòng)態(tài)獲取Git倉(cāng)庫(kù)Branch、Tag;
vii. 配置SSH插件
viii. 輸入Docker主機(jī)的用戶名/密碼
ix. 添加SSH遠(yuǎn)程主機(jī)
注:記得點(diǎn)擊左下角“保存”按鈕。
九、上傳JAVA項(xiàng)目代碼到Git倉(cāng)庫(kù)
先下載并安裝git:https://git-scm.com/download/ <https://git-scm.com/download/>
9.1、使用IDEA創(chuàng)建測(cè)試項(xiàng)目
創(chuàng)建新項(xiàng)目:
選擇Spring Initializr:本地提前配置好JDK環(huán)境和Maven環(huán)境
選擇war:
選擇Web —> Sping Web Starter:
隨便起個(gè)項(xiàng)目名稱:
來個(gè)簡(jiǎn)單的“Hello World”:
代碼如下:
package com.example.demo; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import
org.springframework.web.bind.annotation.RequestMapping; import
org.springframework.web.bind.annotation.RestController; @RestController
@SpringBootApplicationpublic class DemoApplication { public static void
main(String[] args) { SpringApplication.run(DemoApplication.class, args); }
@RequestMappingpublic String hello() { return "Hello Jenkins v1.0"; } }
本地運(yùn)行測(cè)試項(xiàng)目:
本地瀏覽器訪問測(cè)試:
9.2、連接Git倉(cāng)庫(kù)上傳代碼
i. 在IDEA中設(shè)置Git,在File-->Setting->Version Control-->Git-->Path to Git
executable選擇你的git安裝后的git.exe文件,然后點(diǎn)擊Test,測(cè)試是否設(shè)置成功。
ii. 選擇要上傳的項(xiàng)目
iii. 將本項(xiàng)目添加到本地倉(cāng)庫(kù)
注:我們?cè)陧?xiàng)目文件名上右鍵選擇 git,通過 add 添加到本地庫(kù)的跟蹤區(qū),再comment 正式提交到本地倉(cāng)庫(kù)。
iv. 添加Git倉(cāng)庫(kù)地址
v. 上傳代碼
vi. 在Jenkins機(jī)器上下載項(xiàng)目驗(yàn)證是否上傳成功
[root@jenkins ~]# git clone [email protected]:/home/git/test-jenkins.git
[root@jenkins~]# cd test-jenkins/ [root@jenkins test-jenkins]# ls mvnw mvnw.cmd
pom.xml src
9.3、給項(xiàng)目添加Tag
9.3.1、IDEA測(cè)試項(xiàng)目連接Git添加Tag
i. 進(jìn)入Version Control-->log
ii. 在之前版本中,右鍵,新建標(biāo)簽
iii. Push標(biāo)簽
注:由于不是在當(dāng)前最新版本打入的標(biāo)簽,push 時(shí)需要選擇 push tags (all),不然不能push。
iv. 在Git倉(cāng)庫(kù)上查看Tag驗(yàn)證一下
[root@git ~]# su - git [git@git ~]$ cd test-jenkins.git/ [git@git test-
jenkins.git]$ git tag v1.0
9.3.2、如果是直接上傳項(xiàng)目到Git倉(cāng)庫(kù),加Tag方法
[root@git ~]# su - git [git@git ~]$ cd test-jenkins.git/ [git@git test-
jenkins.git]$ git branch [git@git test-jenkins.git]$ git tag v1.0 [git@git test-
jenkins.git]$ git tag v1.0
額外補(bǔ)充刪除Tag:
[git@git test-jenkins.git]$ git tag -d v1.0
十、Jenkins發(fā)布測(cè)試
10.1、配置Jenkins項(xiàng)目
安裝Maven插件,構(gòu)建一個(gè)Maven項(xiàng)目:
配置項(xiàng)目(新建任務(wù) -> 輸入任務(wù)名稱,構(gòu)建一個(gè)Maven項(xiàng)目)
配置Git參數(shù)化構(gòu)建:
動(dòng)態(tài)獲取Git倉(cāng)庫(kù)Tag,與用戶交互選擇Tag發(fā)布:
指定項(xiàng)目Git倉(cāng)庫(kù)地址:
注:修改*/master為$Tag,Tag是上面動(dòng)態(tài)獲取的變量名,表示根據(jù)用戶選擇打代碼版本。
設(shè)置maven構(gòu)建命令選項(xiàng)(clean package -Dmaven.test.skip=true):
Jenkins本機(jī)鏡像構(gòu)建和推送到私有鏡像倉(cāng)庫(kù):
代碼如下:
# 定義變量 REPOSITORY=192.168.115.22:5000/tomcat-jenkins:${Tag} # 開始構(gòu)建鏡像 cat >
Dockerfile << EOF # 拉取私有倉(cāng)庫(kù)的鏡像 FROM 192.168.115.22:5000/tomcat-jenkins:latest #
刪除Tomcat下不需要的ROOT項(xiàng)目 RUN rm-rf /usr/local/tomcat-jenkins/webapps/ROOT #
將jenkins編譯好的war包拷貝到Tomcat目錄下 COPY target/*.war
/usr/local/tomcat-jenkins/webapps/ROOT.war # 運(yùn)行Tomcat CMD
["/usr/local/tomcat-jenkins/bin/catalina.sh", "run"] EOF # 清除Jenkins主機(jī)舊的構(gòu)建鏡像
docker image rm 192.168.115.22:5000/tomcat-jenkins:${Tag} # 構(gòu)建自定義鏡像 docker
build -t $REPOSITORY . # 開始上傳鏡像 docker push $REPOSITORY
SSH遠(yuǎn)程在Docker主機(jī)上執(zhí)行創(chuàng)建容器命令:
代碼如下:
# 定義變量 REPOSITORY=192.168.115.22:5000/tomcat-jenkins:${Tag} # 刪除之前容器和鏡像 docker
rm-f tomcat-jenkins |true docker image rm $REPOSITORY |true # 開始部署容器 docker
container run-d --name tomcat-jenkins -v /usr/local/jdk:/usr/local/jdk -p 80:
8080 $REPOSITORY
10.2、開始構(gòu)建
點(diǎn)擊項(xiàng)目名稱 —> 選擇版本 —> 開始構(gòu)建
查看構(gòu)建過程以及信息輸出:
查看是否構(gòu)建成功:
驗(yàn)證項(xiàng)目是否可以訪問:
十一、后面再?gòu)U話兩句
到此就簡(jiǎn)單體驗(yàn)了Jenkins+Docker+Git+
Registry實(shí)現(xiàn)一套CI自動(dòng)化發(fā)布流程,本來打算Jenkins放在容器上運(yùn)行的,發(fā)現(xiàn)Jenkins容器里面需要Docker命令,但是比較繁瑣,也感覺沒必要好像,就直接采用方法一了。
感興趣的可以通過以下方式實(shí)現(xiàn):- 不使用任何Jenkins鏡像,宿主機(jī)安裝Jenkins [宿主機(jī)有Docker服務(wù)] -
不使用官方Jenkins鏡像,自己構(gòu)造帶有Docker服務(wù)的Jenkins鏡像- Docker-in-Docker [DinD] -
Docker-outside-of-Docker [DooD] - 使用Jenkins的Docker插件
注:如有問題請(qǐng)指點(diǎn)出來,非常感謝。?
注:本文參考這篇博客,非常感謝博主:https://blog.51cto.com/lizhenliang/2159817
<https://blog.51cto.com/lizhenliang/2159817>
?
熱門工具 換一換