生产与测试环境分离持续交付
说明
任务描述
现实研发系统:一个生产环境,多个测试环境
具体实战通过代码来部署生产与测试环境
基本思路
利用Jenkins任务参数来控制切换生产与测试环境部署
利用配置文件来控制生产与测试环境实际运行参数与数据库连接
技术特性
-Dspring.profiles.active=myProfileName,通过这个参数可以控制运行SpringBoot实例时,挂载不同的配置文件:application-prod.yml或者application-qa.yml
任务示意图
环境准备根据说明可知,我们需要准备两个MySQL,分别是生产和测试的数据库,因此,我们在服务器上搭建两个mysql,配置如下:
mysql:端口号3306,用户名root,密码123123,Docker内网地址172.17.0.2
mysql_test:端口号3308,用户名root,密码123123,Docker内网地址172.17.0.3
“Jenkins Docker部署持续交付实战”一文中,已经具体介绍了mysql的配置,则mysql_test配置也是一样的,具体参考该文的介绍
Spr ...
Jenkins基础功能
Jenkins Job机制Jenkins节点管理Jenkins权限控制Jenkins用户权限控制
Jenkins初始化过程中会先注册一个管理员用户
管理员用户再创建后续的一般用户
管理员用户登录进行后续配置
启动用户安全配置,Manage Jenkins -> Configure Global Security
注册用户的操作的权限控制
必须由管理员来完成
用户可以自由注册,启用之后在Jenkins首页可以看到Sign-up入口
注册权限配置位置在“Configure Global Security”中
团队规模不大(10人左右)建议不要启用用户自由注册选项,减少用户管理时间成本
配置好权限之后,管理员可以从后台直接添加用户
从Jenkins管理控制台页面->Manage Jenkins->Manage user
Jenkins用户管理
管理用户,用户的添加、修改和删除
Jenkins安全矩阵
Jenkins常用插件Jenkins插件
Jenkins强大的原因之一就是插件众多
插件帮助Jenkins丰富自身原有的功能
插件的安装 ...
Jenkins GitLab实现自动部署
实现自动部署的流程
开发提交代码
开发对需要发布的版本打上 Tag
触发 GitLab 的 tag push 事件, 调用 Webhook
Webhook触发 Jenkins 的构建任务
Jenkins 构建完项目可以按版本号上传到仓库、部署、通知相关人员等等
参考文章:https://www.jianshu.com/p/7e8037c63d63
Git提交代码后自动触发Jenkins进行自动构建部署,有以下两种方式:
方式一:Jenkins Generic Webhook Trigger
Jenkins安装Generic Webhook Trigger插件
系统管理 -> 插件管理
安装完成后,重启Jenkins
Jenkins Job中配置
Job配置页面中构建触发器
添加一个请求参数和自定义token
配置完成后:生成一个触发 URL http://ip:port/generic-webhook-trigger/invoke?token=demonpot_PUSH&runOpts=GitlabCI
GitLab中进行配置,注意 ...
TestNG
TestNGTestNG官方文档
什么是TestNGTestNG是一个测试框架,其灵感来自JUnit和NUnit,但引入了一些新的功能,使其功能更强大,使用更方便。
TestNG是一个开源自动化测试框架;TestNG表示下一代(Next Generation的首字母)。 TestNG类似于JUnit(特别是JUnit 4),但它不是JUnit框架的扩展。它的灵感来源于JUnit。它的目的是优于JUnit,尤其是在用于测试集成多类时。 TestNG的创始人是Cedric Beust(塞德里克·博伊斯特)。
TestNG消除了大部分的旧框架的限制,使开发人员能够编写更加灵活和强大的测试。 因为它在很大程度上借鉴了Java注解(JDK5.0引入的)来定义测试,它也可以显示如何使用这个新功能在真实的Java语言生产环境中。
TestNG特点
注解
TestNG使用Java和面向对象的功能
支持综合类测试(例如,默认情况下,不用创建一个新的测试每个测试方法的类的实例)
独立的编译时测试代码和运行时配置/数据信息
灵活的运行时配置
主要介绍“测试组”。当编译测试,只要要求TestNG运行所有的“前 ...
Junit5用例编写
Junit5用例编写创建Maven工程,pom.xml引入Junit5的依赖坐标,注意:JDK环境必须在1.8以上
123456<dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>RELEASE</version> <scope>test</scope></dependency>
Junit5的依赖坐标可以单独导入junit-jupiter-api、junit-jupiter-engine、junit-jupiter-params,如若单独引入较为麻烦,可以引入如下依赖坐标,包含了这个三个单独的依赖:
123456<dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jup ...
Java之验证框架
Java之验证框架分层验证与JavaBean验证分层验证模型
Java Bean验证模型
Bean Validation简介Bean Validation为JavaBean验证定义了相应的元数据模型和API。 –维基百科
常用约束注解
空值校验类:@Null,@NotNull,@NotEmpty,@NotBlank等
范围校验类:@Min,@Size,@Digits,@Future,@Negative等
其他校验类:@Email,@URL,@AssertTrue,@Pattern等
代码案例引入依赖
12345678910111213141516171819202122232425<!--Validation相关依赖--><dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.0.Final</version></de ...
Junit4
JUnit4junit4 github
什么是Junit
JUnit是Java编程语言的单元测试框架,用于编写和可重复运行的自动化测试
JUnit特点
JUnit是一个开放的资源框架,用于编写和运行测试
提供注解来识别测试方法
提供断言来测试预期结果
JUnit测试允许你编写代码更快,并能提高质量
JUnit优雅简洁。没那么复杂,花费时间较少
JUnit测试可以自动运行并检查自身结果并提供及时反馈。所以也没有必要人工梳理测试结果的报告
JUnit测试可以被组织为测试套件,包含测试用例,甚至其他的测试套件
JUnit在一个条中显示进度。如果运行良好则是绿色;如果运行失败,则变成红色
JUnit缺点
最初的设计,使用于单元测试,现在只用于各种测试。
不能依赖测试
配置控制欠佳(安装/拆卸)
侵入性(强制扩展类,并以某种方式命名方法)
静态编程模型(不必要的重新编译)
不适合管理复杂项目应用,JUnit复杂项目中测试非常棘手。
JUnit注解
注解
解释
@Test
测试注解,标记一个方法可以作为一个测试用例
@Before
Before注解表示,该方法必须在类中的每个测 ...
Junit5基础介绍
Junit5组成官网文档
官方文档中文版
Junit5 由JUnit Platform + JUnit Jupiter + JUnit Vintage 三部分构成
JUnit Platform其主要作用是在JVM上启动测试框架。它定义了一个抽象的TestEngine API来定义运行在平台上的测试框架;也就是说其他的自动化测试引擎或开发人员自己定制的引擎都可以接入Junit实现对接和执行。同时还支持通过命令行、Gradle和Maven来运行平台(这对于我们做自动化测试至关重要)。
JUnit Jupiter这是Junit5的核心,可以看作是承载Junit4原有功能的演进,包含了JUnit 5最新的编程模型和扩展机制;很多丰富的新特性使JUnit自动化测试更加方便、功能更加丰富和强大。也是测试需要重点学习的地方;Jupiter本身也是一个基于Junit Platform的引擎实现,对JUnit 5而言,JUnit Jupiter API只是另一个API!。
JUnit VintageJunit发展了10数年,Junit 3和 Junit 4都积累了大量的用户,作为新一代框架,这个模 ...
Java定时任务调度工具
Java定时任务调度工具
什么是定时任务调度
基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务
Timer简介位于java.util.Timer包下
有且仅有一个后台线程对多个业务线程进行定时定频率的调度
主要构件:Timer(后台执行线程) -定时调用-> TimerTask(业务线程)
Timer工具类详解
实战演练
实现自定义MyTimerTask并继承TimerTask
12345678910111213141516171819202122232425262728293031package com.example.timer;import lombok.Data;import java.util.TimerTask;/** * @author jinglv * @date 2020/10/25 */@Datapublic class MyTimerTask extends TimerTask { private String name; public MyTimerTask(String name) { this ...
Java之资源关闭
Java之资源关闭查看之前写了一个FileService.java的服务,在创建了流之后,没有关闭流,在测试的时候发现没有问题,是因为资源没有被另外引用。
当一直打开文件,并且不关闭的时候,会出现这样的异常:Too many open files in system,是指的系统级的文件句柄。可以理解为我们建立的OutputStream是先与系统的文件句柄连接,通过他才能操作文件。而系统的文件句柄资源是有限的。当我们不关闭流,那这个文件句柄就一直占用着,当“别人”再想用时就没有资源了,从而报出这样的异常。
传统方式的关闭文件流1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556/** * 传统方式,通过url获取本地文件内容,调用函数式接口处理 * * @param url 文件内容 * @param fileConsumer 文件处理函数式接口 */ public void oldFileHa ...