请教关于使用jacoco agent获取代码覆盖率的方案

公司最近要代码覆盖率收集,做了些调研,目前java/kotlin based的服务基本上是通过jacoco on-the-fly方式注入然后获取覆盖率数据,主要包括agent注入和覆盖率数据收集两块,请教两个问题:

  1. 关于jacoco agent 注入
    由于公司目前基本上是通过k8s+argocd来部署各个服务,经过调研可以通过iniContainer共享agent jar文件然后通过添加JAVA OPTIONS环境变量,这样服务启动的时候会自动注入该agent,但会带来一个问题,这个方案需要修改helm charts,而不同的k8s集群使用的helm charts是不同的,这样就需要相同的配置在不同的charts上都需要修改,开发和维护都不方便,是否可以进行动态添加配置呢. (另外直接加到服务的docker image也是很不方便的,不同的服务的docker image构建都是不同的)
  2. 关于数据dump
    tcpserver模式获取覆盖率数据需要pod ip,而pod ip在k8S里面不是固定的,所以不能通过ip方式。我在想是不是可以各个k8s 集群都部署一个服务(参考过饿了么的super-jacoco),通过服务名找到pod,通过kubectl exec以及cp来dump覆盖率数据以及上传到ftp服务中,但这个方案可能有个问题,如果pod重启了,数据会丢失,所以另外了解到是否可以通过sidecar容器方式来定期上传覆盖率数据,但是k8s这块不是很熟,不确定是否可行

不知有没有一个经过实践的较成熟的方案来参考,感谢~

jacoco agent 的注入

从k8s的官方找到了一个准入控制自带的东西 MutatingAdmissionWebhook,应该是可以实现注入的,不过需要自己编写一个webhook来实现对pod的控制,大致的思路可以参考一下这篇文章
实现一个k8s Admission Webhook - 简书 (jianshu.com)

数据dump的话

sidecar 模式不错,大致的思路是这样
Sidecar 容器可以与主容器共享存储卷,定期从共享卷中读取覆盖率数据并上传到 FTP 服务。

  • 步骤
    1. 在 Pod 中添加一个 Sidecar 容器,与主容器共享存储卷。
    2. Sidecar 容器定期执行脚本,从共享卷中读取覆盖率数据并上传到 FTP 服务。
    3. 使用 Kubernetes 的 emptyDirhostPath 卷来存储覆盖率数据。
  • 优点
    • 数据可以定期上传,避免 Pod 重启导致数据丢失。
    • 无需依赖 Pod IP。
  • 缺点
    • 需要额外的存储卷配置。
    • Sidecar 容器可能会增加资源消耗。

非常感谢