sonar+sonar-scanner+gitlab+gitlab-runner实现代码的检测、部署以及通知

前言

随着工作量越来越大,我们需要保证我们的工作效率的同时保证我们的代码的质量,所以我们需要一些自动化的东西加入到我们的工作中
自动化部署、自动化测试、自动化通知等。

文章内容

改文章主要简述如何通过sonar进行代码检测
如何实现自动部署和自动检测将在下一篇中简述

什么是sonar

官网地址
sonar实现对静态代码的扫描,给我对代码质量、安全的解析

需要实现功能

  • 一台centos7 服务器
    • 安装gitlab
    • 安装sonar
    • 安装sonar数据库
  • 一台客户端服务器
    • 安装gitlab-runner
    • 安装sonar-scanner
    • 安装构建java的maven
  • 实现功能,通过gitlab推送代码到gitlab服务器,gitlab通过gitlab-runner实现触发,通过.gitlab-ci.yml控制触发后流程,再流程中通过脚本实现对代码的检测,对代码的构建,对代码的部署,对部署结果的通知到企业微信。


    实现结果图

安装

  • sonarqube-7.9就不支持mysql

下载sonar

wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.8.zip

创建数据库

# 编写docker-compose.yml
vim docker-compose.yml 

version: '3.3'

services:
  sonarqube_mysql:
    environment:
        MYSQL_ROOT_PASSWORD: 123456
    image: mysql:5.7
    restart: always
    volumes:
        - /ENV/mysql/sonarqube/mysql/data/:/var/lib/mysql/
        - /ENV/mysql/sonarqube/mysql/conf/:/etc/mysql/
    ports:
        - 3306:3306
    container_name: sonarqube_mysql
    


# 创建对应目录并启动
mkdir /ENV/mysql/sonarqube/mysql/{data,conf} -p
docker-compose up -d
# 连接上mysql创建数据库sonar
create database sonar default character set utf8 collate utf8_general_ci;
# 授权
grant all on sonar.* to sonar@'%' identified by '123456';

编辑配置文件

vim sonar.properties
sonar.jdbc.username=sonar
sonar.jdbc.password=123456
sonar.jdbc.url=jdbc:mysql://192.168.0.71:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
< sonar.host.url >http://192.168.0.71:9000</ sonar.host.url > <!-- Sonar服务器访问地址 -->
sonar.login=admin
sonar.password=admin
sonar.web.host=0.0.0.0
sonar.web.port=9000

启动进入web打开URL:9000

su sonar ./sonar.sh start

安装sonar-scan

  • 下载sonar-scanner-cli-4.0.0.1744-linux.zip
# 页面地址
https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/
# 下载地址
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.0.0.1744-linux.zip
  • 解压
unzip sonar-scanner-cli-4.0.0.1744-linux.zip
  • 配置PATH
ln -s sonar-scanner-cli-4.0.0.1744-linux sonar-scanner
vim /etc/profile
export PATH=$PATH:/INSTALL/sonar/PATH/sonar-scanner/bin
source /etc/profile

扫描java

  • 服务端页面创建项目


    点击+创建项目
输入项目名字

得到token

得到token
image.png
  • 服务器上运行
# 需要加最后一行,否则会报错
mvn sonar:sonar \
  -Dsonar.projectKey=test_java \
  -Dsonar.host.url=http://192.168.0.71:9000 \
  -Dsonar.login=d003e898d6a34d0db25b255cbbe66a6bd771c746
  -Dsonar.java.binaries=target/sonar
  • 页面刷新可以看到报告


    生成报告页面

扫描前端(h5,js等)

  • 创建项目


    创建项目
  • 生成token


    生成token
  • 得到服务器运行命令


    得到命令

服务器运行

sonar-scanner \
  -Dsonar.projectKey=test_web \
  -Dsonar.sources=. \
  -Dsonar.host.url=http://192.168.0.71:9000 \
  -Dsonar.login=06992092bbd9e25758f2b5d047bea4027d46824c
  • 生成报告


    生成报告

配置中文模块

配置中文

安装成功,重启服务
  • 需要5分钟后刷新看结果


    安装中文包成功

sonar 连接gitlab

wget https://github.com/gabrie-allaigre/sonar-gitlab-plugin/releases/download/3.0.2/sonar-gitlab-plugin-3.0.2.jar
cp sonar-gitlab-plugin-3.0.2.jar  <sonarqube_install_dir>/extensions/plugins
# 重启sonar
# 应用市场安装gitlab相关的插件
安装插件

配置连接gitlab用户

  • 创建gitlab用户,略
创建tokens

配置sonar


配置sonar中的gitlab

常见报错

sonar 应为java版本问题

  • 报错日志
--> Wrapper Started as Daemon
Launching a JVM...
Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
  Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.


WrapperSimpleApp: Encountered an error running main: java.lang.IllegalStateException: SonarQube requires Java 11+ to run
java.lang.IllegalStateException: SonarQube requires Java 11+ to run
        at org.sonar.application.App.checkJavaVersion(App.java:93)
        at org.sonar.application.App.start(App.java:56)
        at org.sonar.application.App.main(App.java:98)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.tanukisoftware.wrapper.WrapperSimpleApp.run(WrapperSimpleApp.java:240)
        at java.lang.Thread.run(Thread.java:748)
<-- Wrapper Stopped
  • 解决办法
# 重新下载java
https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html
# 配置java虚拟环境则可以
# 查看版本
java -version
java version "11.0.4" 2019-07-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.4+10-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.4+10-LTS, mixed mode)

  • 日志报错
2019.07.25 11:14:22 WARN  app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [es]: 1
2019.07.25 11:14:22 INFO  app[][o.s.a.SchedulerImpl] Process[es] is stopped
2019.07.25 11:14:22 INFO  app[][o.s.a.SchedulerImpl] SonarQube is stopped
<-- Wrapper Stopped
2019.07.25 11:22:29 ERROR es[][o.e.b.Bootstrap] Exception
java.lang.RuntimeException: can not run elasticsearch as root
    at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:103) ~[elasticsearch-6.8.0.jar:6.8.0]
    at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:170) ~[elasticsearch-6.8.0.jar:6.8.0]
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) [elasticsearch-6.8.0.jar:6.8.0]
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) [elasticsearch-6.8.0.jar:6.8.0]
    at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) [elasticsearch-6.8.0.jar:6.8.0]
    at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) [elasticsearch-6.8.0.jar:6.8.0]
    at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) [elasticsearch-cli-6.8.0.jar:6.8.0]
    at org.elasticsearch.cli.Command.main(Command.java:90) [elasticsearch-cli-6.8.0.jar:6.8.0]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:116) [elasticsearch-6.8.0.jar:6.8.0]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93) [elasticsearch-6.8.0.jar:6.8.0]
2019.07.25 11:22:29 WARN  es[][o.e.b.ElasticsearchUncaughtExceptionHandler] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[elasticsearch-6.8.0.jar:6.8.0]
    at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-6.8.0.jar:6.8.0]
    at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-6.8.0.jar:6.8.0]
    at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-6.8.0.jar:6.8.0]
    at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-6.8.0.jar:6.8.0]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:116) ~[elasticsearch-6.8.0.jar:6.8.0]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93) ~[elasticsearch-6.8.0.jar:6.8.0]
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
    at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:103) ~[elasticsearch-6.8.0.jar:6.8.0]
    at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:170) ~[elasticsearch-6.8.0.jar:6.8.0]
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) ~[elasticsearch-6.8.0.jar:6.8.0]
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-6.8.0.jar:6.8.0]
    ... 6 more
  • 解决办法
# 使用非root启动
su sonar ./bin/linux-x86-64/sonar.sh status
  • elasticsearch process is too low日志报错
[root@test2 logs]# tailf es.log 
2019.07.25 11:26:25 INFO  es[][o.e.t.TransportService] publish_address {127.0.0.1:9001}, bound_addresses {127.0.0.1:9001}
2019.07.25 11:26:25 INFO  es[][o.e.b.BootstrapChecks] explicitly enforcing bootstrap checks
2019.07.25 11:26:25 ERROR es[][o.e.b.Bootstrap] node validation exception
[2] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
2019.07.25 11:26:25 INFO  es[][o.e.n.Node] stopping ...
2019.07.25 11:26:26 INFO  es[][o.e.n.Node] stopped
2019.07.25 11:26:26 INFO  es[][o.e.n.Node] closing ...
2019.07.25 11:26:26 INFO  es[][o.e.n.Node] closed
  • 解决办法
vim /etc/security/limits.conf
sonar hard nofile 65536
sonar soft nofile 65536
  • 没有报错,但是无法启动
2019.07.25 12:03:21 INFO  app[][o.s.a.SchedulerImpl] Process[es] is up
2019.07.25 12:03:21 INFO  app[][o.s.a.ProcessLauncherImpl] Launch process[[key='web', ipcIndex=2, logFilenamePrefix=web]] from [/ENV/SonarQube/sonarqube-7.9.1]: /usr/local/jdk-11.0.4/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/ENV/SonarQube/sonarqube-7.9.1/temp --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED -Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError -Dhttp.nonProxyHosts=localhost|127.*|[::1] -cp ./lib/common/*:/ENV/SonarQube/sonarqube-7.9.1/lib/jdbc/mysql/mysql-connector-java-5.1.46.jar org.sonar.server.app.WebServer /ENV/SonarQube/sonarqube-7.9.1/temp/sq-process6136915182525445856properties
2019.07.25 12:03:26 INFO  app[][o.s.a.SchedulerImpl] Process[web] is stopped
2019.07.25 12:03:26 INFO  app[][o.s.a.SchedulerImpl] Process[es] is stopped
2019.07.25 12:03:26 WARN  app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [es]: 143
2019.07.25 12:03:26 INFO  app[][o.s.a.SchedulerImpl] SonarQube is stopped
<-- Wrapper Stopped
2019.07.25 13:48:36 ERROR web[][o.s.s.p.Platform] Web server startup failed: 
#############################################################################################################
#         End of Life of MySQL Support : SonarQube 7.9 and future versions do not support MySQL.            #
#         Please migrate to a supported database. Get more details at                                       #
#         https://community.sonarsource.com/t/end-of-life-of-mysql-support                                  #
#         and https://github.com/SonarSource/mysql-migrator                                                 #
#############################################################################################################
jvm 1    | ERROR: [1] bootstrap checks failed
jvm 1    | [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
jvm 1    | 2019.07.26 22:40:45 WARN  app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [es]: 78
jvm 1    | 2019.07.26 22:40:45 INFO  app[][o.s.a.SchedulerImpl] Process[es] is stopped
jvm 1    | 2019.07.26 22:40:45 INFO  app[][o.s.a.SchedulerImpl] SonarQube is stopped
  • 解决办法
vim /etc/sysctl.conf
vm.max_map_count=655360
sysctl -p
  • 错误日志
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.4+10-LTS, mixed mode)
[root@test2 ldd-XXX]# mvn sonar:sonar \
>   -Dsonar.projectKey=ldd-attendance \
>   -Dsonar.host.url=http://192.168.0.71:9000 \
>   -Dsonar.login=5f276ec558029a844a4122813d5cda748fdxxxx


[INFO] 1 source files to be analyzed
[INFO] Sensor XML Sensor [xml] (done) | time=11ms
[INFO] 1/1 source files have been analyzed
[INFO] ------------- Run sensors on module front-end
[INFO] Sensor JavaSquidSensor [java]
[INFO] Configured Java source version (sonar.java.source): 8
[INFO] JavaClasspath initialization
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for laodeduo 0.0.1-SNAPSHOT:
[INFO] 
[INFO] laodeduo ........................................... FAILURE [ 14.021 s]
[INFO] model-util ......................................... SKIPPED
[INFO] common-base ........................................ SKIPPED
[INFO] front-end .......................................... SKIPPED
[INFO] back-end ........................................... SKIPPED
[INFO] authe-autho ........................................ SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  15.581 s
[INFO] Finished at: 2019-07-29T18:46:21+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.6.0.1398:sonar (default-cli) on project laodeduo: Please provide compiled classes of your project with sonar.java.binaries property -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException


  • 解决办法
# 加上   -Dsonar.java.binaries=target/sonar
 mvn sonar:sonar   \
   -Dsonar.projectKey=java  \
   -Dsonar.host.url=http://192.168.0.71:9000  \
   -Dsonar.login=8006f416e06dc8b16fbc32763741cc0d9414xxxx \
   -Dsonar.java.binaries=target/sonar
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容