持续集成 在 k8s 中收集 python coverage

尼古拉斯赵四 · 2019年06月18日 · 970 次阅读

coveragepy-k8s

随着目前 k8s 的使用越来越广泛,也对一些其他技术解决方案产生了改变,这里就讲下 如何在 k8s 部署的 python 项目中非侵入式的收集到 coverage。项目地址:Github

coverage 收集在 k8s pod 中

  1. Dockerfile 中增加相应的依赖下载
RUN pip install coverage==4.5.1
RUN apt-get install screen
  1. 在 containers 中 设置 tty 为 true
containers:
  - name: server
    image: server:latest
    tty: true

  1. 将启动服务的命令修改,因为 coverage.py 采集的方式是通过进程接受 "终止"信号来进行采集的,这样修改使得,进程被 kill 时候不会导致容器重启。
command: ['screen', '-S', 'coverage', 'coverage', 'run', '--branch', '--concurrency=gevent', '--parallel-mode', '/code/server/application.py']

  1. 在 yaml 中对容器增加 preStop 的操作,目的是 通过 delete pod 的时候 接受到"终止"信号,触发 preStop 进行采集,这样的好处是,k8s 的 pod 在接受"终止信号时候",会立即创建一个新的 pod,这样能够几乎不影响服务的使用
lifecycle:
  preStop:
    exec:
      command:
        - "bash"
        - "-c"
        - |
          kill -SIGINT 9
          coverage combine;
          coverage xml -i
          curl -X POST tool-upload.tool.svc.cluster.local:5000/upload -F  "file=@coverage.xml" -F pod="server" //将coverage.xml 通过接口上传到nfs
  1. tool-upload.tool.svc.cluster.local:5000 是使用 k8s 的内部地址的服务,规则是{server}.{namespace}.svc.cluster.local:{port},然后通过这个接口把 coverage.xml 传到固定的地方,我这边是在 k8s 集群里部署了一个上传服务,大家也可以本地起一个上传服务只要 ip 能通就行。

    这个服务可以 从flask_app_k8s这个文件中里 进行部署

    docker build -t tool-upload:v0.1 .  #docker build 出上传服务的进行
    kubectl create namespace tool #创建namespace
    kubectl create -f tool_upload.yaml  #创建上传文件的服务,在yaml中配置了 nfs,这样就可以把coverage上传到这个xml中
    

网上没有搜到相关的方法,就想到通过 tty + screen 的方式让 coveragepy 能够收集到 coverage ,欢迎一起 交流更好的方式

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册