年度归档: 2021 年

  • 为Katacoda课程添加自动化测试

    Katacoda是一个很方便做课程的平台,提供免费的机器资源,丰富的环境和UI界面支持。

    Katacoda的课程是由配置+markdown+其他资源组成的,课程写好以后提交到Github就可以自动刷新。一般来说课程内容比较直接,一般写好以后试用一下就可以了,但是结合cypress工具我们也可以做一些简单的自动化测试。

    首先在目录创建文件夹.cypress,然后创建一个以_spec.js结尾的文件,在文件中编写测试接口。另外为了方便起见Katacoda额外提供了一些辅助功能,比如cy.startScenario()可以直接启动课程。

    这里是dubbo-admin的测试例子

    describe("Valid env and layout", () ={
      before(() ={
        cy.startScenario();
      });
    
      it('finds launch command"', () ={
        cy.contains(" launch.sh");
      });
    
      it("start k8s", () ={
        cy.terminalType("launch.sh");
    
        cy.terminalShouldContain("Kubernetes started");
      });
    });

  • Spring Native的使用

    Spring Native的使用

    Spring Native本质上其实是依赖于GraalVM的native image功能,所以要先安装相关依赖。

    安装graalvm

    MacOS的安装依赖brew,官方有一个tap。

    brew install --cask graalvm/tap/graalvm-ce-lts-java11

    安装以后使用gu工具安装native-image工具

    gu install native-image

    SpringNative构建

    首先进行的是AOT插件,插件会根据上下文进行一些优化,主要是为了增强native image的兼容性。

    其次会进行jar包构建,构建后的jar包也是可以在JVM环境下正常运行。

    最后就是build-image这一步,其实启用native与否的关键主要在buildpacks上。首先会自动探测需要应用的buildpacks。如果系统变量BP_NATIVE_IMAGE是true的话就会激活paketo-buildpacks/native-image

    这个插件的native目录包含了对应的GO文件,会调用native-image进行生成操作。生成后会放入image中。

    构建本身还是比较快的。

    出错情况

    最常见的出错就是native-image没有安装或者没有使用graalvm,一般提示native-image找不到。

    目前spring-native要求GraalVM 21.0.0,版本如果低了可能有部分参数不支持,比InlineBeforeAnalysis等。

    可以通过BP_NATIVE_IMAGE_BUILD_ARGUMENTS指定一些特殊参数,常见的如下:

    • –verbose
    • -H:+PrintAnalysisCallTree
    • -H:+TraceClassInitialization
    • -H:+ReportExceptionStackTraces
    • –enable-all-security-services
  • 通过Spring Native构建本地镜像

    Spring Native目前已经在start.spring.io开放使用了。GraalVM在之前已经支持了本地镜像的构建,即不要求JVM安装(不是简单的集成JVM,还有AOT等特性),只生成单一分发文件。现在Spring也可以使用快速使用这个特性了,命令行使用

    mvn spring-boot:build-image

    这个特性比较适合以下场景:

    • Serverless
    • 微服务
    • 分发更高性能和容量的镜像

    参考

    https://www.graalvm.org/reference-manual/native-image/

    https://spring.io/blog/2021/03/11/announcing-spring-native-beta

  • 集成测试的测试覆盖率统计

    单元测试的覆盖率一般都很好处理,直接使用对应的jacoco插件即可。但是一个项目不单单只有单元测试,还有集成测试等其他类型的测试。对于这些测试类型,测试覆盖率的统计还需要稍微处理下。

    首先集成测试是在先将测试工程打包成jar包再封装到docker镜像中,考虑到操作性和便利性,肯定要挂在一部分主机目录到镜像中。具体的统计使用jacoco的agent模式,参数上只配置输出文件,其他都采用默认值。

    首先是下载jacoco的agent和cli工具到jacoco目录中

    mkdir jacoco && wget https://repo1.maven.org/maven2/org/jacoco/org.jacoco.agent/0.8.6/org.jacoco.agent-0.8.6-runtime.jar -O jacoco/jacoco.jar && wget https://repo1.maven.org/maven2/org/jacoco/org.jacoco.cli/0.8.6/org.jacoco.cli-0.8.6-nodeps.jar -O jacoco/jacoco-cli.jar

    docker镜像启动时挂在目录到/jacoco目录,并在JAVA_OPTS参数中新增

    -javaagent:/jacoco/jacoco.jar=destfile=/jacoco/jacoco.exec

    这样就会在jacoco目录生成jacoco.exec文件了。

    第二部就是把exec文件转为报告,一般是xml格式的,这一步使用jacoco-cli即可。

    java -jar jacoco/jacoco-cli.jar report jacoco/jacoco.exec --classfiles dubbo-admin-server/target/classes/ --sourcefiles dubbo-admin-server/src --xml jacoco/jacoco.xml

    具体目录按照需要调整,源代码不是必选项。

    最后就是计算变更等后续处理了,由于使用的是codecov平台,这里使用flag区别下集成测试和单元测试就行了。

    效果如图:

  • reqwest交叉编译移除对于openssl的依赖

    对于有reqwest依赖的rust项目,如果使用的是cross进行交叉编译,比如

    cross build --target x86_64-unknown-linux-gnu --release

    会提示openssl找不到。

    虽然可以通过自定义镜像等方式提供openssl的依赖,让编译通过,但是更直接的方法是使用rustls。这是一个由纯rust编写TLS库。

    在Cargo.toml中修改reqwest依赖

    reqwest = { version = "0.11", features = ["json", "blocking", "rustls-tls"], default-features = false }

    在features中新增rustls-tls,同时禁用掉默认features。