從零開始,一個人,從連jenkins是什么都不知道到基本完成持續集成,可以初步服務於公司的開發環境,用時大約一個月的時間,中間碰坑無數,每一個點擊,每一個配置都被卡過很長時間,還好這之前對腳本還算熟悉,用腳本完成了jenkins的一些docker方面的功能,不然還需要再耗時一兩周,以下是我完成的流程圖(沒怎么畫過,不規范),希望初學者能在我這里得到一些靈感,不至於入門無路。
jenkins,maven,gitlab,docker的安裝以后再寫
持續集成流程圖
流程:
為防止意外,使用半自動集成方式,因為研發人員太多,經常把gitlab當vpn使,隨筆改點啥就提交,很容易出問題,所以基本思路是提交代碼自動觸發流程maven打jar包,手動選擇需要更新的服務打包docker鏡像發布到docker,當然也可以發布到kubernetes,多寫一段腳本的事。
使用gitlab作為代碼倉庫,配置jenkins,創建一個自由風格的軟件項目,配置流程gitlab觸發器-maven打包-移動jar包到指定位置,再創建一個帶參數的流程-選擇需要更新的服務-打包docker鏡像-發布服務,這個帶參數的流程需手動選擇需要更新的服務,這個流程是上圖中的??標記內容
1.gitlab上傳代碼
gitlab創建一個用戶上傳代碼,由於和本文關系不大,省略
2.配置jenkins
安裝好jenkins以后還需要對jenkins進行配置,包括jdk,maven,gitlab等
jdk配置
點擊系統管理-全局工具配置-JDK安裝-新增JDK
不要選擇自動安裝,選擇本地的jdk路徑,如果jdk都不會安裝的話建議就不要看這篇文章了,先看看鳥哥的linux私房菜,或者linux從入門到精通……
git配置
點擊系統管理-全局工具配置-add git
這個配置可以讓你使用git獲取gitlab的代碼
gitlab配置
系統管理-系統配置-gitlab
這里添加的是gitlab的API token
打開gitlab-setting-acces tokens-name api-create
生成了一個apitoken,復制到上面的API token位置保存即可
maven配置
點擊系統管理-全局工具配置-maven
點擊系統管理-全局工具配置-maven配置
這個配置可以讓你使用mvn命令
3.配置jenkins流程
jenkins的安裝參考我之后的博文
安裝好jenkins以后,首頁是這樣的
點擊新建任務-創建一個自由風格的軟件項目project1-源碼管理git-構建觸發器-構建
點擊新建任務
創建一個自由風格的軟件項目project1
源碼管理git
填寫URL,憑證,觸發分支,這里選擇的是master
添加gitlab憑證-username with password
構建觸發器
記下標紅的URL,后面會用到
點擊高級-Generate 生成的Secret token記下來,待會配置gitlab會用到
配置gitlab
使用管理員賬戶登錄-configure gitlab-用戶設置-網絡-外發請求
點擊項目-settings-webhooks
填入上面記錄的url token ADD webhooks
構建
構建maven打包-移動jar包-構建執行shell
相關配置如下圖所示
Maven版本是上面配置的maven,目標是mvn打包命令,POM是pom.xml文件在項目中的位置,默認是/root/.jenkins/workspace/project1/
這個目錄是jenkins項目流程的代碼的根目錄,執行過一遍流程以后代碼就會下載到這個位置,你上傳到gitlab的代碼都在這個目錄,pom.xml是相對位置,如果pom文件沒有在gitlab的根目錄,那就要根據實際情況來寫,如果pom.xml在項目的test文件夾中,那這里應該寫test/pom.xml
[root@localhost project1]# ll
total 24 drwxr-x--- 5 root root 97 Jul 8 16:05 business-service drwxr-x--- 3 root root 83 Jul 8 13:57 business-service-api drwxr-x--- 4 root root 69 Jul 8 18:50 kcmd-common drwxr-x--- 4 root root 67 Jul 8 18:50 kcmd-util -rw-r----- 1 root root 80 Jul 8 13:57 pie.iml drwxr-x--- 3 root root 69 Jul 8 13:57 platform-service drwxr-x--- 3 root root 77 Jul 8 13:57 platform-service-api -rw-r----- 1 root root 17233 Jul 8 18:50 pom.xml drwxr-x--- 2 root root 36 Jul 8 18:50 target drwxr-x--- 3 root root 66 Jul 8 16:04 thirdbroker-service drwxr-x--- 3 root root 70 Jul 8 16:05 thirdbroker-service-api [root@localhost project1]# pwd
/root/.jenkins/workspace/project1
執行shell將maven打包的jar包移動到指定位置,后續進行鏡像制作
移動jar包的腳本
# !/bin/sh
filelist=`ls /root/.jenkins/workspace/project1/target` for file in $filelist do echo $file filename=${file%%-*} echo $filename if [ -f /home/pie/jar/$filename/$file ] then localtime=$(date "+%Y%m%d%H%M%S") mkdir /home/pie/jar/$filename/$localtime mv /home/pie/jar/$filename/$file /home/pie/jar/$filename/$localtime cp /root/.jenkins/workspace/project1/target/$file /home/pie/jar/$filename else cp /root/.jenkins/workspace/project1/target/$file /home/pie/jar/$filename fi done
第一部分的流程到這里就結束了,它的作用是gitlabpush代碼自動觸發流程打包成jar包並移動到jar到到指定位置,為后續的流程服務
第二部分流程
創建一個帶參數的流程-選擇需要更新的服務-打包docker鏡像-發布服務
創建一個帶參數的流程,和上面創建流程一樣
在General標簽中點擊-參數化構建過程-添加參數-extended choice parameter-Basic Parameter Types-Check Boxes
選擇框顯示條數為5,分隔符為",",在choose source for value中點擊value在內容中寫下你們微服務的服務名,用逗號隔開
構建標簽,選擇執行shell,腳本內容
保存,結束
cd /home/pie
OLD_IFS="$IFS"
IFS=","
service=($PROJECT_SERVICE)
IFS="$OLD_IFS"
for var in ${service[@]}
do
if [ var = "all" ]
then
docker-compose up -d --build
else
docker-compose up -d --build $var
fi
done
擴展內容
如果不使用docker-compose,使用kubernetes也是可以的,可以把docker-compose換成kubernetes的命令
我的思路是,參數構建流程選擇服務-將選擇服務的jar包移動到相應位置-執行如下腳本
啟動kubernetes的腳本如下
[root@linux1 bin]# cat start.sh #! /bin/bash # 獲取目錄中的jar包名稱 ls -l /sga/kubernetes/autostart/jar/ | awk '{print $9}' > /sga/kubernetes/autostart/name/jars sed -i '1d' /sga/kubernetes/autostart/name/jars sed -i 's/.jar//g' /sga/kubernetes/autostart/name/jars sed -i 's/kcmd-//g' /sga/kubernetes/autostart/name/jars # 遍歷所有在目錄中的jar包 for line in $(cat /sga/kubernetes/autostart/name/jars) do #echo $line docker images | grep kcmd-${line} | awk '{print $2}' > /sga/kubernetes/autostart/name/tag-${line} sed -i 's/^....//' /sga/kubernetes/autostart/name/tag-${line} i=$(head -n 1 /sga/kubernetes/autostart/name/tag-${line}) echo "原來docker版本為:1.0.$i" j=`expr $i + 1` echo "要新建的docker版本為:1.0.$j" # 對每個新jar包都執行創建鏡像的命令,並將鏡像推送到本地倉 docker build -t 192.168.0.11:5000/kcmd-$line:1.0.$j -f /sga/kubernetes/autostart/dockerfile/Dockerfile$line /sga/kubernetes/autostart/jar/ docker push 192.168.0.11:5000/kcmd-$line:1.0.$j done # 遍歷所有在目錄中的jar包 for line in $(cat /sga/kubernetes/autostart/name/jars) do # 獲取當前版本號,並生成需要創建的版本號 i=$(head -n 1 /sga/kubernetes/autostart/name/tag-${line}) echo "原本的版本=$i" j=`expr $i + 1` echo "需要創建的版本=$j" # 更改yaml文件中的版本信息 sed -i "18c \ image: 192.168.0.11:5000/kcmd-$line:1.0.$j" /sga/kubernetes/autostart/yaml/kcmd-${line}.yaml # 替換yaml文件中的image信息並運行新的鏡像 kubectl apply -f /sga/kubernetes/autostart/yaml/kcmd-${line}.yaml # --record $j #kubectl set image deployment/kcmd-${line} 192.168.0.11:5000/kcmd-${line}=192.168.0.11:5000/kcmd-{$line}:1.0.$j done #備份jar包 echo "備份jar包到/sga/kubernetes/autostart/backup" time=$( date +%Y%m%d_`date +%H%M%S`) echo $time mkdir /sga/kubernetes/autostart/backup/"jar_${time}" mv /sga/kubernetes/autostart/jar/* /sga/kubernetes/autostart/backup/"jar_${time}" echo "備份完成"