ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Ubuntu18 Jenkins流水线集成Cppcheck以及SonarQube

Ubuntu18 Jenkins流水线集成Cppcheck以及SonarQube 一. 环境准备与工具链配置1.1 Cppcheck安装与基础配置在Jenkins服务器上安装Cppcheck是集成流程的第一步。根据操作系统环境选择适当的安装方式# Ubuntu/Debian sudo apt-get update sudo apt-get install -y cppcheck # CentOS/RHEL sudo yum install -y epel-release sudo yum install -y cppcheck # macOS (通过Homebrew) brew install cppcheck验证安装是否成功cppcheck --version Cppcheck 1.821.2 Jenkins插件安装在Jenkins管理界面安装以下关键插件Cppcheck Plugin用于解析和可视化报告Warnings Next Generation Plugin提供高级问题跟踪功能Dashboard View创建质量指标看板1.3 Docker 创建 networkwarriorciserver:~$ docker network create sonar-net e8b13bd477f8d17f06b63dc23f5aa7c243e17e02b472f5148d5a6e45d318e3a71.4 Docker安装 PostgreSQL容器docker pull postgres:15 15: Pulling from library/postgres 6310eb16bf42: Pull complete 639367129460: Pull complete 248bdcd6e955: Pull complete 8d2f3610bf84: Pull complete 22bf49630d7e: Pull complete d523576e6b46: Pull complete d522ad15b8c1: Pull complete 876153b11224: Pull complete 04913c3958ed: Pull complete a849d36c92a3: Pull complete d6430d172c75: Pull complete b86905d46631: Pull complete 2659259e5615: Pull complete 8f6bdf8e7ebe: Pull complete Digest: sha256:9b1d34adbce1dd07ee6e94b4a2cf698884b89bd44a6c9c12f5da8f3acbfe4957 Status: Downloaded newer image for postgres:15 docker.io/library/postgres:15查看下载的镜像docker images REPOSITORY TAG IMAGE ID CREATED SIZE postgres latest a6638641707c 7 days ago 456MB hub.zentao.net/app/zentao latest e3701acc0b2a 12 days ago 741MB启动容器docker run --name postgresql \ --restartalways \ --network sonar-net \ -e POSTGRES_USERadmin \ -e POSTGRES_PASSWORD123456 \ -e POSTGRES_DBsonarqube_db \ -p 5432:5432 \ -v /opt/postgres:/var/lib/postgresql/data \ -e ALLOW_IP_RANGE0.0.0.0/0 \ -d postgres:15参数含义如下–name后接容器名–restartalwaysdcoker启动后自动重启容器POSTGRES_USERpg数据库用户名POSTGRES_PASSWORDpg数据库密码POSTGRES_DB创建一个名为sonarqube_db的pg数据库-p 5432:5432端口映射-v主机目录-容器目录的映射ALLOW_IP_RANGE0.0.0.0/0允许任何主机访问-d守护进程方式创建容器最后一个参数镜像名。查看镜像IDdocker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1f3aac1c57ad postgres docker-entrypoint.s… 26 seconds ago Restarting (1) 3 seconds ago postgresql进入镜像内部查看信息docker exec -it 1f3aac1c57ad /bin/bash Error response from daemon: Container 1f3aac1c57ad6d090ced1e743d7d0dd772db3e1ba465fcf00527ae6b1c7b1f69 is restarting, wait until the container is running warriorciserver:/opt$ warriorciserver:/opt$ warriorciserver:/opt$ warriorciserver:/opt$ docker logs 1f3aac1c57ad Error: in 18, these Docker images are configured to store database data in a format which is compatible with pg_ctlcluster (specifically, using major-version-specific directory names). This better reflects how PostgreSQL itself works, and how upgrades are to be performed. See also https://github.com/docker-library/postgres/pull/1259 Counter to that, there appears to be PostgreSQL data in: /var/lib/postgresql/data (unused mount/volume) This is usually the result of upgrading the Docker image without upgrading the underlying database using pg_upgrade (which requires both versions). The suggested container configuration for 18 is to place a single mount at /var/lib/postgresql which will then place PostgreSQL data in a subdirectory, allowing usage of pg_upgrade --link without mount point boundary issues. See https://github.com/docker-library/postgres/issues/37 for a (long) discussion around this process, and suggestions for how to do so.这个报错的意思是‌你用了 PostgreSQL 18 的镜像但数据卷还挂在旧路径/var/lib/postgresql/data上新旧格式不兼容容器拒绝启动。‌‌‌‌核心改动‌18 镜像不再把数据放在/var/lib/postgresql/data而是放在带版本号的/var/lib/postgresql/18/docker解决办法用以下指令重新挂载docker run --name postgresql \ --restartalways \ --network sonar-net \ -e POSTGRES_USERadmin \ -e POSTGRES_PASSWORD123456 \ -e POSTGRES_DBsonarqube_db \ -p 5432:5432 \ -v /opt/postgres:/var/lib/postgresql \ -e ALLOW_IP_RANGE0.0.0.0/0 \ -d postgresdocker exec -it a31ff7e363c1 /bin/bash roota31ff7e363c1:/# roota31ff7e363c1:/# roota31ff7e363c1:/# roota31ff7e363c1:/# roota31ff7e363c1:/# psql -U admin -d sonarqube_db psql (18.6 (Debian 18.6-1.pgdg132)) Type help for help. sonarqube_db# sonarqube_db# sonarqube_db# \l List of databases Name | Owner | Encoding | Locale Provider | Collate | Ctype | Locale | ICU Rules | Access privileges -------------------------------------------------------------------------------------------------------------- postgres | admin | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | sonarqube_db | admin | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | template0 | admin | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | c/admin | | | | | | | | adminCTc/admin template1 | admin | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | c/admin | | | | | | | | adminCTc/admin (4 rows) sonarqube_db# sonarqube_db# sonarqube_db# sonarqube_db# exit roota31ff7e363c1:/# roota31ff7e363c1:/# exit exit1.5 Docker安装SonarQube容器获取企业版sonarqube镜像docker pull sonarqube:9.9-enterprise和pg容器创建不同这里需要手动创建主机到容器映射目录并将其权限修改为777。mkdir -p /opt/sonarqube/data /opt/sonarqube/extensions /opt/sonarqube/logs /opt/sonarqube/conf sudo chmod 777 -R /opt/sonarqube然后创建SonarQube容器实例docker run --name sonarqube \ --restartalways \ --network sonar-net \ -e SONAR_JDBC_URLjdbc:postgresql://postgresql:5432/sonarqube_db \ -e SONAR_JDBC_USERNAMEadmin \ -e SONAR_JDBC_PASSWORD123456 \ -p 192.168.156.37:9000:9000 \ -v /opt/sonarqube/data:/opt/sonarqube/data \ -v /opt/sonarqube/extensions:/opt/sonarqube/extensions \ -v /opt/sonarqube/logs:/opt/sonarqube/logs \ -v /opt/sonarqube/conf:/opt/sonarqube/conf \ -d sonarqube:9.9-enterprise参数含义如下同前面重复的省略SONAR_JDBC_URLpg数据库的urlip根据主机实际情况填写SONAR_JDBC_USERNAMEpg数据库用户名SONAR_JDBC_PASSWORDpg数据库密码extensions目录sonarsube插件存放目录logs日志目录conf: 配置目录不出意外容器状态会一直是restart状态此时需要使用docker logs -f sonarqube查看对应的日志信息检查错误点。一般是因为容器卷映射目录权限问题或者是需要修改主机的系统参数报错max virtual memory areas vm.max_map_count [65530] is too low。权限问题好解决直接chmod修改/opt/sonarqube目录权限为777即可。而系统参数问题解决方法参考如下在主机上宿主机非docker容器docker容器会继承宿主机的系统参数。修改系统参数vim /etc/sysctl.conf # 最后一行添加: vm.max_map_count262144 vm.max_map_count524288 sysctl -p # 加载生效在ubuntu浏览器当中输入http://192.168.156.37:9000/ 默认管理员用户及密码admin/admin。SonarQube汉化插件安装进入到插件商城搜索插件chinese按下面操作进入到插件主页进行下载下载完成后将插件拷贝到主机的/opt/sonarqube/extensions/plugins目录下plugins目录需要手动创建再次重启sonarqube容器重新登录http://ip:9000/可以看到提示变成了中文说明我们的插件安装成功了生成license将如下这段信息全部复制然后进行base64加密就是license的内容CompanyUnknown DigestNotRequired EditionEnterprise EditionLabelEnterprise Expiration2099-01-01 MaxLoc9223372036854775806 Pluginsabap,cpp,plsql,security,sonarapex,swift,tsql,vbnet,cobol,pli,rpg,vb Features* ServerId* Supportfalse Typeny0c同理如果是开发版只需将Enterprise替换为Developer。Base64转换如下Q29tcGFueT1Vbmtub3duCkRpZ2VzdD1Ob3RSZXF1aXJlZApFZGl0aW9uPUVudGVycHJpc2UKRWRpdGlvbkxhYmVsPUVudGVycHJpc2UKRXhwaXJhdGlvbj0yMDk5LTAxLTAxCk1heExvYz05MjIzMzcyMDM2ODU0Nzc1ODA2ClBsdWdpbnM9YWJhcCxjcHAscGxzcWwsc2VjdXJpdHksc29uYXJhcGV4LHN3aWZ0LHRzcWwsdmJuZXQsY29ib2wscGxpLHJwZyx2YgpGZWF0dXJlcz0qClNlcnZlcklkPSoKU3VwcG9ydD1mYWxzZQpUeXBlPW55MGM配置agent首先下载agent jar包SonarQubeAgent-1.2-SNAPSHOT.jar。使用docker命令将下载好的agent jar包拷贝到容器当中这里为方便我直接拷贝到根目录下面docker cp ./SonarQubeAgent-1.2-SNAPSHOT.jar sonarqube:/ Successfully copied 133kB to sonarqube:/新建sonar.properties文件warriorciserver:/opt/sonarqube/conf$ touch sonar.propertieswarriorciserver:/opt/sonarqube/conf$ chmod 777 sonar.properties在sonarqube的配置文件conf/sonar.propertiessonar.properties文件需要手动创建里面新增如下内容sonar.web.javaOpts-javaagent:/SonarQubeAgent-1.2-SNAPSHOT.jar -Xmx1G -Xms128m -XX:HeapDumpOnOutOfMemoryError sonar.ce.javaOpts-javaagent:/SonarQubeAgent-1.2-SNAPSHOT.jar -Xmx2G -Xms128m -XX:HeapDumpOnOutOfMemoryError重启sonarqube容器然后License Manager当中填入上文获取的证书即可docker restart sonarqube sonarqube
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进