gitlab+jenkins+maven+docker(kubernetes)配置持續集成(流水線+腳本方式)


從零開始,一個人,從連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 "備份完成"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM