前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >性能环境之Jenkins+Maven自动化部署SpringBoot压测环境(实战篇)

性能环境之Jenkins+Maven自动化部署SpringBoot压测环境(实战篇)

作者头像
高楼Zee
发布2019-07-17 17:46:01
7060
发布2019-07-17 17:46:01
举报
文章被收录于专栏:7DGroup7DGroup

前言

Jenkins是目前最流行的开源CI(持续集成)工具,广泛用于项目开发,部署和自动化等。 本文将带着大家一起完成在阿里云Centos 7服务器间完成 Jenkins+Maven自动化部署SpringBoot压测环境整个过程。

整体设计

该方案使用Jenkins把打包后的Jar包通过SSH免密的方式上传到测试应用服务器指定目录,上传成功后执行服务器的shell脚本,该脚本会备份原有程序并kill原有程序进程,部署完Jar并再次启动,执行的结果的自动化在钉钉群里通知。

先决条件

在搭建之前,你必须满足:

  • 两台Centos7服务器并均能使用yum命令
  • 具有sudo权限的账号及root账号

大体步骤

总体上分为以下几个步骤:

  • Step 1:安装sun jdk1.8环境
  • Step 2:安装maven 3.5
  • Step 3:安装Jenkins
  • Step 4:安装Jenkins插件
  • Step 5:配置Jenkins
  • Step 6:Push SSH
  • Step 7:新建Jenkins任务
  • Step 8:部署项目配置
  • Step 9:部署项目
  • Step10:测试验证

Step 1:安装sun jdk1.8环境

检查服务器是否安装了OpenJDK

代码语言:javascript
复制
[zzw@7dgroup3 usr]$ yum list installed |grep java
java-1.8.0-openjdk.x86_64            1:1.8.0.181-3.b13.el7_5         @updates   
java-1.8.0-openjdk-headless.x86_64   1:1.8.0.181-3.b13.el7_5         @updates   
javapackages-tools.noarch            3.4.1-11.el7                    @base      
python-javapackages.noarch           3.4.1-11.el7                    @base      
tzdata-java.noarch                   2018e-3.el7                     @updates

卸载OpenJDK

代码语言:javascript
复制
[zzw@7dgroup3 usr]$  sudo yum -y remove java-1.8.0-openjdk.x86_64
[zzw@7dgroup3 usr]$  sudo yum -y remove java-1.8.0-openjdk-headless.x86_64

把预先下载的jdk-8u191-linux-x64.tar.gz包上传到服务器并解压

代码语言:javascript
复制
[zzw@7dgroup3 ~]$ tar -zxvf jdk-8u191-linux-x64.tar.gz

移动jdk1.8.0_191文件夹到 /usr/local/java/目录下

代码语言:javascript
复制
sudo mv jdk1.8.0_191/ /usr/local/java/

配置JDK环境变量

代码语言:javascript
复制
#备份配置文件
[zzw@7dgroup3 jdk1.8.0_191]$ sudo cp /etc/profile /etc/profilebackup
[zzw@7dgroup3 jdk1.8.0_191]$ sudo vim /etc/profile
#使配置文件立即生效
[zzw@7dgroup3 jdk1.8.0_191]$ sudo source /etc/profile

JDK环境变量

代码语言:javascript
复制
#set java environment
export JAVA_HOME=/usr/local/java/jdk1.8.0_191
export PATH=$JAVA_HOME/bin:$PATH

检查JDK环境

代码语言:javascript
复制
[zzw@7dgroup3 jdk1.8.0_191]$ java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

Step 2:安装Maven 3.5

下载软件

代码语言:javascript
复制
[zzw@7dgroup3 ~]$ wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz

解压软件并移动到指定目录

代码语言:javascript
复制
[zzw@7dgroup3 ~]$ tar zvxf apache-maven-3.5.4-bin.tar.gz 
[zzw@7dgroup3 ~]$ sudo mv apache-maven-3.5.4 /usr/local/maven

配置环境变量

代码语言:javascript
复制
[zzw@7dgroup3 ~]$ sudo vim /etc/profile
[zzw@7dgroup3 ~]$ source /etc/profile

环境变量

代码语言:javascript
复制
#set maven environment
MAVEN_HOME=/usr/local/maven
export MAVEN_HOME
export PATH=${PATH}:${MAVEN_HOME}/bin

由于maven默认配置的仓库在国外导致下载速度较慢,所以我们最好为配置一个国内的镜像,这里为maven配置阿里云仓库

代码语言:javascript
复制
[zzw@7dgroup3 ~]$ cd /usr/local/maven/conf/

找到 settings.xml在mirrors节点下添加:

代码语言:javascript
复制
<mirrors>
    <!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
     -->
    <!-- 阿里云仓库 -->
        <mirror>
            <id>alimaven</id>
            <mirrorOf>central</mirrorOf>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
        </mirror>
  </mirrors>

检查maven环境

代码语言:javascript
复制
[zzw@7dgroup3 ~]$ mvn -version
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)
Maven home: /usr/local/maven
Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: /usr/local/java/jdk1.8.0_191/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-862.9.1.el7.x86_64", arch: "amd64", family: "unix"

Step 3:安装Jenkins

下载软件

代码语言:javascript
复制
[zzw@7dgroup3 ~]$ wget https://pkg.jenkins.io/redhat-stable/jenkins-2.138.2-1.1.noarch.rpm

安装软件

代码语言:javascript
复制
[zzw@7dgroup3 ~]$ sudo yum localinstall jenkins-2.138.2-1.1.noarch.rpm

启动Jenkins服务并将其设置为在引导时运行

代码语言:javascript
复制
[zzw@7dgroup3 ~]$ sudo systemctl start jenkins.service
[zzw@7dgroup3 ~]$ sudo systemctl enable jenkins.service

Jenkins启动成功,它自带Jetty服务器,通过 http://<your-server-IP>:8080访问

第一次启动Jenkins时,处于安全的考虑,Jenkins会自动生成一个随机的口令。在服务器上使用root账号登录获取口令复制下来再浏览器内输入口令。

代码语言:javascript
复制
[zzw@7dgroup3 jenkins]$ su - root
[root@7dgroup3 ~]# cd /var/lib/jenkins/secrets/
[root@7dgroup3 secrets]# cat initialAdminPassword 
0d3127496a1f4ee3a326ebfa21a8ddc6

管理员密码输入 0d3127496a1f4ee3a326ebfa21a8ddc6

进入用户自定义插件界面,建议选择安装官方推荐插件。

进入插件安装进度界面

配置用户密码

实例配置

安装完成

Step 4:安装Jenkins插件

有很多插件默认就已经安装了,需要我们安装的并不多。 需要安装插件如下:

  • Git plugin
  • Maven Integration plugin
  • Publish Over SSH
  • Dingding Plugin

从系统管理>插件管理>可选插件>搜索插件>勾选安装,点击直接安装即可

Step 5:配置Jenkins

系统管理>全局工具配置

配置JDK

配置本地JDK路径,去掉勾选自动安装

配置Maven

配置本地maven路径,去掉勾选自动安装

其他内容可根据自己的情况选择安装配置。

Step 6:Push SSH(SSH免密登录)

ssh的配置可使用密钥,也可以使用密码,这里我们使用密钥来配置。 首先检查服务器上是否已经生成密钥,如果没有使用 ssh-keygen-t rsa生成密钥

代码语言:javascript
复制
[root@7dgroup3 ~]# cd ~/.ssh/
[root@7dgroup3 .ssh]# ls
authorized_keys  known_hosts
[root@7dgroup3 .ssh]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:pJPHl58jAM/a3eaCfCTQxOAIGomm3WSTYwWBlTKrs5E root@7dgroup3
The key's randomart image is:
+---[RSA 2048]----+
|o..o+*oo         |
|o++.Oo  o        |
|+. O.ooo.        |
|. o . .O.  .     |
| o    +.S o      |
|E      =.+.o .   |
| +    ...+o *    |
|.       o o+ .   |
|         . ..    |
+----[SHA256]-----+
[root@7dgroup3 .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts

注意:一个矩形图形出现就说明成功,在 ~/.ssh/下会有私钥 id_rsa和公钥 id_rsa.pub

将Jenkins服务器的公钥 id_rsa.pub中的内容复制到测试应用服务器 ~/.ssh/下的 authorized_keys文件中

代码语言:javascript
复制
[root@7dgroup3 .ssh]# ssh-copy-id -i id_rsa.pub 47.92.172.x

测试应用服务器授权并重启SSH服务

代码语言:javascript
复制
#公钥文件授权
[root@zuozewei .ssh]# chmod 644 ~/.ssh/authorized_keys
[root@zuozewei .ssh]# service sshd restart
Redirecting to /bin/systemctl restart sshd.service

在Jenkins服务器使用ssh IP测试免密是否能够登录

代码语言:javascript
复制
[root@7dgroup3 .ssh]# ssh 47.92.172.x
Last login: Wed Oct 24 20:34:29 2018 from 111.201.79.x

Welcome to Alibaba Cloud Elastic Compute Service !

注意:这里最好使用root用户密钥进行认证

接下来就是配置Jenkins了 系统管理>系统设置>选择 PublishOverSSH

公共配置:

  • Passphrase:不用设置
  • Path to key:key文件(私钥)的路径
  • Key:将私钥复制到这个框中
  • Hostname:需要连接ssh的主机名或ip地址(建议ip)
  • Username:用户名
  • Remote Directory:远程目录,不用设置
  • Name:随意起名代表这个服务,待会要根据它来选择

高级配置:

  • Disable exec:禁止运行命令,这个不要勾选,否则没法执行命令
  • Use password authentication, or use a different key:可以替换公共配置(选中展开的就是公共配置的东西,这样做扩展性很好)
  • Port:端口(默认22)
  • Timeout (ms):超时时间(毫秒)默认即可

配置完成后 TestConfiguration下,提示success的话就没问题。

Step 7:新建Jenkins任务

首页>新建>输入一个任务名称>构建一个maven项目

勾选丢弃旧的构建,选择是否备份替换的旧包。

源码管理选择Git,使用Https方式拉取源代码,注意如果拉取其它分支版本,请在 BranchSpecifier输入分支名称

构建触发器中选择轮训SCM,设置每天7点左右定轮询Git

定时构建:无论Git中数据有无变化,均执行定时化的构建任务

轮训SCM:定时轮询Git,查看Git中是否有数据变化,如果有变化,则执行构建任务

定时构建语法:

代码语言:javascript
复制
* * * * *
  • 第一个*表示分钟,取值0~59
  • 第二个*表示小时,取值0~23
  • 第三个*表示一个月的第几天,取值1~31
  • 第四个*表示第几月,取值1~12
  • 第五个*表示一周中的第几天,取值0~7,其中0和7代表的都是周日

下面为举例:

  • 每10分钟构建一次: H/10*****/10****
  • 每天8点构建一次: 08***
  • 每天8点~17点,两小时构建一次: 08-17/2***
  • 周一到周五,8点~17点,两小时构建一次: 08-17/2**1-5
  • 1-6月中每月1号、30号各构建一次: H H1,301-6*

构建环境中勾选 Addtimestamps to theConsoleOutput,构建的过程中会将日志打印出来

在Build中输入打包前的mvn命令: clean install-Dmaven.test.skip=true

-Dmaven.test.skip=true表示跳过单元测试

Post Steps 选择 Runonlyifbuild succeeds

点击 Addpost-build step,选择 Sendfilesorexecute commands over SSH,Name选择上面配置的 PushSSH

  • Source files配置: arget/person-0.0.1-SNAPSHOT.jar 项目jar包名
  • Remove prefix: target/
  • Remote directory: Jenkins-in/ 应用服务器的发送目录地址
  • Exec command: Jenkins-in/build.sh 应用服务器对应的shell脚本

构建后操作,点击添加“钉钉通知器”

钉钉access token在钉钉群的机器人配置内获取

Step 8:部署项目配置

测试应用服务器创建 /root/jenkins-in目录

代码语言:javascript
复制
[root@zuozewei ~]# pwd
/root
[root@zuozewei ~]# mkdir jenkins-in

测试应用服务器创建Jenkins-in目录下创建build.sh脚本

代码语言:javascript
复制
#格式化时间
DATE=$(date +%Y%m%d)
#设置程序目录
DIR=/usr/local/app
#设置Jar名称
JARFILE=person-0.0.1-SNAPSHOT.jar

#判断是否存在backp目录,如果不存储就创建
if [ ! -d $DIR/backup ];then
   mkdir -p $DIR/backup
fi
cd $DIR

#杀掉当前运行的旧程序
ps -ef | grep $JARFILE | grep -v grep | awk '{print $2}' | xargs kill -9
#备份旧程序
mv $JARFILE $DIR/backup/$JARFILE$DATE
#部署新程序
mv -f /root/jenkins-in/$JARFILE .
echo "The service will be starting"
#后台启动程序并设置Jvm参数、开启JMX、打印GC日志
java -server -Xms1024M -Xmx1024M -XX:PermSize=256M \
-XX:MaxPermSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails \
-Xloggc:./gc.log \
-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=127.0.0.1 \
-Dcom.sun.management.jmxremote.port=10086 -Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-jar $JARFILE --spring.profiles.active=dev > /nohup 2>&1>out.log &

if [ $? = 0 ];then
        sleep 30
        tail -n 50 out.log
fi

cd backup/
ls -lt|awk 'NR>5{print $NF}'|xargs rm -rf
echo "starting success!!!"
~                                                                                                                                                                                  
~

这段shell脚本的大体意思就是,kill旧程序>删除旧程序>启动新程序>备份旧程序

Step 9:部署项目

点击“立即构建”,任务控制台将实时输出相关信息

看到输出了starting success!!!,说明我们的需要测试的程序已经跑起来了。

我们可以去测试应用服务器上验证下

代码语言:javascript
复制
[root@zuozewei app]# ps -ef|grep person
root     16901 15477  0 21:06 pts/1    00:00:00 grep --color=auto person
root     31218     1  0 17:48 ?        00:00:29 java -server -Xms1024M -Xmx1024M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -Xloggc:./gc.log -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.port=10086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar person-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
[root@zuozewei app]# ls
backup  gc.log  out.log  person-0.0.1-SNAPSHOT.jar
[root@zuozewei app]# cd backup/

我们看到已经成功设置JVM参数,生成了gc.log、out.log。

同时我们的钉钉群也收到程序部署成功的通知

Step10:测试验证

我们看到需要测试程序已经成功运行了,但是还需要验证一下是否功能正常? 我们通过验证此程序其中的查询人员接口

代码语言:javascript
复制
/**
     * 查询一个人员
     * @param id
     * @return
     */
    @GetMapping(value = "/person/{id}")
    public Person personFindOne(@PathVariable("id") Integer id) {
        return personRepository.findOne(id);
    }

这个接口比较简单,只需要我们向指定的URL请求一个人员ID即可,这里我们使用Postman验证这个接口

我们看到接口正确返回数据了,说明自动部署的程序没有问题。

下面我们对这个查询人员的接口的URL修改并重新提交到git上

代码语言:javascript
复制
/**
     * 查询一个人员
     * @param id
     * @return
     */
    @GetMapping(value = "/person/find/{id}")
    public Person personFindOne(@PathVariable("id") Integer id) {
        return personRepository.findOne(id);
    }

重新构建项目,完成后我们可以在Jenkins上看到代码更新记录

接下来我们验证下新更新程序是否部署成功,我们还是使用Postman请求新修改的接口地址

我们看到新的接口的地址已经成功发布了,下面我们查看下测试应用服务器情况

代码语言:javascript
复制
[root@zuozewei backup]# ps -ef|grep person
root     18659     1  6 21:25 ?        00:00:17 java -server -Xms1024M -Xmx1024M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -Xloggc:./gc.log -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.port=10086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar person-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
root     19113 15477  0 21:30 pts/1    00:00:00 grep --color=auto person
[root@zuozewei backup]# ls
person-0.0.1-SNAPSHOT.jar20181025
[root@zuozewei backup]# cd ..
[root@zuozewei app]# ls
backup  gc.log  out.log  person-0.0.1-SNAPSHOT.jar

我们看到旧的程序已经成功备份,至此我们的自动化部署SpringBoot压测环境已经大功告成!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 7DGroup 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 整体设计
  • 先决条件
  • 大体步骤
  • Step 1:安装sun jdk1.8环境
  • Step 2:安装Maven 3.5
  • Step 3:安装Jenkins
  • Step 4:安装Jenkins插件
  • Step 5:配置Jenkins
    • 配置JDK
      • 配置Maven
      • Step 6:Push SSH(SSH免密登录)
      • Step 7:新建Jenkins任务
      • Step 8:部署项目配置
      • Step 9:部署项目
      • Step10:测试验证
      相关产品与服务
      持续集成
      CODING 持续集成(CODING Continuous Integration,CODING-CI)全面兼容 Jenkins 的持续集成服务,支持 Java、Python、NodeJS 等所有主流语言,并且支持 Docker 镜像的构建。图形化编排,高配集群多 Job 并行构建全面提速您的构建任务。支持主流的 Git 代码仓库,包括 CODING 代码托管、GitHub、GitLab 等。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档