基于【SpringBoot】的微服务【Jenkins】自动化部署
最近,也是抽空整理了一些在工作中积累的经验,通过博客记录下来分享给大家,希望能对大家有所帮助;
一、关于自动化部署
关于自动化部署的优点,我就不在这里赘述了;只要想想手工打包、上传、部署、重启的种种,就会有很多场景历历在目,相信经历过的朋友都能体会其中的酸甜苦辣;
而一旦到了大型项目,比如所微服务化之后的项目,不仅仅功能模块多,而且都不再是单机部署;并且一搞大型活动就是动不动几十个节点的大集群部署,想要靠手工再来完成这些操作,那就等着玩死自己吧;
那么,如果把这一切都交给Jenkins来管理,你要做的就是在页面轻点鼠标,接下来就是刷刷手机、喝喝茶。。。哈哈哈哈
二、环境介绍
--centos 7
--Jenkins v.2.121.3
--JDK 1.8
--SpringBoot+Maven+Git
三、项目中要完成的操作
这里,我们借助了maven-assembly-plugin来完成打包,操作如下;
1、第一步,在项目的pom.xml文件中加入如下的配置:
<build>
<finalName>bm-demo-admin</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<!--指定main入口-->
<mainClass>cn.com.bluemoon.admin.web.WebAdminApplication</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
</archive>
<excludes>
<include>*.xml</include>
<include>*.yml</include>
<include>*.json</include>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<!-- not append assembly id in release file name -->
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<!--打包的详细描述,需要配置额外文件-->
<descriptor>src/assembly/assembly-descriptor.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
2、在项目的src目录下,新建assembly目录,新建assembly-descriptor.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<id>bin</id>
<!-- 最终打包成一个用于发布的zip文件 -->
<formats>
<format>tar.gz</format>
</formats>
<fileSets>
<!-- 打包jar文件 -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*.jar</include>
</includes>
<fileMode>0755</fileMode>
<lineEnding>unix</lineEnding>
</fileSet>
<!-- 把项目相关的启动脚本,打包进zip文件的bin目录 -->
<fileSet>
<directory>${project.basedir}/src/main/scripts</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*</include>
</includes>
<fileMode>0755</fileMode>
<lineEnding>unix</lineEnding>
</fileSet> <!-- 把项目的配置文件,打包进zip文件的config目录 -->
<fileSet>
<directory>${project.build.directory}/classes</directory>
<outputDirectory>conf</outputDirectory>
<includes>
<include>*.xml</include>
<include>*.yml</include>
<include>*.json</include>
</includes>
</fileSet>
</fileSets>
<!-- 把项目的依赖的jar打包到lib目录下 -->
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
<scope>runtime</scope>
<excludes>
<exclude>${groupId}:${artifactId}</exclude>
</excludes>
</dependencySet>
</dependencySets>
</assembly>
3、在src/main目录下新建scripts文件下,加入restart.sh、start.sh、stop.sh脚本,内容分别如下:
restart.sh
#!/bin/sh
./stop.sh
./start.sh
start.sh
#!/bin/sh
export JAVA_HOME=$JAVA_HOME
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PIDFILE=service.pid
ROOT_DIR="$(cd $(dirname $0) && pwd)"
CLASSPATH=./*:$ROOT_DIR/lib/*:$ROOT_DIR/conf/
JAVA_OPTS="-Xms256m -Xmx512m -XX:+UseParallelGC"
MAIN_CLASS=cn.com.bluemoon.admin.web.WebAdminApplication
if [ ! -d "logs" ]; then
mkdir logs
fi
if [ -f "$PIDFILE" ]; then
echo "Service is already start ..."
else
echo "Service start ..."
nohup java $JAVA_OPTS -cp $CLASSPATH $MAIN_CLASS 1> logs/bm-demo-admin.out 2>&1 &
printf '%d' $! > $PIDFILE
echo "Service start SUCCESS "
fi
stop.sh
#!/bin/sh
PIDFILE=service.pid
if [ -f "$PIDFILE" ]; then
kill -9 `cat $PIDFILE`
rm -rf $PIDFILE
echo "Service is stop SUCCESS!"
else
echo "Service is already stop ..."
fi
四、新建Jenkins任务
这里就不在介绍如何安装Jenkins,以及Jenkins的环境配置,包括git,mave,node.js等,网上有很多的博客讲这一块,可以自己找一下;
1、选择新建任务=>构建一个maven项目,输入任务的名称
2、添加描述,选择添加构建参数等等
3、勾选丢弃旧的构建,保持构建天数 7天,保持最大构建个数 3个,这里可以自己选择,主要是用于回滚
4、勾选参数化构建过程,添加字符参数
这里有必要解释一下添加的参数
brunch git的分支,作为部署时的可修改参数
target_host 部署的目标机器,可以是ip,也可以在hosts里面添加代理(后面补充)
war_path 项目打包完成之后的包所在路径
deploy_path 部署在目标服务器上面的路径
app_name 部署的应用的名称
tar_name 打包完成之后的压缩包的名字(这里不是达成jar,而是压缩包)
5、在源码管理=》勾选git 添加仓库地址和用户权限
6、构建触发器和构建环境可以根据自己的需要选择,我这里没有选择
7、Build中添加参数
8、添加shell命令
cd /data/ansible/jenkins-ansible-supervisor-deploy
ansible-playbook -i hosts om-platform.yml --verbose --extra-vars "target_host=$target_host
deploy_path=$deploy_path deploy_war_path=$WORKSPACE/$war_path tar_name=$tar_name app_name=$app_name"
如上是执行的shell命令,这里解释两个文件,一个是om-platform.yml,内容贴出来看一下:
---
# This playbook deploys a simple standalone Tomcat 7 server. - hosts: "{{ target_host }}"
user: appadm roles:
- om-platform-deploy
一个是hosts 也就是host文件,在上面target_host中配置了别名的话,就需要在此处的hosts文件中定义:
比如你要部署的节点服务是两个节点的,那你就可以针对240.62/63添加一个叫bm_mana_11_11_test的别名,那么部署的时候在target_host参数中添加别名代替就可以一次部署完毕了;
最后保存,任务就新建完了,当然,如果有其他的需要你可以自己行选择;
9、在目标服务器上的部署目录/home/appadm 下添加init.sh文件,内容如下:
# init.sh 初始化项目
#!/bin/sh serverName=$1 if [ ! $serverName ]; then
echo "请输入正确的启动服务包名。。"
else
#echo "$serverName 正准备启动,请稍候。。。"
cd "/home/appadm/$serverName"
echo "/home/appadm$serverName"
#./start.sh
#nohup java -jar $serverName &
#echo "the ${serverName} 启动完成。。。"
fi
一般,我们在部署时,就会操作这个界面来修改参数部署
四、补充说明
这里要补充说明的是,jenkins的机器和目标服务器之间是需要做SSH KEY的,关于怎么完成这一步其实也很简单,就是生成信任的key,具体操作就由度娘来介绍吧;
那么,到这里关于怎么完成项目的自动化部署,基本上就介绍完了,开始构建,并构建成功之后,就会在自动去git拉去代码,并且打包完成并发送到对应的服务器目录,完成重启操作;
如果有什么疑问,欢迎大家提问和讨论;如有不对之处,恳请批评指正;如果觉得对您有所帮忙,那么也请您赏个赞;
基于【SpringBoot】的微服务【Jenkins】自动化部署的更多相关文章
- 基于 Docker 的微服务架构实践
本文来自作者 未闻 在 GitChat 分享的{基于 Docker 的微服务架构实践} 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 D ...
- 解读与部署(三):基于 Kubernetes 的微服务部署即代码
在基于 Kubernetes 的基础设施即代码一文中,我概要地介绍了基于 Kubernetes 的 .NET Core 微服务和 CI/CD 动手实践工作坊使用的基础设施是如何使用代码描述的,以及它的 ...
- springboot docker jenkins 自动化部署并上传镜像
springboot + docker + jenkins自动化部署项目,jenkins.mysql.redis都是docker运行的,并且没有使用虚拟机,就在阿里云服务器(centos7)运行 1. ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十三)——istio+dapr构建多运行时服务网格之生产环境部署
之前所有的演示都是在docker for windows上进行部署的,没有真正模拟生产环境,今天我们模拟真实环境在公有云上用linux操作如何实现istio+dapr+电商demo的部署. 目录:一. ...
- Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成——部署方案优化
Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成--部署方案优化 之前我们做的方案部署都是只能选择一个微服务部署并只有一台生产服务器,每个微服务只有一个 ...
- 基于kubernetes平台微服务的部署
基于kubernetes平台微服务的部署 首先下载插件: kubernetes Continuous Deploy 然后去找 .kube/ 里的config 复制里面的内容 去添加凭据: 然后就是脚本 ...
- 基于LadybugFlow的微服务编排(1.SpringBoot集成)
前言 前面的系列文章里,介绍了ladybugflow的业务可视化的设计以及常见场景的使用方法. 感谢大家对项目的关注. 本篇文章介绍一下基于ladybugflow的微服务编排场景及使用方法. 1. 业 ...
- 云端基于Docker的微服务与持续交付实践
云端基于Docker的微服务与持续交付实践笔记,是基于易立老师在阿里巴巴首届在线技术峰会上<云端基于Docker的微服务与持续交付实践>总结而出的. 本次主要讲了什么? Docker Sw ...
- Jenkins自动化部署入门详细教程
大纲 1.背景 在实际开发中,我们经常要一边开发一边测试,当然这里说的测试并不是程序员对自己代码的单元测试,而是同组程序员将代码提交后,由测试人员测试: 或者前后端分离后,经常会修改接口,然后重新部署 ...
- 传统保险企业基于 Dubbo 的微服务实践
本文整理自中国人寿保险(海外)股份有限公司深圳中心技术总监家黄晓彬在 Dubbo 社区开发者日深圳站的现场分享. 中国人寿保险(海外)股份有限公司负责香港.澳门.新加坡和印尼的业务开发,和国内业务不同 ...
随机推荐
- root用户不能改动iptables
需求:因为防火墙做了IP和port限制,如今须要加入一条规则使之能够訪问指定的IP和port. vi /etc/sysconfig/iptables, 加入完毕后,wq保存,提示文件仅仅读无法保存.! ...
- 修改android手机文件权限
修改android手机文件权限 默认情况下,一个应用肯定是读取不了另外一个应用的数据的,因为权限不够.但是我们一定要读,怎么办? 修改我们要读取文件的权限. Android是基于Linux的,所以修改 ...
- day63-webservice 08.在web项目中配置带有接口的webservice服务
这个是配置带有接口的WebService的服务. http://localhost:8080/cxf-web-server/service 带有接口的实现类也给它做好了.jaxws:endpoint是 ...
- php手机号码验证正则表达式
移动:134.135.136.137.138.139.150.151.152.157.158.159.182.183.184.187.188.178(4G).147(上网卡): 联通:130.131. ...
- 【转】Java的可变类与不可变类
1.可变类和不可变类(Mutable and Immutable Objects)的初步定义: 可变类:当你获得这个类的一个实例引用时,你可以改变这个实例的内容. 不可变类:当你获得这个类的一个实例引 ...
- Python基本数据类型之字典dict
字典dict 是一个键(key)值(value)对,结构为{},大括号 创建字典 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 info = { # k ...
- flex知识点精炼
原址:http://www.runoob.com/w3cnote/flex-grammar.html 容器的属性 设置Flex布局之后,子元素的float.clear.vertical align将失 ...
- Python 之 基础知识(二)
一.分支运算 在Python 2.x中判断不等于还可以用<> if语句进阶:elif if 条件1: ...... elif 条件2: ...... else: ...... 二.逻辑运算 ...
- iOS11关于隐藏导航栏后带有tableView界面出现,下移问题
//解决iOS11关于隐藏导航栏后带有scrollView界面出现,下移问题 if (@available(iOS 11.0, *)) { self.tableView.contentInsetAdj ...
- QS之vsim
vsim - The vsim command invokes the VSIM simulator -L <library_name> … (optional) Specifies th ...