在我们的日常工作中,可能经常会遇到以下问题:
1、测试环境是由开发去更新的,当开发忙于改bug的时候,测试环境更新频率比较低,问题不能得到及时的验证
2、频繁的找开发去更新环境的话 ,耽误别人的工作,长此以往,也容易激起开发和测试之间的矛盾
那么我们如何解决上面的问题呢?那就是让测试人员也具备搭建测试环境的能力。很多企业现在测试环境和开发环境都独立分开了,开发人员都没有操作测试环境的权限。
公司内部一套完整的环境搭建可能会涉及到很多其他的中间件之类的,但这种不需要经常更新,我们先从最简单的更新测试环境的代码包开始。
常见的部署包有哪些呢?
在学习如何搭建环境之前,我们首先要了解一下,一般常见的部署包有哪些种类?
下面我简单介绍一下我所接触过的部署包,列举的肯定不全,这个大家要根据公司的实际情况去做相应的分析和了解。
jar、war 、压缩包、apk安装包、docker镜像
部署包怎么来的?
大家不要想着开发直接丢给你一个部署包,然后让你直接拷贝到服务器上然后去解压或者执行什么命令之类的-- 当然,这种方式也是可以的 ,只要你们不嫌麻烦,这个只是初级阶段需要掌握的。
掌握初级阶段之后,剩下的应该是要去思考 部署包到底是怎么来的? 能不能自己打出部署包?答案当然是可以的。
下面列举一些获取部署包这块,可能需要去掌握的一些技能:
1、maven、ant: java代码打包工具,目前应该是maven用的多些,ant的话,做测试如果用到jmeter,应该会用到。
maven的常见命令可以了解一下:
代码语言:javascript复制mvn -DskipTests 和 -Dmaven.test.skip=true 区别
mvn -U clean install/package/deploy
2、gradle:安卓代码打包工具
3、前端代码的话 现在一般需要安装nodejs,npm之类的,具体怎么打包可以自己跟进实际业务场景去了解
4、MsBuild:dotnet代码和dotnet core 代码打包,也就是C#代码的编辑器
如何实现jar包自动部署?
首先,java代码打包是可以打成jar包或者war包的,jar包和war包的部署方式会略有不同,下面以打成jar包部署到linux系统为例,记录一下如何通过jenkins配置自动部署。
准备工作:
- 一个简单的后端代码
我这里准备的是一个自己写的SpringBoot的demo,集成了swagger,部署之后可以看到一个swagger的页面,里面实现和查询数据库里面用户的接口,源代码上传到了gitee上,地址如下:仓库代码设置为私有的,有需要的话微信私聊我就行,大家可以用自己公司的项目或者找其他部署包进行模拟部署也可以。
https://gitee.com/libo_277169949/MyFirstSpringBootDemo
- mysql数据库
项目里面会用到连接数据库的配置,当然部署后你调用接口查数据的话,swagger页面能出来
下面先讲一下部署的思路:
1、获取源码,进行编译打包,得到部署包
2、将部署包自动传输到要部署的服务器上去(通过Publish Over SSH插件)
3、远程执行shell脚本启动jar包(通过SSH Plugin插件)
部署操作:
1、在jenkins上安装Publish Over SSH和SSH Plugin插件,并在jenkins->系统管理->系统配置 下找到跟SSH相关的配置,将要远程操作的服务器的相关信息配置进去:
2、先在服务器上写好一个deploy.sh的shell脚本用来启动和停止jar包,具体内容如下:
代码语言:javascript复制#!/bin/bash
source /etc/profile
pid=`ps -ef|grep MyFirstSpringBootDemo-1.0-SNAPSHOT.jar| grep -v grep | awk '{print $2}'`
echo "部署前的pid进程 :$pid"
# 关闭已经启动的jar进程
if [ -n "$pid" ]
then
kill -9 $pid
else
echo "进程没有启动"
fi
sleep 5s
#copy jar 到启动目录
cp -rf /root/app/MyFirstSpringBootDemo-1.0-SNAPSHOT.jar /root/app/deploydir/MyFirstSpringBootDemo-1.0-SNAPSHOT.jar
cd /root/app/deploydir
nohup /root/tools/jdk1.8.0_251/bin/java -jar /root/app/deploydir/MyFirstSpringBootDemo*.jar --server.port=8081 >/root/app/logs/MyFirstSpringBootDemo.log 2>&1 &
echo "脚本执行完毕"
sleep 5s
pid=`ps -ef|grep MyFirstSpringBootDemo-1.0-SNAPSHOT.jar | grep -v grep | awk '{print $2}'`
# 检验进程是否启动
if [ -n "$pid" ]
then
echo "部署后的pid进程 :$pid"
echo "启动成功"
else
echo "进程没有启动"
fi
脚本说明:
先查看jar是否正在运行,运行的话,部署前先停掉,把部署包替换后,然后启动jar包
3、jenkins上相关配置:
获取脚本:
编译代码打包:
上传部署包到服务器:
上面的执行脚本也可以换成下面的插件去调用:
到这里,部署操作就基本上完成了,以后需要更新测试环境的时候,直接点击一下job的立即构建按钮就可以了,一个简单的jar包部署到linux服务器上的demo就完成了,你学会了吗?
部署后效果验证:
部署后,访问以下地址如果能正常访问即表示部署成功:
http://106.53.29.33:8081/
http://106.53.29.33:8081/swagger-ui.html
思考?
1、测试环境如何提升部署效率呢?当打出来的jar包比较大的时候,传输到服务器比较慢,怎么处理呢?(尽可能的考虑局域网内传输)
2、如果在windows上部署jar包又该如何处理呢?
3、整个部署过程或者启动脚本还有哪些可以优化的点呢?(比如说参数化构建,同一个job选不同的环境或者配置进行部署,部署后邮件或者钉钉通知之类的等等。)
4、如果同一个jar包要部署不同的环境该怎么处理呢?(提示:不同环境的配置不一样,打包的时候可以指定配置文件)
今天踩的坑:
启动脚本里面,获取已经启动的jar包进程名时,用ps -ef|grep MyFirstSpringBootDemo*.jar ,通过jenkins调用就获取不到进程名称,但是在服务器上直接执行可以获取到,将jar包名写成完整的之后就可以。
其他包部署思路:
war包:部署在tomcat容器中或者直接通过java -jar xxx.war启动即可。
IIS站点网站部署:替换部署包后,重启站点服务
前端代码:将编译后的部署包上传到服务器某个目录,重启ngnix或其他服务
其他的部署都是类似的,一般是替换文件,重启服务。在编译之前,如果需要手动改配置文件之类的,可以辅助用其他的脚本去实现,主要是通过命令行能操作的事情,都可以集成到jenkins中去。