由于公司新项目线采用K8S来管理应用,所以会出现应用频繁发版的情况。
大致过程就是从gitlab上拉取代码,然后编译,修改配置文件为生产环境配置,通过写好的dockerfile打包应用成镜像,然后push到远程镜像仓库,最后通过kubectl set image实现服务无中断更新。
项目名称由两部分组成,“,”前面的是k8s中的deploymentName,“,”后面的是服务名称;这些参数在下面的执行时shell会使用到。
应用的git版本号,这个参数由用户传入。
boolean 类型的参数,用来判断应用是否为springboot项目,默认不勾选为springMVC项目
boolean 类型的参数,用来判断应用是否需要编译,默认勾选启用编译
choice 类型的参数,阿里云远程镜像仓库名称
远程镜像仓库名称,因为把镜像push到远程镜像仓库是需要用户名和密码的,这些参数作为参数传递进去。
是否需要更新应用镜像,默认勾选
选择生产环境执行在那个命名空间更新镜像
contentName="$project"
currentTime=`date "+%Y%m%d%H%M"`
echo $currentTime
export PATH="/opt/apache-maven-3.3.3/bin:$PATH"
projectVals=(${projectVals//,/ })
projectName=${projectVals[0]}
project=${projectVals[1]}
finalName=${projectVals[2]}
if [ "$finalName" == "" ]; then
finalName=$project
fi
tag=$finalName-${gitVersion##*/}-$currentTime
if [ "true" = "$isMvnBuild" ]; then
echo "编译开始……"
cd /programs
if [ -d $project ]; then
echo $project" is exist"
else
git clone [email protected]:backstage/$project.git
fi
cd /programs/$project/
if [ "true" = "$isMvnBuild" ]; then
git fetch origin
git checkout $gitVersion
git pull origin $gitVersion
fi
rm -rf ~/.m2/repository/com/mogucaifu/
if [ "mogu-im" = "$project" ]; then
sh insurance.sh
else
mvn clean package -Dmaven.test.skip=true
fi
echo "编译完成。"
fi
cd /programs/$project/
if [ "true" != "$isSpringBoot" ] ; then
cd target/$finalName/WEB-INF/classes
pwd
ls
if [ -f "$finalName-mq.properties" ] ; then
sed -i 's|.mg.addr|1-mg-addr|g' $finalName-mq.properties
sed -i 's|mq-mg-addr|mq1-mg-addr|g' $finalName-mq.properties
fi
echo "set prod zookeeper"
sed -i 's|{dubbo.registry.address}|{dubbo.registry.cluster.address}|g' $finalName-*.xml
if [ ! -z "`grep 'redis' $finalName-spring-context-server.xml`" ]; then
echo "set prod redis config"
sed -i 's|redis-cluster|redis|g' $finalName-spring-context-server.xml
sed -i 's|=redis.mg.addr|=mgy-insurance-redis.redis.rds.aliyuncs.com|g' $finalName-*redis.properties
sed -i 's|=Mogu07550831..|=Mogu07550831**|g' $finalName-*redis.properties
fi
if [ ! -z "`grep 'jdbc.properties' $finalName-spring-context-server.xml`" ]; then
echo "set prod mysql config"
sed -i 's|jdbc.mg.addr|mgy-insurance.mysql.rds.aliyuncs.com|g' *jdbc.properties
sed -i 's|jdbc.moni.username=moni|jdbc.moni.username=insurance|g' *jdbc.properties
sed -i 's|jdbc.moni.password=moni_test|jdbc.moni.password=Insurance07550831**|g' *jdbc.properties
sed -i 's|jdbc.game.username=game|jdbc.game.username=insurance|g' *jdbc.properties
sed -i 's|jdbc.game.password=game_test|jdbc.game.password=Insurance07550831**|g' *jdbc.properties
fi
if [ ! -z "`grep 'mongo.properties' $finalName-spring-context-server.xml`" ]; then
echo "set prod mongo config"
sed -i 's|=mongo.mg.addr:27017|=mgyinsurance.mongodb.rds.aliyuncs.com:3717,mgyinsurancesec.mongodb.rds.aliyuncs.com:3717|g' *-mongo.properties
sed -i 's|mongo.mg.addr|mgyinsurancesec.mongodb.rds.aliyuncs.com|g' *-mongo.properties
sed -i 's|mongo.readonly.mg.addr|mgyinsurancesec.mongodb.rds.aliyuncs.com|g' *-mongo.properties
sed -i 's|27017|3717|g' *-mongo.properties
fi
if [ ! -z "`grep 'redisson' $finalName-spring-context-server.xml`" ]; then
echo "set prod redisson config"
sed -i 's|redisson-cluster.xml|redisson.xml|g' $finalName-spring-context-server.xml
fi
if [ -f "mogu-user-center-server-conf.properties" ] ; then
sed -i 's|sys.orgId=1000|sys.orgId=12000|g' mogu-user-center-server-conf.properties
fi
cd /programs/$project/target
cp /programs/Dockerfile .
sed -i "s|{project}|${finalName}|g" Dockerfile
else
cd /programs/$project/target
jarfile=`ls *.jar | head -1`
pwd
ls
if [ "chicken-server" = "$project" ]; then
jar -xf $jarfile
sed -i 's|dubbo.registry.address|dubbo.registry2.address|g' BOOT-INF/classes/application.properties
sed -i 's|dubbo.registry.cluster.address|dubbo.registry.address|g' BOOT-INF/classes/application.properties
sed -i 's|jdbc.mg.addr|mgy-insurance.mysql.rds.aliyuncs.com|g' BOOT-INF/classes/application.properties
sed -i 's|spring.datasource.username=moni|spring.datasource.username=insurance|g' BOOT-INF/classes/application.properties
sed -i 's|spring.datasource.password=moni_test|spring.datasource.password=Insurance07550831**|g' BOOT-INF/classes/application.properties
sed -i 's|redis.conf.path=redis-cluster.properties|redis.conf.path=redis.properties|g' BOOT-INF/classes/application.properties
sed -i 's|redis.xml.path=chicken-server-redis-cluster.xml|redis.xml.path=chicken-server-redis.xml|g' BOOT-INF/classes/application.properties
sed -i 's|redis.mg.addr|mgy-insurance-redis.redis.rds.aliyuncs.com|g' BOOT-INF/classes/redis.properties
sed -i 's|Mogu07550831..|Mogu07550831**|g' BOOT-INF/classes/redis.properties
sed -i 's|.mg.addr|1-mg-addr|g' BOOT-INF/classes/chicken-server-mq.properties
sed -i 's|mq-mg-addr|mq1-mg-addr|g' BOOT-INF/classes/chicken-server-mq.properties
sed -i 's|=mongo.mg.addr|=mgyinsurance.mongodb.rds.aliyuncs.com|g' BOOT-INF/classes/mongodb.properties
sed -i 's|27017|3717|g' BOOT-INF/classes/mongodb.properties
cp -f BOOT-INF/classes/application.properties classes/
jar -uvf $jarfile BOOT-INF/classes/application.properties BOOT-INF/classes/mongodb.properties BOOT-INF/classes/redis.properties BOOT-INF/classes/chicken-server-mq.properties
fi
cp -f /programs/sbDockerfile Dockerfile
sed -i "s|{project}|${project}|g" Dockerfile
sed -i "s|{jarfile}|${jarfile}|g" Dockerfile
fi
sudo docker login --username $dockerHubName --password $dockerHubPasswd registry-internal.cn-shenzhen.aliyuncs.com
sudo docker build -t registry-internal.cn-shenzhen.aliyuncs.com/moguyun-prod/$dockerStore:$tag .
sudo docker push registry-internal.cn-shenzhen.aliyuncs.com/moguyun-prod/$dockerStore:$tag
echo "tag=${tag}" > /programs/temp-propfile.txt
echo "projectName=${projectName}" >> /programs/temp-propfile.txt
FROM registry.moguyun.com/tomcat:9.26
MAINTAINER XXX moguyun.com
ENV SOURCEPATH {project}
ENV TARGETPATH /opt/tomcat/webapps
ENV RUN_OPTION "-Xms1g -Xmx4g -Xmn256m -Dfile.encoding=UTF-8"
ADD $SOURCEPATH $TARGETPATH/$SOURCEPATH
RUN echo 'echo "export dubboPort=$DUBBO_PORT" >> /etc/profile' >> /bin/sysinit.sh
EXPOSE 8080
CMD ["sh", "-c", "/bin/sysinit.sh \"$RUN_OPTION\" \"$PNAME\" 0 \"$DUBBO_PORT\" "]
FROM registry.moguyun.com/centos:7.6
MAINTAINER XXX moguyun.com
ENV JAR_FILE {jarfile}
ENV RUN_PORT 8080
ENV RUN_OPTION "-server -Xms1g -Xmx4g -Xmn256m -Dfile.encoding=UTF-8"
COPY $JAR_FILE /opt/app.jar
COPY classes/application* /opt/
WORKDIR /opt
RUN cd /opt && mkdir logs && sh -c "touch /opt/app.jar"
ENTRYPOINT ["sh","-c","java $RUN_OPTION -jar app.jar --server.port=$RUN_PORT "]
echo "isUpdateDPM=${isUpdateDPM}"
echo "imageTag=${imageTag}"
echo "depName=${depName}"
echo "dockerStore=${dockerStore}"
echo "nameSpace=${nameSpace}"
if [ "true" = "$isUpdateDPM" ] ; then
kubectl set image deployment/$depName $depName=registry-vpc.cn-shenzhen.aliyuncs.com/XXXX/$dockerStore:$imageTag -n $nameSpace
fi