博客

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

    单元测试的覆盖率一般都很好处理,直接使用对应的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。

  • 在铁威马Nas上使用最新的Plex Server

    在铁威马Nas上使用最新的Plex Server

    铁威马目前官方商店提供了Plex和Emby,其中Plex的版本为1.20.X,目前最新版本是1.21.X。版本差距不是很大,只是在安装插件的时候找了好一会儿文件路径,还是决定自己装最新版本,自己控制文件夹路径算了。

    直接安装在本地不如Docker方便,所以直接选用官方镜像。在appdata目录下新建一个plex专用文件夹,准备一个database目录用于存储和一个transcode目录作为转码。

    由于Plex依赖的网络端口比较多,选择bridge比较麻烦,这里直接选择host模式。准备一个存放媒体文件的目录,挂在到/data下。

    环境变量中没有太多要配置的,最好配置一个PLEX_CLAIM作为自动关联,这个claim-code可以在plex网站上找到,直接访问 https://www.plex.tv/claim/ 可以获得,然后启动就行了。

    日志可以在Docker管理面板看到

    刚刚下载的BT视频直接被索引到了,然后自动生成缩略图。

    如果需要安装插件,下载好了以后放到/appdata/plex/database/Library/Application Support/Plex Media Server/Plug-ins/中。…

  • 快速编译适用于铁威马Nas的软件

    铁威马Nas自带的生态比较少,除了用Docker解决以外,还可以考虑交叉编译的方式来生成适用的软件。

    官方的文档非常少,基本等于没有,特别是对于UI部分的集成只字不提,不过根据发布的三个工具来看,还是比较清晰

    • 打包工具,生成tpk软件,目录结构和openwrt有点像
    • x86_64的编译sdk
    • arm的编译sdk

    由于软件包下载比较慢,也比较大,我这里构建了一个x86_64可用的镜像,包含了必要的依赖,适用于大部分make或者cmake管理的软件。这里用libuv为例展示下用法。

    镜像地址在:https://hub.docker.com/r/htynkn/terramaster-sdk,版本对应官方提供的sdk版本,即最新的是1.0.1。在下载了libuv代码后直接执行

    docker run -it -v $(pwd):/code htynkn/terramaster-sdk:1.0.1 bash

    相关工具在/sdk目录,由于libuv用了cmake,所以直接指定CC和GCC就可以了

    mkdir build
    cd build
    env CC=/sdk/x86_64_builtroot_toolchain/bin/x86_64-tnas-linux-gnu-gcc CXX=/sdk/x86_64_builtroot_toolchain/bin/x86_64-tnas-linux-gnu-g++ cmake ..
    make uv

    我尝试了一些常用C/C++库,基本没有遇到什么问题。没有特别仔细研究官方具体做出了什么裁剪,但是目前看基本通用。…

  • 铁威马NAS添加开箱即用的Aria2下载工具

    Aria2是比较轻量级的下载工具,支持BT等格式,非常适合简单的下载需求,比如NAS环境挂BT的情况。

    铁威马NAS,相对来说性价比比较高,但是相对的,生态比较差。好在大部分版本都提供Docker支持,可以解决很多问题。以Aria2为例,官方提供应用市场可以安装,但是安装后有很多需要配置的地方,对于初次使用的用户很不友好,特别是自带的管理界面,某一次打开遇到了File not found的错误后再也无法使用。

    有热心网友准备的完美配置,再加上开箱即用的Docker镜像,其实完全可以不实用官方的应用,直接挂Docker。我这里使用的镜像是p3terx/aria2-pro,大小28M,使用的模式是移动模式,即下载完成移动下载完的文件到另外的目录,再删除.aria2和torrent文件。镜像额外还有BT trackers更新,小文件过滤,特别文件名过滤等功能,可以覆盖大部分场景。

    使用时在铁威马NAS中搜索镜像后下载,然后直接创建,这里保留6800作为RPC端口,其他监听端口按照情况更改,需要挂在两个目录,一个是config目录,一个是下载目录。其他不需要特别配置。

    启动后需要一点时间拉取对应脚本并更新Trackers,所以看下日志

    或者等6800端口可用后再访问也可以。

    本文的方法不光适用于NAS环境,或者局限于铁威马这个品牌产品,大部分设备只要支持Docker都可以这样使用。…

  • JDK15中的安全增强

    JDK15上个月发布了,这个版本对于安全上有很多增强,比较有吸引力。

    爱德华兹曲线数字签名算法首次直接加入JDK,名称为Ed25519,使用方式还是一样,只是参数改变下。

    KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");
    KeyPair keyPair = kpg.generateKeyPair();
    Signature sig = Signature.getInstance("Ed25519");
    sig.initSign(keyPair.getPrivate());
    sig.update(msg);
    byte[] s = sig.sign();

    之前版本的JDK需要使用三方库,比如str4d/ed25519-java。

    证书上也有一些变动,替换了Sectigo过期证书。

    TLS方面主要是追平新的特性,比如https://tools.ietf.org/html/rfc8446#section-4.2.4。这块的需求倒不是那么大。

    其他变动还有一些,比如新的jdk.tls.client.SignatureSchemes和jdk.tls.server.SignatureSchemes变量,SSLSession.getPeerCertificateChain()的API变更等。…

  • Openwrt自建Feeds的签名问题

    Openwrt生成ipk文件后可以自建feeds,这样用户可以更简单的使用。除了常规的文件结构外,Openwrt还要求一个签名,即Packages.sig文件。

    如果之前没有生成可以如下操作:

    docker run -v $(pwd):/keys --rm -it openwrtorg/rootfs

    使用Docker启动一个openwrt环境,并在其中执行

    cd /keys && usign -G -p public.key -s secret.key

    将两个文件保存好,public.key是需要公开的,而secret.key自己保管好,不要共享给别人。

    在编译ipk之后直接执行即可

    ./staging_dir/host/bin/usign -S -m Packages -s /opt/mount/secrets.key -x Packages.sig

    如果要在Github Action中使用可以把秘钥作为secret保存,然后直接echo写入。可以参考:https://github.com/htynkn/openwrt-switch-lan-play/blob/master/.github/workflows/build.yml…

  • Google统计的Measurement Protocol使用

    Google统计是比较常用的统计系统,针对网页的统计只需要引入一段JS即可。

    有一些特殊的场景,不是网页环境,类似于桌面环境,也想使用Google统计的话就需要借助Measurement Protocol协议。

    一般来说这种情况比较多的是记录event,比如有一个用户点击了下载按钮,那么就可以发送一个POST请求/GET请求到Google统计服务器。

    请求的参数可以查看Google的问题,但是这里有一个问题是文档没有提到的,就是UA是必须的。如果没有提供UA,也不会有任何报错,但是记录中就是没有。这一点在文档和debug/collect检验中都没有提到。

    其次就是cid的生成,必须是uuid v4标准,虽然文档例子是普通的数字,但是这个值是无效的。如果使用golang,可以使用

    uuid "github.com/gofrs/uuid"

  • ucore环境搭建

    ucore环境搭建

    最近搞了很多偏底层的东西,越发发现VS Code的Remote功能的便利性。

    以ucore为例,需要一些依赖,虽然也不是特别繁琐的依赖,但是不管用虚拟机,解决本地环境问题,总是需要一些工作的。而Docker可以简单解决并隔离依赖和环境。

    ucore的几个实验都需要qemu,而且是界面模式,所以还需要一个vnc提供界面支持。配置如下:

    FROM consol/ubuntu-xfce-vnc
    USER 0
    RUN sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list \
        && sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list \
        && apt-get update && apt install software-properties-common build-essential gdb gnome-terminal qemu-system scons re2c wget -y
    USER 1000

    而devcontainer的配置需要指定端口和启动脚本

    {
    	"name": 
  • VS Code远程模式编译鸿蒙代码

    鸿蒙开源了,代码托管在Gitee,下载很方便,但是说实话东西比想象的单薄很多。

    编译的话主要是依赖了gcc_riscv32,其他都是常规依赖。

    VS Code支持远程模式,直接在Docker中执行相关编译和调试,所以代码拉下来以后直接新增一个.devcontainer文件夹,配置内容如下:

    第一个是Dockerfile

    FROM ubuntu:18.04
    RUN sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list \
        && sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list \
        && apt-get update && apt install software-properties-common build-essential python3.8 python3-distutils python3-pip scons re2c wget -y
    RUN mkdir tools
    WORKDIR tools
    RUN