-
Notifications
You must be signed in to change notification settings - Fork 548
BIP 1: Support Integration testing using docker
Status: DISCUSSION
Author: @hellozepp
Contributor: @hellozepp
Date: 2022.02.24
Pull Requests: byzer-lang #1702 ,byzer-build #22
Byzer缺少一个可以进行集群测试的流程,存在以下的一些问题:
1)经常会有人反馈Byzer local模式正常,提交到yarn上就会有问题的case
2)PR 提交后常规的scalatest本地测试很难发现集群环境潜在的问题
3)发布前人工测试缺少yarn测试的环境,缺少yarn环境自动化发版测试
- 完善CI流程,支持可以自动跑在yarn环境的PR触发的集成测试
1)变更模块:byzer-build、streamingpro-it
2)变更内容:
-
byzer-build支持构建Byzer on yarn的镜像
-
集成测试支持本地和github上通过docker进行yarn集群测试
注意:代码已经更新为预发布版本,Dev演示分支的代码已经删掉。
前提条件:
- 我们的打包脚本仅支持Python3环境,如果需要多版本请先安装conda并使用
1)安装docker Desktop:从 Docker 官网 下载适配您操作系统的安装包,安装并使用。
2)测试
-
IDE中启动测试类 streamingpro-it/src/test/scala/tech/mlsql/it/ByzerScriptTestSuite
-
或者通过maven命令启动
sh -x dev/run-test.sh 3.0
- 效果演示 it模块会依次启动hadoop3和byzer-lang容器,可以在控制台看到hadoop的启动日志:
byzer-lang启动日志:
启动完成后,将会看到3个docker实例:
实际是多套容器模拟的集群,然后日志收集到测试任务里面,这样就可以像local测试一样测试yarn环境。
在测试任务ByzerScriptTestSuite中,实际上是模拟的http任务提交到container。同样我们可以在容器运行成功后手动访问该web入口:
注意,端口号为随机生成,需要从testcontainer的API获取。
最后,测试运行成功,容器会自动销毁。整个流程从启动容器到测试和销毁用时8-10分钟(image已经安装好的情况)。
- Github Action + testcontainer + Docker
引入 maven 依赖如下:
<dependency>
<groupId>org.scalatest</groupId>
<artifactId>scalatest_${scala.binary.version}</artifactId>
<version>${scalatest.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.scalactic</groupId>
<artifactId>scalactic_${scala.binary.version}</artifactId>
<version>${scalatest.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.dimafeng</groupId>
<artifactId>testcontainers-scala_${scala.binary.version}</artifactId>
<version>0.40.2</version>
<scope>test</scope>
</dependency>
提取公共方法,抽象3个容器实例的通用类:ByzerLangContainer
、ChaosContainer
、HadoopContainer
统一管理容器的通用类:ByzerCluster
API使用方式:
-
集成scalatest提供的启动类已经日志等特质:class <测试类> extends FlatSpec with Suite with BeforeAndAfterAll with Logging
-
初始化集群参数:
cluster = ByzerCluster.forSpec()
-
启动及其环境:
cluster.start()
-
启动完成后,进行脚本自动化测试:
"javaContainer" should "retrieve non-0 port for any of services" in {
val url = "http://" + javaContainer.getHost + ":" + javaContainer.getMappedPort(9003) + "/run/script"
val sql = "select 1 as a,'jack' as b as bbc;"
val owner = "admin"
val (status, result) = FunctionsUtils._http(url, "post", Map("sql" -> sql, "owner" -> owner, "jobName" -> jobName),
Map("Content-Type" -> "application/x-www-form-urlencoded"), Map()
)
}
- 测试完成后手动清理:
cluster.stop()
- dockerClient日志拉取和存证
参考实现方法:tailContainerLog(this)
- Byzer自动化工具
参考实现方法:FunctionsUtils._http
仅支持spark3版本的 byzer on yarn
测试
-
测试spark2环境是否可以正常跳过
-
测试PR测试是否有足够资源
-
测试主链路,hadoop3和byzer-lang容器是否正常启动,是否可以正常接收http请求
-
测试结果后是否在target中可以找到启动日志
-
byzer的tar包不存在时,是否会提示用户先打包在测试