1. 程式人生 > >Jenkins+Gitlab+Maven+Shell 進行Docker微服務項目自動化構建

Jenkins+Gitlab+Maven+Shell 進行Docker微服務項目自動化構建

logs try 分支 業務 print 服務 風格 acf jenkin

* 環境:
CentOS7
代碼倉庫:Gitlab
持續集成代碼更新:Jenkins
構建打包:Maven
鏡像自動交付腳本:Shell

基礎環境軟件安裝:Gitlab、Jenkins、Maven配置,安裝參考網上,這裏安裝略,重點介紹項目持續集成和鏡像交付。
結合上一博文:https://blog.51cto.com/10874766/2353577
這裏配置了兩個基礎服務容器的自動化構建,一個常規業務服務容器的自動化構建,其他的容器服務持續集成類似操作,這不做重復操作。


* 創建基礎持續集成項目-config

1.1 創建自由風格的軟件項目-Job,創建config-tmp-release
技術分享圖片

1.2 創建maven項目-Job,創建基礎項目config-tmp-ms

技術分享圖片

1.3 配置config-tmp-ms基礎項目
基於jdk8,配置config-tmp-ms項目Git代碼倉庫源,並選取release分支。
技術分享圖片
配置關聯項目config-tmp-release:
技術分享圖片
構建命令及構建後操作腳本:
技術分享圖片

1.4配置腳本
項目jar包同步腳本:/home/jenkins/docker-tmp/script/rsync.sh config-tmp-ms config-service

cat /home/jenkins/docker-tmp/script/rsync.sh
#!/bin/bash
ip=10.1.1.1  #docker tmp server
passwd=******
rsync -vzrtopg --numeric-ids --progress --password-file=/etc/rsyncd.password6 /home/jenkins/.jenkins/workspace/$1/target/alaxiaoyou-$2-0.0.1-SNAPSHOT.jar root@$ip::$1
expect /home/jenkins/docker-test/script/image.exp $ip $passwd $1 $2 $3

其中config-tmp-ms必須跟項目job名稱一樣。$1為此項目job名稱“config-tmp-ms”,$2為此項目代碼[email protected]:xxx/alaxiaoyou-config-service.git, provider:config-service。目的是自動替換各個provider配置。

expect腳本遠程觸發rancher服務器上腳本: /home/jenkins/docker-pro/script/image.exp

cat /home/jenkins/docker-pro/script/image.exp 
#!/usr/bin/expect -f
set ipaddress [lindex $argv 0]
set passwd [lindex $argv 1]
set msname [lindex $argv 2]
set msnameb [lindex $argv 3]

spawn ssh name@$ipaddress;
expect "password:";
send "$passwd\r";
expect "#"
send "sudo nohup /data/docker/layout-script/pro-all.sh $msname $msnameb  >> /data/docker/logs/$msname.log &\r"
expect eof {exit 1}

rancher server服務器上腳本,構建,推送push到阿裏鏡像倉庫:/data/docker/layout-script/pro-all.sh

#!/bin/bash
namems=$1
namemsb=$2
version=latest
msrepo=/data/docker/$1
imgrepo=xmbaby
imgname=$1

if [ ! -d $msrepo ];then

mkdir -p $msrepo

scp [email protected]:~/.jenkins/workspace/$1/target/alaxiaoyou-$2-0.0.1-SNAPSHOT.jar $msrepo
echo "[$namems]" >> /etc/rsyncd.conf
echo "path=/data/docker/$namems/" >> /etc/rsyncd.conf
echo "comment = update
ignore errors
read only = no
list = no
hosts allow = 10.1.1.1/255.255.255.0
auth users = root
uid = root
gid = root
secrets file = /etc/rsyncd.secrets" >> /etc/rsyncd.conf

else

echo "開始構建docker鏡像"

fi

echo "FROM registry-internal.cn-hangzhou.aliyuncs.com/xmbaby-pre/ms-jdk8" > $msrepo/dockerfile
echo "MAINTAINER $namems "[email protected]"" >> $msrepo/dockerfile
echo "ADD alaxiaoyou-$namemsb-0.0.1-SNAPSHOT.jar /data/httpd/" >> $msrepo/dockerfile
echo "WORKDIR /data/httpd/" >> $msrepo/dockerfile
echo "ENTRYPOINT java -Xmx512m -Xss512k -jar alaxiaoyou-$namemsb-0.0.1-SNAPSHOT.jar" >> $msrepo/dockerfile

cd $msrepo

docker build -t ms/$namems .

if [ $? -ne 0 ];then

echo "$namems 鏡像構建失敗,請檢查dockerfile !"
exit

else

imageid=`docker images |grep "ms/$namems" |awk ‘{print $3}‘`
docker login [email protected] --password=****** registry-internal.cn-hangzhou.aliyuncs.com
docker tag $imageid registry-internal.cn-hangzhou.aliyuncs.com/$imgrepo/$imgname:$version
docker push registry-internal.cn-hangzhou.aliyuncs.com/$imgrepo/$imgname:$version

fi

1.5 構建操作
技術分享圖片

構建config-tmp-release項目,此項目執行完成後,自動構建關聯的下級項目config-tmp-ms,config-tmp-ms項目會Jenkins中自動拉取最新代碼,觸發rsync同步腳本,rsync腳本裏觸發docker鏡像build和push操作。Jenkins最終構建完成後,即可將鏡像倉庫拉取最新交付的鏡像。


* 創建基礎持續集成項目-gateway

2.1 創建自由風格的軟件項目-Job,創建gateway-tmp-release
技術分享圖片

2.2 創建maven項目-Job,創建基礎項目gateway-tmp-ms
技術分享圖片

2.3 配置gateway-tmp-ms基礎項目
基於jdk8,配置gateway-tmp-ms項目Git代碼倉庫源,並選取release分支。
技術分享圖片

配置關聯項目gateway-tmp-release:
技術分享圖片

配置構建前操作腳本,構建命令,構建後操作腳本:
技術分享圖片

2.4配置腳本
構建前配置模板替換,配置成相應的provider,這裏為gateway provider:
腳本:sh /home/jenkins/docker-tmp/script/configuration.sh gateway-tmp-ms api-gateway

cat /home/jenkins/docker-tmp/script/configuration.sh
#!/bin/bash
sed s/module/alaxiaoyou-$2/g  /home/jenkins/.jenkins/workspace/ms-tmp-configuration/module.yml > /home/jenkins/.jenkins/workspace/ms-tmp-configuration/bootstrap.yml
yes | cp -rfp /home/jenkins/.jenkins/workspace/ms-tmp-configuration/bootstrap.yml /home/jenkins/.jenkins/workspace/$1/src/main/resources/

其中gateway-tmp-ms必須跟項目job名稱一樣。$1為此項目job名稱“gateway-tmp-ms”,$2為此項目代碼[email protected]:xxx.git名稱"api-gateway"。目的是自動替換各個provider配置,接下來後面各個provider自動替換。

模板文件:

cat /home/jenkins/.jenkins/workspace/ms-tmp-configuration/module.yml
spring:
  application:
    name: module 
  cloud:
    zookeeper:
      connect-string: zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
    config:
      uri: http://msconfig:20000

構建後配置,項目包(maven打包)同步腳本rsync,從git倉庫服務器拉取代碼打包後,包同步到docker-tmp服務器(rancher服務器)中:
項目jar包同步腳本:sh /home/jenkins/docker-tmp/script/rsync.sh gateway-tmp-ms api-gateway

cat /home/jenkins/docker-tmp/script/rsync.sh
#!/bin/bash
ip=10.1.1.1  #docker tmp server
passwd=******
rsync -vzrtopg --numeric-ids --progress --password-file=/etc/rsyncd.password6 /home/jenkins/.jenkins/workspace/$1/target/alaxiaoyou-$2-0.0.1-SNAPSHOT.jar root@$ip::$1
expect /home/jenkins/docker-tmp/script/image.exp $ip $passwd $1 $2 $3

expect腳本遠程觸發rancher服務器上腳本: /home/jenkins/docker-tmp/script/image.exp

cat /home/jenkins/docker-tmp/script/image.exp
#!/usr/bin/expect -f
set ipaddress [lindex $argv 0]
set passwd [lindex $argv 1]
set msname [lindex $argv 2]
set msnameb [lindex $argv 3]
set jvm [lindex $argv 4]

spawn ssh name@$ipaddress;
expect "password:";
send "$passwd\r";
expect "#"
send "sudo nohup /data/docker/layout-script/all.sh $msname $msnameb $jvm  >> /data/docker/logs/$msname.log &\r"

rancher server服務器上腳本,構建,推送push到阿裏鏡像倉庫:/data/docker/layout-script/all.sh

#!/bin/bash
namems=$1
namemsb=$2
version=latest
msrepo=/data/docker/$1
imgrepo=xmbaby
imgname=$1

if [ ! -d $msrepo ];then

mkdir -p $msrepo

scp [email protected]:~/.jenkins/workspace/$1/target/alaxiaoyou-$2-0.0.1-SNAPSHOT.jar $msrepo

echo "[$namems]" >> /etc/rsyncd.conf
echo "path=/data/docker/$namems/" >> /etc/rsyncd.conf
echo "comment = update
ignore errors
read only = no
list = no
hosts allow = 10.1.1.1/255.255.255.0
auth users = root
uid = root
gid = root
secrets file = /etc/rsyncd.secrets" >> /etc/rsyncd.conf

else

echo "開始構建docker鏡像"

fi

echo "FROM registry-internal.cn-hangzhou.aliyuncs.com/xmbaby-pre/ms-jdk8" > $msrepo/dockerfile
echo "MAINTAINER $namems "[email protected]"" >> $msrepo/dockerfile
echo "ADD alaxiaoyou-$namemsb-0.0.1-SNAPSHOT.jar /data/httpd/" >> $msrepo/dockerfile
echo "WORKDIR /data/httpd/" >> $msrepo/dockerfile
echo "ENTRYPOINT java -Xmx512m -Xss512k -jar alaxiaoyou-$namemsb-0.0.1-SNAPSHOT.jar" >> $msrepo/dockerfile

cd $msrepo

docker build -t ms/$namems .

if [ $? -ne 0 ];then

echo "$namems 鏡像構建失敗,請檢查dockerfile !"
exit

else

imageid=`docker images |grep "ms/$namems" |awk ‘{print $3}‘`
docker login [email protected] --password=****** registry-internal.cn-hangzhou.aliyuncs.com
docker tag $imageid registry-internal.cn-hangzhou.aliyuncs.com/$imgrepo/$imgname:$version
docker push registry-internal.cn-hangzhou.aliyuncs.com/$imgrepo/$imgname:$version

fi

2.5 構建操作
技術分享圖片

構建gateway-tmp-release項目,此項目執行完成後,自動構建關聯的下級項目gateway-tmp-ms,gateway-tmp-ms項目會Jenkins中自動拉取最新代碼,觸發rsync同步腳本,rsync腳本裏觸發docker鏡像build和push操作。Jenkins最終構建完成後,即可將鏡像倉庫拉取最新交付的鏡像。


* 創建持續集成項目-sms

3.1 創建maven項目-Job,創建sms-tmp-release
技術分享圖片

3.2 配置ms-tmp-release項目
基於jdk8,配置sms項目Git代碼倉庫源,並選取release分支。
技術分享圖片

構建基於pom.xml進行構建
技術分享圖片

3.3 創建maven項目-Job,創建sms-tmp-ms
技術分享圖片

3.4 配置sms-tmp-ms項目
基於jdk8,配置sms項目Git代碼倉庫源,並選取release分支:
技術分享圖片

配置關聯項目sms-tmp-release:
技術分享圖片

配置構建前操作腳本,構建命令,構建後操作腳本:
技術分享圖片

3.5配置腳本
構建前配置模板替換,配置成相應的provider,這裏為sms provider:
腳本:sh /home/jenkins/docker-tmp/script/configuration.sh sms-tmp-ms sms-provider

cat /home/jenkins/docker-tmp/script/configuration.sh sms-tmp-ms sms-provider
#!/bin/bash
sed s/module/alaxiaoyou-$2/g  /home/jenkins/.jenkins/workspace/ms-tmp-configuration/module.yml > /home/jenkins/.jenkins/workspace/ms-tmp-configuration/bootstrap.yml
yes | cp -rfp /home/jenkins/.jenkins/workspace/ms-tmp-configuration/bootstrap.yml /home/jenkins/.jenkins/workspace/$1/src/main/resources/

模板文件:

cat /home/jenkins/.jenkins/workspace/ms-tmp-configuration/module.yml
spring:
  application:
    name: module 
  cloud:
    zookeeper:
      connect-string: zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
    config:
      uri: http://msconfig:20000

其中sms-tmp-ms必須跟項目job名稱一樣。$1為此項目job名稱“sms-tmp-ms”,$2為此項目代碼[email protected]:xxx.git名稱"sms-provider"。目的是自動替換各個provider配置。

構建後配置,項目包(maven打包)同步腳本rsync,從git倉庫服務器拉取代碼打包後,包同步到docker-tmp服務器(rancher服務器)中:
腳本:sh /home/jenkins/docker-tmp/script/rsync.sh sms-tmp-ms sms-provider 256m

cat /home/jenkins/docker-tmp/script/rsync.sh  sms-tmp-ms sms-provider 256m
#!/bin/bash
ip=10.1.1.1  #docker tmp server
passwd=******
rsync -vzrtopg --numeric-ids --progress --password-file=/etc/rsyncd.password6 /home/jenkins/.jenkins/workspace/$1/target/alaxiaoyou-$2-0.0.1-SNAPSHOT.jar root@$ip::$1
expect /home/jenkins/docker-test/script/image.exp $ip $passwd $1 $2 $3

Jenkins和rancher不在同一臺服務器行,用shell expect腳本遠程觸發rancher服務器上腳本:

cat /home/jenkins/docker-test/script/image.exp
#!/usr/bin/expect -f
set ipaddress [lindex $argv 0]
set passwd [lindex $argv 1]
set msname [lindex $argv 2]
set msnameb [lindex $argv 3]
set jvm [lindex $argv 4]

spawn ssh name@$ipaddress;
expect "password:";
send "$passwd\r";
expect "#"
send "sudo nohup /data/docker/layout-script/all.sh $msname $msnameb $jvm  >> /data/docker/logs/$msname.log &\r"
expect eof {exit 1}

rancher server服務器上腳本,構建,推送push到阿裏鏡像倉庫:/data/docker/layout-script/all.sh

#!/bin/bash
namems=$1
namemsb=$2
version=latest
msrepo=/data/docker/$1
imgrepo=xmbaby
imgname=$1

if [ ! -d $msrepo ];then

mkdir -p $msrepo

scp [email protected]:~/.jenkins/workspace/$1/target/alaxiaoyou-$2-0.0.1-SNAPSHOT.jar $msrepo

echo "[$namems]" >> /etc/rsyncd.conf
echo "path=/data/docker/$namems/" >> /etc/rsyncd.conf
echo "comment = update
ignore errors
read only = no
list = no
hosts allow = 10.1.1.1/255.255.255.0
auth users = root
uid = root
gid = root
secrets file = /etc/rsyncd.secrets" >> /etc/rsyncd.conf

else

echo "開始構建docker鏡像"

fi

echo "FROM registry-internal.cn-hangzhou.aliyuncs.com/xmbaby-pre/ms-jdk8" > $msrepo/dockerfile
echo "MAINTAINER $namems "[email protected]"" >> $msrepo/dockerfile
echo "ADD alaxiaoyou-$namemsb-0.0.1-SNAPSHOT.jar /data/httpd/" >> $msrepo/dockerfile
echo "WORKDIR /data/httpd/" >> $msrepo/dockerfile
echo "ENTRYPOINT java -Xmx512m -Xss512k -jar alaxiaoyou-$namemsb-0.0.1-SNAPSHOT.jar" >> $msrepo/dockerfile

cd $msrepo

docker build -t ms/$namems .

if [ $? -ne 0 ];then

echo "$namems 鏡像構建失敗,請檢查dockerfile !"
exit

else

imageid=`docker images |grep "ms/$namems" |awk ‘{print $3}‘`
docker login [email protected] --password=****** registry-internal.cn-hangzhou.aliyuncs.com
docker tag $imageid registry-internal.cn-hangzhou.aliyuncs.com/$imgrepo/$imgname:$version
docker push registry-internal.cn-hangzhou.aliyuncs.com/$imgrepo/$imgname:$version

fi

3.6 構建操作
技術分享圖片

構建sms-tmp-release項目,此項目執行完成後,自動構建關聯的下級項目sms-tmp-ms,sms-tmp-ms項目會Jenkins中自動拉取最新代碼,觸發rsync同步腳本,rsync腳本裏觸發docker鏡像build和push操作。Jenkins最終構建完成後,即可將鏡像倉庫拉取最新交付的鏡像。

3.7 發布已構建鏡像
進入rancher控制臺

添加服務tmp-sms-ms:
技術分享圖片

映射卷:
技術分享圖片

點擊“創建”,選中“創建前總是拉取鏡像”,rancher便會分發任務至agent,進行最新鏡像的拉取。
其中鏡像為已在rancher宿主機上,進行手動鏡像構建交付到阿裏雲鏡像倉庫的。並非通過Jenkins自動構建交付到阿裏雲鏡像倉庫。

3.8 鏡像升級、回滾操作
升級步驟:
停止該服務正在運行的容器
拉取最新鏡像
運行新容器

回滾:
如果不單擊rancher控制臺右上角“Upgraded”,該服務可進行回滾操作。
rancher控制臺上方為“stopped”狀態的容器為舊容器,單擊“啟動”按鈕可進行回滾;
下方為“Running”狀態的容器為升級的容器,單擊右上角“Upgraded”按鈕可進行回滾;容器鏡像升級完成,舊容器銷毀。
技術分享圖片

3.9 阿裏雲鏡像倉庫交付的鏡像
技術分享圖片

說明:以上配置了兩個基礎服務容器的持續交付,一個常規服務容器的持續交付,其他的容器服務持續交付類似操作,這不做重復操作。其中,構建、推送鏡像倉庫的腳本裏對應的IP配置為生產環境地址,由於此次測試環境為內網,無外網IP。所以,涉及到鏡像的push操作無法操作成功。各個服務provider的打包,如要在Jenkins中自動操作,無法完成。所以,均從其他已打好包的服務器上拷貝過來,然後在rancher宿主機進行構建、推送push到阿裏雲鏡像倉庫。

Jenkins+Gitlab+Maven+Shell 進行Docker微服務項目自動化構建