Skip to content

BIP 1: Support Integration testing using docker

hellozepp edited this page Feb 24, 2022 · 25 revisions

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
  1. 效果演示 it模块会依次启动hadoop3和byzer-lang容器,可以在控制台看到hadoop的启动日志:

lL9DVnmI1n

byzer-lang启动日志:

middle_img_v2_482b6ac1-1aae-4149-a139-863a1c2e41fg

启动完成后,将会看到3个docker实例:

middle_img_v2_7eb03599-af71-4c2a-a8fb-5f4e636131eg

实际是多套容器模拟的集群,然后日志收集到测试任务里面,这样就可以像local测试一样测试yarn环境。

在测试任务ByzerScriptTestSuite中,实际上是模拟的http任务提交到container。同样我们可以在容器运行成功后手动访问该web入口:

middle_img_v2_0319edb5-0fbb-44dc-803d-bdc01c114f9g

注意,端口号为随机生成,需要从testcontainer的API获取。

最后,测试运行成功,容器会自动销毁。整个流程从启动容器到测试和销毁用时8-10分钟(image已经安装好的情况)。

技术设计

  1. Github Action + testcontainer + Docker

image

引入 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个容器实例的通用类:ByzerLangContainerChaosContainerHadoopContainer

统一管理容器的通用类: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()
  1. dockerClient日志拉取和存证

参考实现方法:tailContainerLog(this)

  1. Byzer自动化工具

参考实现方法:FunctionsUtils._http

兼容性

仅支持spark3版本的 byzer on yarn 测试

测试计划

  • 测试spark2环境是否可以正常跳过

  • 测试PR测试是否有足够资源

  • 测试主链路,hadoop3和byzer-lang容器是否正常启动,是否可以正常接收http请求

  • 测试结果后是否在target中可以找到启动日志

  • byzer的tar包不存在时,是否会提示用户先打包在测试