“监控代码,How? ”
Jacoco是一个开源的覆盖率工具。Jacoco可以嵌入到Ant 、Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAgent技术监控Java程序。很多第三方的工具提供了对Jacoco的集成,如sonar、Jenkins等。本文使用的环境是:k8s jenkins 构建的,其中涉及到了在node 节点机的容器中生成jacoco.exec 文件,然后将其拷贝到节点机,再从节点机将jacoco.exec 文件拷贝到jenkins 的代码库中,用于生成报告 。
步骤如下
step 1: 引入相应的jar 到应用服务的目录下,并修改需要监测的应用服务的启动脚本 ---这是在jenkins中将相应应用服务部署脚本进行了调整 echo ' cd /opt/ wget http://192.168.214.100:7777/jacoco/tools/jacocoagent.jar #此处启动了一个siampleHttp 服务,用于获取jar 包 wget http://192.168.214.100:7777/jacoco/tools/jacocoant.jar wget -O buildexec.xml http://192.168.214.100:7777/jacoco/buildexec/build.xml wget http://192.168.214.100:7777/jacoco/tools/cron.sh sh cron.sh& #此处见step2 中编辑的脚本 sed -i "s#exec java#exec java -javaagent:/opt/jacocoagent.jar=includes=*,output=tcpserver,port=8044,address=127.0.0.1 -Xverify:none -javaagent:/opt/skywalking-agent/skywalking-agent.jar #g" /opt/mt/bin/startup.sh && cd /opt/mt/ && dos2unix -k start.sh && cd /opt/mt/bin/ && dos2unix -k startup.sh && sh startup.sh '> ./start.sh
step2: 用于在容器里定时生成jacoco.exec ,此jacoco.exec 文件是拿取的代码执行的情况文件所生成的一个exec文件----此文件仅仅是step1 需要的一个脚本文件。 [root@localhost tools]# more cron.sh while true;do ant dump -buildfile buildexec.xml;sleep 60;done
step3: 在jenkins 拉取源码处,将生成的jacoco.exec文件复制过来,然后生成最终的执行报告----这是一个jenkins job cd ../test-deploy wget -O buildreport.xml http://192.168.214.100:7777/jacoco/buildreport/build_test_model.xml wget -nc http://192.168.214.100:7777/jacoco/tools/jacocoant.jar wget -nc http://192.168.214.100:7777/jacoco/tools/dlexec.sh sh dlexec.sh testqyd test-model #详细见step4 ant report -buildfile ./buildreport.xml #生成执行的报告 open site:http://192.168.214.100:7777/jacoco/report/testqyd/test-model/jacocoReport/ #打开报告
step4: 从docker中获取jacoco.exec文件,然后放在jenkins 摘取源码的目录下[root@localhost]# more dlexec.sh platformname=1projectname=2echo "############################################## 从node节点机下载jacoco.exec文件执行脚本 ##############################################"case
1) ssh root@192.168.214.50 "kubectl get pods -n $platformname -o wide" ;;
2)pnip=`ssh 192.168.214.50 "kubectl --kubeconfig=/etc/kubernetes/kubelet.kubeconfig get pods -n $platformname -o wide|grep $projectname|awk '{print \$7}'|head -1"`
if [ $pnip == '192.168.214.55' ];then
pnip='root@192.168.214.55'
rqid=`ssh $pnip "docker ps |grep $platformname/$projectname|awk '{print \$1}'|head -1"`
ssh $pnip "docker cp $rqid:/opt/jacoco.exec /opt/test/jacoco.exec"
scp $pnip:/opt/test/jacoco.exec ./
elif [ $pnip == '192.168.214.56' ];then
pnip='root@192.168.214.56'
rqid=`ssh $pnip "docker ps |grep $platformname/$projectname|awk '{print \$1}'|head -1"`
ssh $pnip "docker cp $rqid:/opt/jacoco.exec /opt/test/jacoco.exec"
scp $pnip:/opt/test/jacoco.exec ./
else
echo "not found!"
fi
;;
esac
Jenkins执行效果图如下图所示: