最近,也是抽空整理了一些在工做中积累的经验,经过博客记录下来分享给你们,但愿能对你们有所帮助;java
关于自动化部署的优势,我就不在这里赘述了;只要想一想手工打包、上传、部署、重启的种种,就会有不少场景历历在目,相信经历过的朋友都能体会其中的酸甜苦辣;node
而一旦到了大型项目,好比所微服务化以后的项目,不只仅功能模块多,并且都再也不是单机部署;而且一搞大型活动就是动不动几十个节点的大集群部署,想要靠手工再来完成这些操做,那就等着玩死本身吧;git
那么,若是把这一切都交给Jenkins来管理,你要作的就是在页面轻点鼠标,接下来就是刷刷手机、喝喝茶。。。哈哈哈哈web
--centos 7shell
--Jenkins v.2.121.3apache
--JDK 1.8json
--SpringBoot+Maven+Gitcentos
这里,咱们借助了maven-assembly-plugin来完成打包,操做以下;服务器
<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>
<?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>
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的环境配置,包括git,mave,node.js等,网上有不少的博客讲这一块,能够本身找一下;
这里有必要解释一下添加的参数
brunch git的分支,做为部署时的可修改参数
target_host 部署的目标机器,能够是ip,也能够在hosts里面添加代理(后面补充)
war_path 项目打包完成以后的包所在路径
deploy_path 部署在目标服务器上面的路径
app_name 部署的应用的名称
tar_name 打包完成以后的压缩包的名字(这里不是达成jar,而是压缩包)
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参数中添加别名代替就能够一次部署完毕了;
最后保存,任务就新建完了,固然,若是有其余的须要你能够本身行选择;
九、在目标服务器上的部署目录/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拉去代码,而且打包完成并发送到对应的服务器目录,完成重启操做;
若是有什么疑问,欢迎你们提问和讨论;若有不对之处,恳请批评指正;若是以为对您有所帮忙,那么也请您赏个赞;