Docker微服務-Jenkins+GitLab+Maven+Shell自動化構建實施案例
* 環境:
CentOS 7
程式碼倉庫:Gitlab
持續整合程式碼更新:Jenkins
構建打包:Maven
映象自動交付指令碼:Shell
基礎環境軟體安裝:Gitlab、Jenkins、Maven配置,安裝參考網上,這裡安裝略,重點介紹專案持續整合和映象交付。
結合上一博文: https://www.linuxidc.com/Linux/2019-02/157106.htm
這裡配置了兩個基礎服務容器的自動化構建,一個常規業務服務容器的自動化構建,其他的容器服務持續整合類似操作,這不做重複操作。
* 建立基礎持續整合專案-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.shsms-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到阿里雲映象倉庫。
Linux公社的RSS地址 : https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址: https://www.linuxidc.com/Linux/2019-02/157107.htm