基于【SpringBoot】的微服务【Jenkins】自动化部署

  最近,也是抽空整理了一些在工做中积累的经验,经过博客记录下来分享给你们,但愿能对你们有所帮助;java

1、关于自动化部署

  关于自动化部署的优势,我就不在这里赘述了;只要想一想手工打包、上传、部署、重启的种种,就会有不少场景历历在目,相信经历过的朋友都能体会其中的酸甜苦辣;node

而一旦到了大型项目,好比所微服务化以后的项目,不只仅功能模块多,并且都再也不是单机部署;而且一搞大型活动就是动不动几十个节点的大集群部署,想要靠手工再来完成这些操做,那就等着玩死本身吧;git

那么,若是把这一切都交给Jenkins来管理,你要作的就是在页面轻点鼠标,接下来就是刷刷手机、喝喝茶。。。哈哈哈哈web

2、环境介绍

  --centos 7shell

  --Jenkins v.2.121.3apache

     --JDK 1.8json

  --SpringBoot+Maven+Gitcentos

3、项目中要完成的操做

  这里,咱们借助了maven-assembly-plugin来完成打包,操做以下;服务器

  一、第一步,在项目的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>

  二、在项目的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>

  三、在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

4、新建Jenkins任务

  这里就不在介绍如何安装Jenkins,以及Jenkins的环境配置,包括git,mave,node.js等,网上有不少的博客讲这一块,能够本身找一下;

  一、选择新建任务=>构建一个maven项目,输入任务的名称

  二、添加描述,选择添加构建参数等等

 

   三、勾选丢弃旧的构建,保持构建天数 7天,保持最大构建个数 3个,这里能够本身选择,主要是用于回滚

  四、勾选参数化构建过程,添加字符参数

  这里有必要解释一下添加的参数

  brunch  git的分支,做为部署时的可修改参数

  target_host 部署的目标机器,能够是ip,也能够在hosts里面添加代理(后面补充)

  war_path 项目打包完成以后的包所在路径

  deploy_path 部署在目标服务器上面的路径

  app_name 部署的应用的名称

  tar_name 打包完成以后的压缩包的名字(这里不是达成jar,而是压缩包)

  五、在源码管理=》勾选git 添加仓库地址和用户权限

  六、构建触发器和构建环境能够根据本身的须要选择,我这里没有选择

 

   七、Build中添加参数

  八、添加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参数中添加别名代替就能够一次部署完毕了;

 最后保存,任务就新建完了,固然,若是有其余的须要你能够本身行选择;

  九、在目标服务器上的部署目录/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

 

通常,咱们在部署时,就会操做这个界面来修改参数部署

4、补充说明

  这里要补充说明的是,jenkins的机器和目标服务器之间是须要作SSH KEY的,关于怎么完成这一步其实也很简单,就是生成信任的key,具体操做就由度娘来介绍吧;

 

  那么,到这里关于怎么完成项目的自动化部署,基本上就介绍完了,开始构建,并构建成功以后,就会在自动去git拉去代码,而且打包完成并发送到对应的服务器目录,完成重启操做;

若是有什么疑问,欢迎你们提问和讨论;若有不对之处,恳请批评指正;若是以为对您有所帮忙,那么也请您赏个赞;

相关文章
相关标签/搜索