阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

214次阅读
没有评论

共计 10478 个字符,预计需要花费 27 分钟才能阅读完成。

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

基础环境软件安装:Gitlab、Jenkins、Maven 配置,安装参考网上,这里安装略,重点介绍项目持续集成和镜像交付。
结合上一博文:https://www.linuxidc.com/Linux/2019-02/157106.htm
这里配置了两个基础服务容器的自动化构建,一个常规业务服务容器的自动化构建,其他的容器服务持续集成类似操作,这不做重复操作。


* 创建基础持续集成项目 -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/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 为此项目代码 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 -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 jenkins@10.1.1.1:~/.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"name@alaxiaoyou.com"" >> $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 --username=name@alaxiaoyou.com --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 构建操作
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/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 为此项目代码 git@gitlab.alaxiaoyou.com: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 jenkins@10.1.1.1:~/.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"name@alaxiaoyou.com"" >> $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 --username=name@alaxiaoyou.com --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 构建操作
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/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 为此项目代码 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/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 jenkins@10.1.1.1:~/.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"name@alaxiaoyou.com"" >> $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 --username=name@alaxiaoyou.com --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 构建操作
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 到阿里云镜像仓库。

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计10478字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中