使用docker技术管理Jenkins服务器。避免多次部署需要重复安装的重复工作,且可以方便迁移到新的服务器。这么好的技术,忽略多可惜。因此,我做了相关的部分工作。

前期准备:

找了一个朋友用来制作镜像的环境,找到了一份基本操作系统的镜像。

检查我们的自动构建的环境已经安装了docker客户端,我只需要把制作好的镜像pull下来,就可以启动容器。

我的工作:

1.利用基本操作系统的镜像制作安装有coverity客户端软件的镜像并推送到制品库

从制作镜像的机器某目录放了三个文件:

*_docker.sh, *-Linux-MAIN.V5.05.F7-x86_64.dvd.iso,rpmlistfile

第一个文件是执行制作镜像的shell脚本,脚本中增加拷贝不能安装的内容。第二个文件时基础操作系统的镜像,第三个文件时是增加 rpmlistfile 安装内容,里面是一系列安装文件的名字。

执行./*_docker.sh --iso *-Linux-MAIN.V5.05.F7-x86_64.dvd.iso --file rpmlistfile 可以生成新的镜像文件。对rpmlistfile里的安装文件名字根据报错增减(如bash grep gcc make dos2unix unix2dos等等)。

镜像生成成功后启动容器

docker run -it repository:tag /bin/bash

将coverity的安装文件拷贝进入容器

docker cp cov-analysis-linux64-2019.06.sh 460f6b5be1e5:/home

在容器内安装coverity,安装过程参照

https://blog.csdn.net/qq_33163046/article/details/104038678

在安装步骤第一步时,出现报错

java.lang.Error: Probable fatal error:No fonts found.

可能是字体库存在缺失。返回制作镜像的步骤,在rpmlistfile里增加dejavu* ,fontconfig ,ttmkfdir 可以解决。

修改镜像名字

docker commit -a "xxz" -m "*_coverity" 3e0492adad98  the_address_in_artnj.cop.com.cn_coverity:*_coverity/v1_0307

推送到制品库,推送钱需要登陆制品库,并确认自己有权限

docker push the_address_in_artnj.cop.com.cn_coverity:*_coverity/v1_0307

2.在jenkinsfile文件里编写代码构建coverity全量检查与增量检查的函数

在jenkinsfile.txt编写了两个函数,coverity_incre()函和coverity_all()函数。函数里调用了两个shell脚本,coverity.sh脚本和incre_coverity.sh脚本

jenkinsfile.txt增加内容

//coverity增量扫描容器
def coverity_incre(){env.starttimebd = new Date().format('yyyy-MM-dd HH:mm:ss');env.bgcoverity="bg2"my_bgcoverity=1def coverity_verifyci=0node(node_name){withEnv(["work_space=${env.CODE}"]){ws("${work_space}"){sh '''ls -l;rm -rf coverity_verifyci.log;rm -rf html;rm -rf analyze_failure.flag;docker logout docker.artnj.cop.com.cndocker login * -u $user -p $passwddocker_image=*docker pull $docker_imagedocker run --rm -i\\-v /root/.ssh/:/root/.ssh/ \\-v $work_space:/home/proto \\-e "PROJECT_DIR=/home/coverity" \\-w /home \\$docker_image /bin/bash -c \\"cd proto;cp -rf buildpath/src buildpath/lib buildpath/bin buildpath/make ../coverity;cp -rf protocol/pipe protocol/codediff ../coverity;cd /home/coverity;ls -la;HOME=/home/coverity;\\export PATH=$PATH:$HOME/bin:/usr/local/cov-analysis-linux64-2019.06/bin; \\cat codediff;cat codediff|grep -E '.c$|.h$|.cpp$|.hpp$'>codediff_cache||true;cat codediff_cache;if [ -s codediff_cache ];thenpwd;source ./.bash_profile;cd src;cp -rf ../pipe/incre_coverity.sh .;chmod 755 -Rf *.sh;dos2unix *.sh;./setproenv_64.sh;\\ls -l;./incre_coverity.sh proto 10.47.0.0 STREAM_NAME;                                                                       fiif [ -e /home/coverity/coverity_verifyci/analyze_failure.flag ];thencp /home/coverity/coverity_verifyci/analyze_failure.flag  /home/proto/log;\\chmod 777 /home/proto/log/analyze_failure.flag;fiif [ -s /home/coverity/coverity_verifyci/coverity_verifyci.log ];thencp /home/coverity/coverity_verifyci/coverity_verifyci.log  /home/proto/log;\\chmod 777 /home/proto/log/coverity_verifyci.log;\\cov-format-errors --dir /home/coverity/coverity_verifyci/ --html-output /home/coverity/coverity_verifyci/html --title proto -x;fiif [ -s /home/coverity/coverity_verifyci/html/index.html ];thencp -rf /home/coverity/coverity_verifyci/html  /home/proto;\\chmod -R 777 /home/proto/html;fi"'''if (fileExists("${work_space}/log/analyze_failure.flag")){coverity_verifyci=2}if (fileExists("${work_space}/log/coverity_verifyci.log")){coverityResult = readFile("${work_space}/coverity_verifyci.log")if(coverityResult.contains("Defect only exists locally")){println "coverity scan error!!!"coverity_verifyci=1publishHTML([allowMissing: false, alwaysLinkToLastBuild: true, keepAll: true, reportDir: "${work_space}/log", reportFiles: 'coverity_verifyci.log', reportName: 'Coverity incre Scan Result'])if (fileExists("${work_space}/html/index.html")){publishHTML([allowMissing: false, alwaysLinkToLastBuild: true, keepAll: true, reportDir: "${work_space}/html", reportFiles: 'index.html', reportName: 'Coverity incre Scan Result.html'])                       }}}}}}if(coverity_verifyci==1){error  "coverity scan error"}else if (coverity_verifyci==2){error  "coverity analyze error"   }else{env.bgcoverity="bg1"my_bgcoverity=0println "coverity scan successful"}
}
//coverity全量扫描容器
def coverity_all(){env.starttimebd = new Date().format('yyyy-MM-dd HH:mm:ss');my_bgcoverity=1env.bgcoverity=1node(node_name){withEnv(["work_space=${env.CODE}"]){ws("${work_space}"){sh '''rm -rf index.html;rm -rf html;ls -l;docker logout docker.artnj.cop.com.cndocker login * -u $art_user -p $art_passwd                 docker_image=*docker pull $docker_imagedocker run --rm -i\\-v /root/.ssh/:/root/.ssh/ \\-v $work_space:/home/proto \\-e "PROJECT_DIR=/home/coverity" \\-w /home \\$docker_image /bin/bash -c \\"ls -la;cd proto;ls -l;cp -rf buildpath/src buildpath/lib buildpath/bin buildpath/make ../coverity;cp -rf protocol/pipe ../coverity;cd /home/coverity;ls -la;HOME=/home/coverity;\\export PATH=$PATH:$HOME/bin:/usr/local/cov-analysis-linux64-2019.06/bin; \\source ./.bash_profile;cd src;cp -rf ../pipe/coverity.sh .;chmod 755 -Rf *.sh;dos2unix *.sh;./setproenv_64.sh;\\ls -l;./coverity.sh proto 10.47.0.0 STREAM_NAME;if [ -s /home/coverity/coverity_proto/html/index.html ];thencp -rf  /home/coverity/coverity_proto/html  /home/proto;chmod -R 777 /home/proto/html;fi"'''if (fileExists($work_space/coverity_coverity/html/index.html")){publishHTML([allowMissing: false, alwaysLinkToLastBuild: true, keepAll: true, reportDir: "${work_space}/html", reportFiles: 'index.html', reportName: 'Coverity Scan Result'])                    println 'coverity publishHTML over'}}}}env.bgcoverity = 0println 'coverity is successful'my_bgcoverity=0
}

coverity.sh

#!/bin/bashset -xBRANCH_VERSION=$1
COV_SERVER_ADDR=$2
SOURCE_STREAM=$3midd_dir="$HOME/coverity_${BRANCH_VERSION}"if [ -d "$midd_dir" ]; thenrm -rf $midd_dir
fi
html_path="${midd_dir}/html"OLDIFS="$IFS"
IFS=$'\n'
stream_info=(`cov-manage-im --host ${COV_SERVER_ADDR} --user username --password password --mode streams --show --name "${SOURCE_STREAM}"`)if [ ${#stream_info[*]} -eq 1 ];thenecho "================================================================================="echo "|| error : no $source_stream stream in Coverity Platform ||"echo "================================================================================="exit 1fi
IFS="$OLDIFS"cov-configure --gcc
cov-build --dir $midd_dir make Clean Install
cov-analyze --dir $midd_dir --all \
--rule \
--enable-constraint-fpp \
--enable-callgraph-metrics \
--enable-fnptr \
--enable-virtual \
--enable USER_POINTER \
--enable DC.STRING_BUFFER \
--enable ENUM_AS_BOOLEAN \
--enable UNENCRYPTED_SENSITIVE_DATA \
--enable WEAK_GUARD \
--enable WEAK_PASSWORD_HASH \
--enable HARDCODED_CREDENTIALS \
--enable AUDIT.SPECULATIVE_EXECUTION_DATA_LEAK \
--enable INTEGER_OVERFLOW \
--enable MIXED_ENUMS \
--enable RISKY_CRYPTO \
--enable COM.ADDROF_LEAK \
--enable COM.BSTR.ALLOC \
--enable COM.BSTR.BAD_COMPARE \
--enable COM.BSTR.NE_NON_BSTR \
--enable FLOATING_POINT_EQUALITY \
--enable VCALL_IN_CTOR_DTOR \
--strip-path=$HOME
if [ $? -ne 0 ]; thenecho "error: coverity analyze failure"exit 1
fi
cov-format-errors --dir $midd_dir --html-output $html_path --lang zh-cn --title name -x
cov-commit-defects --dir $midd_dir --host ${COV_SERVER_ADDR}  --user username --password password --stream $SOURCE_STREAM
if [ $? -ne 0 ]; thenecho "error: coverity commit failure"exit 1
fi

incre_coverity.sh

#!/bin/bashset -xBRANCH_VERSION=$1
COV_SERVER_ADDR=$2
SOURCE_STREAM=$3midd_dir="$HOME/coverity_verifyci"if [ -d "$midd_dir" ]; thenrm -rf $midd_dir
fi
html_path="${midd_dir}/html"cov-configure --gcc
cov-build --dir $midd_dir makecd ..
filediff=`cat codediff_cache`
echo $filediffcov-run-desktop --dir $midd_dir --all \
--rule \
--enable-constraint-fpp \
--enable-callgraph-metrics \
--enable-fnptr \
--enable-virtual \
--enable USER_POINTER \
--enable DC.STRING_BUFFER \
--enable ENUM_AS_BOOLEAN \
--enable UNENCRYPTED_SENSITIVE_DATA \
--enable WEAK_GUARD \
--enable WEAK_PASSWORD_HASH \
--enable HARDCODED_CREDENTIALS \
--enable AUDIT.SPECULATIVE_EXECUTION_DATA_LEAK \
--enable INTEGER_OVERFLOW \
--enable MIXED_ENUMS \
--enable RISKY_CRYPTO \
--enable COM.ADDROF_LEAK \
--enable COM.BSTR.ALLOC \
--enable COM.BSTR.BAD_COMPARE \
--enable COM.BSTR.NE_NON_BSTR \
--enable FLOATING_POINT_EQUALITY \
--enable VCALL_IN_CTOR_DTOR \
--strip-path=$HOME \
--ignore-uncapturable-inputs true --host ${COV_SERVER_ADDR}  --user user  --password password  --stream "${SOURCE_STREAM}" \
--reference-snapshot latest   --present-in-reference false  --impact-regex "Medium|High"  --lang zh-cn --text-output $midd_dir/coverity_verifyci.log $filediff
if [ $? -ne 0 ]; thenecho "error: coverity analyze failure"exit 1
fi
if [ -e $midd_dir/coverity_verifyci.log ]; thenchmod  777 $midd_dir/coverity_verifyci.log
fi

3.测试

镜像拉取日志

16:50:56 [Coverity] v1_0307: Pulling from *

16:50:56 [Coverity] a62007c53c34: Pulling fs layer

16:50:56 [Coverity] ea8e416f481e: Pulling fs layer

16:51:05 [Coverity] a62007c53c34: Verifying Checksum

16:51:05 [Coverity] a62007c53c34: Download complete

16:51:18 [Coverity] ea8e416f481e: Verifying Checksum

16:51:18 [Coverity] ea8e416f481e: Download complete

16:51:30 [Coverity] a62007c53c34: Pull complete

16:53:21 [Coverity] ea8e416f481e: Pull complete

16:53:21 [Coverity] Digest: sha256:e387fea821bbc9ae851ea51bf7b90963bd1906d2e6ac15dc43340bbb4fb83fc6

执行过程中用“docker ps -a”可以观察到容器启动执行结束后主动销毁。

观察到执行成功日志

17:19:30 [Coverity] New snapshot ID 15628 added.

检查确实有最新coverity检查提交的记录。

在全量检查和增量检查结束后,jenkins界面会出现

点击进去可以看到检测结果。

jenkins+docker进行coverity检查自动构建相关推荐

  1. x86 下制作 ARM Docker 镜像,Docker Hub、Travis 自动构建 qemu-user-static

    一般情况下,Docker 的镜像都是在一个已有的镜像内,一步步运行给定的命令,从而生成一个新的镜像.这样的步骤在大多数人使用的 x86 架构计算机上都不是问题,由于架构互相兼容,一台计算机上生成的镜像 ...

  2. 用Docker自动构建纸壳CMS

    纸壳CMS可以运行在Docker上,接下来看看如何自动构建纸壳CMS的Docker Image.我们希望的是在代码提交到GitHub以后,容器镜像服务可以自动构建Docker Image,构建好以后, ...

  3. (开包即用,不用看代码!)借助Docker自动构建Java(Oracle)镜像

    开包即用,不用看代码! 如果着急使用可以直接使用我构建的镜像,请从配置镜像源开始看 Docker中的Java Java可能是程序员最常用的运行时环境了, 即使你不开发Java程序,大量的开发工具也需要 ...

  4. jenkins+gitlab实现手动和自动同步

    jenkins+gitlab实现手动和自动同步 jenkins介绍: jenkins安装: jenkins和gitlab手动同步 jenkins和gitlab自动同步 jenkins介绍: CI&am ...

  5. 使用Docker+Jenkins自动构建部署

    转载自 https://segmentfault.com/a/1190000012921606 环境 阿里云ESC,宿主机服务器安装Docker,在安全规则中确认8080端口开启. 客户端mac 运行 ...

  6. 实战:向GitHub提交代码时触发Jenkins自动构建

    当我们提交代码到GitHub后,可以在Jenkins上执行构建,但是每次都要动手去执行略显麻烦,今天我们就来实战Jenkins的自动构建功能,每次提交代码到GitHub后,Jenkins会进行自动构建 ...

  7. 怎么把项目推到gitlab上_Gitlab利用Webhook+jenkins实现自动构建与部署

    之前部署了Gitlab的代码托管平台和Jenkins的代码发布平台.通常是开发后的代码先推到Gitlab上管理,然后在Jenkins里通过脚本构建代码发布. 这种方式每次在发版的时候,需要人工去执行j ...

  8. 【完整示例】采用jenkins pipeline实现自动构建并部署至k8s

    前言 在日常开发中,经常会有发布的需求,而且经常会碰到各种环境,比如:开发环境.测试环境.生产环境.虽然可以使用手动构建.上传服务器部署的方式,但在微服务架构下一个项目经常包含多个微服务的部署,如果用 ...

  9. gitlab 自动推送代码到gitee_Gitlab 利用 Webhook+jenkins 实现自动构建与部署

    之前部署了Gitlab的代码托管平台和Jenkins的代码发布平台.通常是开发后的代码先推到Gitlab上管理,然后在Jenkins里通过脚本构建代码发布. 这种方式每次在发版的时候,需要人工去执行j ...

  10. P8-07-16 使用 Jenkins 自动构建 Maven 项目

    创建一个项目 从 gitee 上随便拉一个项目,这里我们使用Zrlog项目进行测试.测试项目地址: https://gitee.com/94fzb/zrlog?_from=gitee_search 导 ...

最新文章

  1. 正则表达式——全部符号解释(详解)
  2. LeetCode 670. 最大交换
  3. Milking Time【动态规划-dp】
  4. linux批量部署war工具,Linux 批量一键部署工具 Expect
  5. 《深入理解计算机系统》第七章 链接
  6. 我被跨系统的换行符折磨疯了~~~
  7. C++中链表的一些操作
  8. Beijing Thwarts Coke's Takeover Bid
  9. 函数计算机math,Math数学函数
  10. ios保存gif到相册_iOS如何保存下载GIF图片
  11. 视频剪辑教程,视频批量分割,分割后的新视频怎么保存
  12. 迷时师度 悟了自度
  13. 联想全系列 Lenovo ThinkPad ThinkBook Thinkcenter ThinkStation 原厂恢复系统
  14. 如何做好SEM竞价营销
  15. SPSS实现系统聚类
  16. One git command may cause you hacked(CVE-2014-9390)
  17. 对Java零基础学习者的建议以及分享
  18. busybox文件系统与简单驱动学习(4)-RT3070无线网卡STA模式配置
  19. 吴恩达深度学习资料 Quiz+ 编程+ ppt+学习笔记(可jupyter笔记本实战)
  20. 图片编辑用什么软件?快把这些软件收好

热门文章

  1. 支付宝小程序链接跳转异常处理方法
  2. 自学c语言需要什么要求,学习c语言需要什么基础
  3. debian笔记本电源管理
  4. WinPE 安装系统
  5. 机械工程师CAD2016
  6. 工业软件下载大全202108
  7. LayoutInflater Factory
  8. 电脑WindowsUDP53绕过校园网认证登陆(同时可进内外网教程)
  9. nds android7.0模拟器,NDS用MD模拟器jEnesisDS 0.7
  10. 基于Node.js实现一个小小的爬虫