先上總結(jié)
Pipeline可以很方便實(shí)現(xiàn)流水式的持續(xù)交付,執(zhí)行階段通過視圖一目了然。更多詳細(xì)的資料可以訪問官方文檔
網(wǎng)上關(guān)于Jenkins Pipeline的資料混亂,沒有完整例子,現(xiàn)在我把這段時(shí)間的學(xué)習(xí)總結(jié)出來,供大家參考。如有錯(cuò)誤敬請(qǐng)諒解。
1.CICD
以下是網(wǎng)上有關(guān)CICD的介紹
什么是持續(xù)集成(CI-Continuous integration)
持續(xù)集成是指多名開發(fā)者在開發(fā)不同功能代碼的過程當(dāng)中,可以頻繁的將代碼行合并到一起并切相互不影響工作。
什么是持續(xù)部署(CD-continuous deployment)
是基于某種工具或平臺(tái)實(shí)現(xiàn)代碼自動(dòng)化的構(gòu)建、測(cè)試和部署到線上環(huán)境以實(shí)現(xiàn)交付高質(zhì)量的產(chǎn)品,持續(xù)部署在某種程度上代表了一個(gè)開發(fā)團(tuán)隊(duì)的更新迭代速率。
什么是持續(xù)交付(Continuous Delivery)
持續(xù)交付是在持續(xù)部署的基礎(chǔ)之上,將產(chǎn)品交付到線上環(huán)境,因此持續(xù)交付是產(chǎn)品價(jià)值的一種交付,是產(chǎn)品價(jià)值的一種盈利的實(shí)現(xiàn)。
CICD優(yōu)點(diǎn)
降低成本,提高生產(chǎn)力,高可用,更可靠,性能優(yōu)化
如何做到持續(xù)集成和持續(xù)交付可以網(wǎng)上參考其他資料,這里不再多說。
Jenkins:
優(yōu)點(diǎn):編譯服務(wù)和代碼倉(cāng)庫(kù)分離,而且編譯配置文件不需要在工程中配置,如果團(tuán)隊(duì)有開發(fā)、測(cè)試、配置管理員、運(yùn)維、實(shí)施等完整的人員配置,那就采用jenkins,這樣職責(zé)分明。
缺點(diǎn):配置相對(duì)復(fù)雜,維護(hù)成本較高等
其實(shí)最重要的還是使得不同職能的人員分工明確,讓每個(gè)人知道自己現(xiàn)在要做什么,下一步應(yīng)該做什么。
對(duì)于開發(fā)人員,他們需要提交代碼到自己的開發(fā)分支,在開發(fā)分支上自動(dòng)構(gòu)建部署自行測(cè)試通過,然后合并到測(cè)試環(huán)境分支繼續(xù)測(cè)試。測(cè)試分支ok之后合并分支到生產(chǎn)基線分支,基線環(huán)境構(gòu)建后測(cè)試,通過后正式宣布上線。
對(duì)于運(yùn)維人員,他們僅需要管理服務(wù)器狀況
測(cè)試人員職責(zé)不變
開發(fā)人員在發(fā)布版本時(shí),僅需要打開對(duì)應(yīng)的流水線點(diǎn)擊構(gòu)建,構(gòu)建信息可以實(shí)時(shí)打印,以便排查錯(cuò)誤。
運(yùn)維人員不再需要每次拷貝文件到服務(wù)器以及管理各種啟動(dòng)腳本和配置文件,減少出錯(cuò)的概率。



2.環(huán)境搭建
2.1 準(zhǔn)備階段
涉及到的工具包
①Jenkins ②Git ③Docker ④JDK ⑤Maven /Gradle
pipeline插件對(duì)jenkins版本有要求,最好安裝一個(gè)版本較新的
安裝過程略...
并行構(gòu)建的量不大的情況下不建議使用docker安裝Jenkins,直接把Jenkins安裝到宿主機(jī)即可,不然要面臨各種目錄掛載和環(huán)境變量的問題
厲害的當(dāng)我沒說
2.2 配置階段
jenkins配置較為復(fù)雜,以下細(xì)看再進(jìn)行操作。
- 安裝完畢jenkins后,vi /etc/sysconfig/jenkins,把jenkins的執(zhí)行用戶改成root(或者你正在用的用戶名),也可以不改,給系統(tǒng)新增一個(gè)jenkins用戶也是可以的。

啟動(dòng)systemctrl start jenkins,然后訪問對(duì)應(yīng)ip,默認(rèn)端口是8080,也可以在剛才的文件中修改JENKINS_PORT
vi /var/lib/jenkins/secrets/initialAdminPassword(
默認(rèn)目錄,如有修改請(qǐng)改成對(duì)應(yīng)的jenkins home的目錄下,找到secrets/initialAdminPassword),可以看到初始密碼,復(fù)制拷貝到網(wǎng)站上即可登陸并創(chuàng)建你的初始用戶
- 安裝插件界面,如果你什么都不知道,請(qǐng)直接選擇第一個(gè),安裝推薦的插件,這樣會(huì)把中文等各種插件安裝好

- 安裝插件可能失敗,大概率是因?yàn)榫W(wǎng)絡(luò)原因,所以這里修改一下插件的安裝鏡像地址。
打開 系統(tǒng)管理->插件管理->高級(jí)->升級(jí)站點(diǎn),改成清華大學(xué)的鏡像地址
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

6. 配置全局工具
系統(tǒng)管理->全局工具配置
注意!如果你是通過docker安裝的jenkins,請(qǐng)把對(duì)應(yīng)的目錄掛載到Jenkins容器再配置,否則會(huì)報(bào)找不到
注意!這里配置的工具別名(name)待會(huì)在pipeline腳本中是有用的,并不是亂寫的


7. 接下來是首頁,新建任務(wù)
選擇流水線或者多分支流水線。
區(qū)別在于分支的管理,流水線pipeline是單分支,多分支就是字面的意思可以管理多分支
這里我選擇多分支流水線(如果沒有這個(gè)選項(xiàng),請(qǐng)自行百度要安裝哪個(gè)插件,一般安裝了推薦插件都會(huì)有)

8. 配置流水線
這里配置的是分支的來源

如果沒有憑證,可以新增一個(gè)

構(gòu)建配置這里,盡量不要改動(dòng),這里的意思是根據(jù)分支根目錄下的Jenkensfile文件來自動(dòng)配置流水線

保存確定后,就會(huì)看到Jenkins在掃描gitee上的分支,然后創(chuàng)建3個(gè)分支流水線,但是因?yàn)檫€沒有寫jenkinsfile文件,所以流水線里面是空的

到這里jenkins的配置就完成了,準(zhǔn)備進(jìn)入pipeline腳本編寫階段
3. pipeline腳本
3.1 編寫pipeline腳本

pipeline遵循Groovy語法,熟悉的人可能很快掌握,不熟悉也沒關(guān)系,可以通過流水線語法生成器生成,我們拷貝回去就行。語法這里不說,以后可能專門講,以下是學(xué)習(xí)地址:Jenkinsfile學(xué)習(xí)


解釋一下這里的意思,這里定義了三個(gè)stage,也就是3個(gè)流程,第一步從git拉取對(duì)應(yīng)的分支代碼,第二步使用maven構(gòu)建包,第三步給腳本授權(quán)并執(zhí)行腳本。每一個(gè)流程如果失敗不會(huì)進(jìn)入下一步。
3.2 編寫docker腳本
docker build腳本對(duì)應(yīng)Dockerfile(大小寫要完全一致)
語法這里不說,給出示例

3.3 編寫自動(dòng)部署腳本
這里的自動(dòng)化部署腳本就是因人而異了,每個(gè)人的項(xiàng)目情況不同,可能要部署前端后端,還要推送到其他服務(wù)器等等,都可以通過腳本實(shí)現(xiàn)
給出一個(gè)自己寫的shell腳本示例
#!/bin/bash
JOBMS=$1
VERSION=latest
JOBREPO=/data/docker/$1
IMGREPO=xmbaby-test
IMGNAME=$1
DTIME=`date+%Y-%m-%d" "%H":"%M":"%S`
TAG=$2
CONTAINER_NAME=rest-mvc
BRANCH=$3
if[!-d$JOBREPO];then
echo-e"jar目錄不存在,將創(chuàng)建jar目錄\n"
mkdir-p$JOBREPO
cp/var/lib/jenkins/workspace/$JOBMS_$BRANCH/target/$JOBMS.jar$JOBREPO/
echo-e"jar已經(jīng)復(fù)制到待創(chuàng)建鏡像目錄中,等待構(gòu)建docker鏡像\n"
else
echo-e"時(shí)間$DTIME,開始構(gòu)建docker鏡像\n"
fi
echo-e"構(gòu)建docker鏡像前,刪除之前的容器、鏡像."
IMAGE_ID=`docker images |grep$JOBMS|awk'{print $3}'`
echo"Image鏡像ID:$IMAGE_ID \n"
CONTAINER_ID=`docker ps-a|grep$CONTAINER_NAME|awk'{print $NF}'`
echo"Container容器:$CONTAINER_ID \n"
if[-z$CONTAINER_ID];then
echo-e"不存在容器,跳過清理容器階段\n"
else
dockerrm-f$CONTAINER_ID|true
echo-e"$CONTAINER_ID 舊容器刪除成功!"
docker rmi-f$IMAGE_ID|true
echo-e"$IMAGE_ID 舊鏡像刪除成功!"
fi
echo-e"時(shí)間:$DTIME,正式開始構(gòu)建docker鏡像"
docker build-t$JOBMS:$TAG.
if[$?-ne0];then
echo-e"時(shí)間:$DTIME,$JOBMS 鏡像構(gòu)建失敗,請(qǐng)檢查Dockerfile !"
exit
else
echo-e"時(shí)間$DTIME,開始運(yùn)行Docker容器."
#docker run --name $CONTAINER_NAME -v $JOBREPO:$JOBREPO -d -p 8081:8081 b2b-partner-img/$JOBMS
docker run--name$CONTAINER_NAME-d-p8080:8080$JOBMS
sleep 5
IMAGEID_NEW=`docker images |grep"$JOBMS"|awk'{print $3}'`
echo"新鏡像ID:$IMAGEID_NEW"
CONTAINERID_NEW=`docker images |grep"$JOBMS"|awk'{print $1}'`
echo"新容器ID:$CONTAINERID_NEW"
fi
項(xiàng)目文件路徑

一個(gè)jar包部署到docker當(dāng)然沒有優(yōu)勢(shì),但如果是大批量應(yīng)用部署,或者前后端代碼好幾個(gè)包,還有很多文件需要配置或者刪除等等,通過docker就很方便了,即使失敗了還可以恢復(fù)備份好的docker鏡像,不會(huì)導(dǎo)致不可用。
簡(jiǎn)單的一個(gè)包可能都不需要使用Jenkins
未完待續(xù)/doge