zoukankan      html  css  js  c++  java
  • 基于【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拉去代码,并且打包完成并发送到对应的服务器目录,完成重启操作;

    如果有什么疑问,欢迎大家提问和讨论;如有不对之处,恳请批评指正;如果觉得对您有所帮忙,那么也请您赏个赞;

  • 相关阅读:
    jmeter接口自动化-读取CSV文件执行测试用例
    文件流下载excel表格
    如何查看死锁的表
    学习笔记
    当你需要验证数组是否都是0
    实验二
    centos8 https访问报错
    Linux命令常用搜集持续更新
    一文搞懂C语言中指针、数组、指针数组、数组指针、函数指针、指针函数
    11
  • 原文地址:https://www.cnblogs.com/ocean-sky/p/9989745.html
Copyright © 2011-2022 走看看