博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例
阅读量:7279 次
发布时间:2019-06-30

本文共 11147 字,大约阅读时间需要 37 分钟。

* 环境:

CentOS7
代码仓库:Gitlab
持续集成代码更新:Jenkins
构建打包:Maven
镜像自动交付脚本:Shell

基础环境软件安装:Gitlab、Jenkins、Maven配置,安装参考网上,这里安装略,重点介绍项目持续集成和镜像交付。

结合上一博文:
这里配置了两个基础服务容器的自动化构建,一个常规业务服务容器的自动化构建,其他的容器服务持续集成类似操作,这不做重复操作。


* 创建基础持续集成项目-config

1.1 创建自由风格的软件项目-Job,创建config-tmp-release

Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

1.2 创建maven项目-Job,创建基础项目config-tmp-ms

Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

1.3 配置config-tmp-ms基础项目

基于jdk8,配置config-tmp-ms项目Git代码仓库源,并选取release分支。
Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例
配置关联项目config-tmp-release:
Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例
构建命令及构建后操作脚本:
Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

1.4配置脚本

项目jar包同步脚本:/home/jenkins/docker-tmp/script/rsync.sh config-tmp-ms config-service

cat /home/jenkins/docker-tmp/script/rsync.sh#!/bin/baship=10.1.1.1  #docker tmp serverpasswd=******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::$1expect /home/jenkins/docker-test/script/image.exp $ip $passwd $1 $2 $3

其中config-tmp-ms必须跟项目job名称一样。$1为此项目job名称“config-tmp-ms”,$2为此项目代码git@gitlab.alaxiaoyou.com: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 -fset 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/bashnamems=$1namemsb=$2version=latestmsrepo=/data/docker/$1imgrepo=xmbabyimgname=$1if [ ! -d $msrepo ];thenmkdir -p $msreposcp jenkins@10.1.1.1:~/.jenkins/workspace/$1/target/alaxiaoyou-$2-0.0.1-SNAPSHOT.jar $msrepoecho "[$namems]" >> /etc/rsyncd.confecho "path=/data/docker/$namems/" >> /etc/rsyncd.confecho "comment = updateignore errorsread only = nolist = nohosts allow = 10.1.1.1/255.255.255.0auth users = rootuid = rootgid = rootsecrets file = /etc/rsyncd.secrets" >> /etc/rsyncd.confelseecho "开始构建docker镜像"fiecho "FROM registry-internal.cn-hangzhou.aliyuncs.com/xmbaby-pre/ms-jdk8" > $msrepo/dockerfileecho "MAINTAINER $namems "name@alaxiaoyou.com"" >> $msrepo/dockerfileecho "ADD alaxiaoyou-$namemsb-0.0.1-SNAPSHOT.jar /data/httpd/" >> $msrepo/dockerfileecho "WORKDIR /data/httpd/" >> $msrepo/dockerfileecho "ENTRYPOINT java -Xmx512m -Xss512k -jar alaxiaoyou-$namemsb-0.0.1-SNAPSHOT.jar" >> $msrepo/dockerfilecd $msrepodocker build -t ms/$namems .if [ $? -ne 0 ];thenecho "$namems 镜像构建失败,请检查dockerfile !"exitelseimageid=`docker images |grep "ms/$namems" |awk '{print $3}'`docker login --username=name@alaxiaoyou.com --password=****** registry-internal.cn-hangzhou.aliyuncs.comdocker tag $imageid registry-internal.cn-hangzhou.aliyuncs.com/$imgrepo/$imgname:$versiondocker push registry-internal.cn-hangzhou.aliyuncs.com/$imgrepo/$imgname:$versionfi

1.5 构建操作

Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

构建config-tmp-release项目,此项目执行完成后,自动构建关联的下级项目config-tmp-ms,config-tmp-ms项目会Jenkins中自动拉取最新代码,触发rsync同步脚本,rsync脚本里触发docker镜像build和push操作。Jenkins最终构建完成后,即可将镜像仓库拉取最新交付的镜像。


* 创建基础持续集成项目-gateway

2.1 创建自由风格的软件项目-Job,创建gateway-tmp-release

Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

2.2 创建maven项目-Job,创建基础项目gateway-tmp-ms

Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

2.3 配置gateway-tmp-ms基础项目

基于jdk8,配置gateway-tmp-ms项目Git代码仓库源,并选取release分支。
Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

配置关联项目gateway-tmp-release:

Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

配置构建前操作脚本,构建命令,构建后操作脚本:

Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

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/bashsed s/module/alaxiaoyou-$2/g  /home/jenkins/.jenkins/workspace/ms-tmp-configuration/module.yml > /home/jenkins/.jenkins/workspace/ms-tmp-configuration/bootstrap.ymlyes | 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为此项目代码git@gitlab.alaxiaoyou.com:xxx.git名称"api-gateway"。目的是自动替换各个provider配置,接下来后面各个provider自动替换。

模板文件:

cat /home/jenkins/.jenkins/workspace/ms-tmp-configuration/module.ymlspring:  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/baship=10.1.1.1  #docker tmp serverpasswd=******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::$1expect /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 -fset 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/bashnamems=$1namemsb=$2version=latestmsrepo=/data/docker/$1imgrepo=xmbabyimgname=$1if [ ! -d $msrepo ];thenmkdir -p $msreposcp jenkins@10.1.1.1:~/.jenkins/workspace/$1/target/alaxiaoyou-$2-0.0.1-SNAPSHOT.jar $msrepoecho "[$namems]" >> /etc/rsyncd.confecho "path=/data/docker/$namems/" >> /etc/rsyncd.confecho "comment = updateignore errorsread only = nolist = nohosts allow = 10.1.1.1/255.255.255.0auth users = rootuid = rootgid = rootsecrets file = /etc/rsyncd.secrets" >> /etc/rsyncd.confelseecho "开始构建docker镜像"fiecho "FROM registry-internal.cn-hangzhou.aliyuncs.com/xmbaby-pre/ms-jdk8" > $msrepo/dockerfileecho "MAINTAINER $namems "name@alaxiaoyou.com"" >> $msrepo/dockerfileecho "ADD alaxiaoyou-$namemsb-0.0.1-SNAPSHOT.jar /data/httpd/" >> $msrepo/dockerfileecho "WORKDIR /data/httpd/" >> $msrepo/dockerfileecho "ENTRYPOINT java -Xmx512m -Xss512k -jar alaxiaoyou-$namemsb-0.0.1-SNAPSHOT.jar" >> $msrepo/dockerfilecd $msrepodocker build -t ms/$namems .if [ $? -ne 0 ];thenecho "$namems 镜像构建失败,请检查dockerfile !"exitelseimageid=`docker images |grep "ms/$namems" |awk '{print $3}'`docker login --username=name@alaxiaoyou.com --password=****** registry-internal.cn-hangzhou.aliyuncs.comdocker tag $imageid registry-internal.cn-hangzhou.aliyuncs.com/$imgrepo/$imgname:$versiondocker push registry-internal.cn-hangzhou.aliyuncs.com/$imgrepo/$imgname:$versionfi

2.5 构建操作

Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

构建gateway-tmp-release项目,此项目执行完成后,自动构建关联的下级项目gateway-tmp-ms,gateway-tmp-ms项目会Jenkins中自动拉取最新代码,触发rsync同步脚本,rsync脚本里触发docker镜像build和push操作。Jenkins最终构建完成后,即可将镜像仓库拉取最新交付的镜像。


* 创建持续集成项目-sms

3.1 创建maven项目-Job,创建sms-tmp-release

Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

3.2 配置ms-tmp-release项目

基于jdk8,配置sms项目Git代码仓库源,并选取release分支。
Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

构建基于pom.xml进行构建

Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

3.3 创建maven项目-Job,创建sms-tmp-ms

Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

3.4 配置sms-tmp-ms项目

基于jdk8,配置sms项目Git代码仓库源,并选取release分支:
Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

配置关联项目sms-tmp-release:

Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

配置构建前操作脚本,构建命令,构建后操作脚本:

Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

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/bashsed s/module/alaxiaoyou-$2/g  /home/jenkins/.jenkins/workspace/ms-tmp-configuration/module.yml > /home/jenkins/.jenkins/workspace/ms-tmp-configuration/bootstrap.ymlyes | 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.ymlspring:  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为此项目代码git@gitlab.alaxiaoyou.com: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/baship=10.1.1.1  #docker tmp serverpasswd=******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::$1expect /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 -fset 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/bashnamems=$1namemsb=$2version=latestmsrepo=/data/docker/$1imgrepo=xmbabyimgname=$1if [ ! -d $msrepo ];thenmkdir -p $msreposcp jenkins@10.1.1.1:~/.jenkins/workspace/$1/target/alaxiaoyou-$2-0.0.1-SNAPSHOT.jar $msrepoecho "[$namems]" >> /etc/rsyncd.confecho "path=/data/docker/$namems/" >> /etc/rsyncd.confecho "comment = updateignore errorsread only = nolist = nohosts allow = 10.1.1.1/255.255.255.0auth users = rootuid = rootgid = rootsecrets file = /etc/rsyncd.secrets" >> /etc/rsyncd.confelseecho "开始构建docker镜像"fiecho "FROM registry-internal.cn-hangzhou.aliyuncs.com/xmbaby-pre/ms-jdk8" > $msrepo/dockerfileecho "MAINTAINER $namems "name@alaxiaoyou.com"" >> $msrepo/dockerfileecho "ADD alaxiaoyou-$namemsb-0.0.1-SNAPSHOT.jar /data/httpd/" >> $msrepo/dockerfileecho "WORKDIR /data/httpd/" >> $msrepo/dockerfileecho "ENTRYPOINT java -Xmx512m -Xss512k -jar alaxiaoyou-$namemsb-0.0.1-SNAPSHOT.jar" >> $msrepo/dockerfilecd $msrepodocker build -t ms/$namems .if [ $? -ne 0 ];thenecho "$namems 镜像构建失败,请检查dockerfile !"exitelseimageid=`docker images |grep "ms/$namems" |awk '{print $3}'`docker login --username=name@alaxiaoyou.com --password=****** registry-internal.cn-hangzhou.aliyuncs.comdocker tag $imageid registry-internal.cn-hangzhou.aliyuncs.com/$imgrepo/$imgname:$versiondocker push registry-internal.cn-hangzhou.aliyuncs.com/$imgrepo/$imgname:$versionfi

3.6 构建操作

Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

构建sms-tmp-release项目,此项目执行完成后,自动构建关联的下级项目sms-tmp-ms,sms-tmp-ms项目会Jenkins中自动拉取最新代码,触发rsync同步脚本,rsync脚本里触发docker镜像build和push操作。Jenkins最终构建完成后,即可将镜像仓库拉取最新交付的镜像。

3.7 发布已构建镜像

进入rancher控制台

添加服务tmp-sms-ms:

Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

映射卷:

Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

点击“创建”,选中“创建前总是拉取镜像”,rancher便会分发任务至agent,进行最新镜像的拉取。

其中镜像为已在rancher宿主机上,进行手动镜像构建交付到阿里云镜像仓库的。并非通过Jenkins自动构建交付到阿里云镜像仓库。

3.8 镜像升级、回滚操作

升级步骤:
停止该服务正在运行的容器
拉取最新镜像
运行新容器

回滚:

如果不单击rancher控制台右上角“Upgraded”,该服务可进行回滚操作。
rancher控制台上方为“stopped”状态的容器为旧容器,单击“启动”按钮可进行回滚;
下方为“Running”状态的容器为升级的容器,单击右上角“Upgraded”按钮可进行回滚;容器镜像升级完成,旧容器销毁。
Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

3.9 阿里云镜像仓库交付的镜像

Docker微服务-Jenkins+Gitlab+Maven+Shell自动化构建实施案例

说明:以上配置了两个基础服务容器的持续交付,一个常规服务容器的持续交付,其他的容器服务持续交付类似操作,这不做重复操作。其中,构建、推送镜像仓库的脚本里对应的IP配置为生产环境地址,由于此次测试环境为内网,无外网IP。所以,涉及到镜像的push操作无法操作成功。各个服务provider的打包,如要在Jenkins中自动操作,无法完成。所以,均从其他已打好包的服务器上拷贝过来,然后在rancher宿主机进行构建、推送push到阿里云镜像仓库。

转载于:https://blog.51cto.com/10874766/2354671

你可能感兴趣的文章
CYQ.Data 轻量数据访问层(二) 构造数据单元(上)
查看>>
华平视频监控系统守护新乡百姓“平安梦”
查看>>
提高安全性,macOS、iOS、tvOS、watchOS文件系统全部换新
查看>>
解决O2O产业信息安全问题—和多号
查看>>
比利时微电子研究中心向全球展示最新的高精度光伏模组产能预测模型
查看>>
网络安全公司Optiv欲进行IPO,计划融资1亿美元
查看>>
用大数据精准扶助贫困户
查看>>
采用超融合架构?还要看这三个关键
查看>>
“12345”智慧城市管理指挥平台下月上线
查看>>
外媒:FBI收买黑客破掉iPhone 非以色列公司帮助
查看>>
智慧城市备受期待却进展缓慢 问题出在哪?
查看>>
上海拟修订统计管理条例,大数据等问题或纳入立法范围
查看>>
大数据从何而来?这里有你不得不知的7个数据源供应平台
查看>>
通信公司让欧盟帮着一起建5G网络,这事不太容易
查看>>
思科助力网络行业做好准备 迎接数字化就绪网络转型
查看>>
斯诺登寻求“不引渡保证”遭挪威最高法院驳回
查看>>
破解三大壁垒重构物联网服务体系
查看>>
如何为稳定的云堆栈构建基础
查看>>
Line的IP孵化之路:QQ企鹅和Line之间隔着几个布朗熊?
查看>>
全国首个生物医疗开放大数据研究中心落沪,意欲突破行业困境
查看>>