sonarqube 初探

 

Table of Contents

快速搭建一个sonarqube服务

创建docker-compose.yml文件

启动容器服务

访问sonarqube web

访问数据库

项目中集成sonarqube

maven 项目集成sonarqube

ant 项目集成 soanrqube

gradle项目集成sonarqube

项目直接使用sonar-scan

Jenkins中集成sonarqube

安装配置插件

freestyle job中使用sonarqube

pipeline job中使用sonarqube


 

sonarqube 是一个开放的代码质量管理平台,本文通过容器快速部署一个sonarqube服务,以及在项目中如何集成sonarqube进行了总结,希望对sonarqube的初学者能有所帮助。

 

快速搭建一个sonarqube服务

使用sonarqube镜像能够快速的搭建一个sonarqube环境,供初学者学习和了解sonarqube的特性。本文使用docker-compose创建整个学习环境。

 

创建docker-compose.yml文件

搭建环境使用 sonarqube 6.7.6 , postgres 数据库以及 adminer来管理数据库

version: "3.1"

services:
  sonarqube:
    image: sonarqube:6.7.6-community
    ports:
      - "9000:9000"
    networks:
      - sonarnet
    environment:
      - sonar.jdbc.url=jdbc:postgresql://db:5432/sonar
    volumes:
      - sonarqube_conf:/opt/sonarqube/conf
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions

  db:
    image: postgres
	ports:
	  - "5432:5432"
    networks:
      - sonarnet
    environment:
      - POSTGRES_USER=sonar
      - POSTGRES_PASSWORD=sonar
    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data
	  
   adminer:
       image: adminer
       restart: always
       ports:
          - 8088:8080

networks:
  sonarnet:
    driver: bridge

volumes:
  sonarqube_conf:
  sonarqube_data:
  sonarqube_extensions:
  postgresql:
  postgresql_data:

启动容器服务

[email protected]:/data/devops/sonarqube$ docker-compose up -d
Creating network "sonarqube_sonarnet" with driver "bridge"
Creating network "sonarqube_default" with the default driver
Creating sonarqube_db_1_bc19ad17fa01        ... done
Creating sonarqube_sonarqube_1_58b42b5eb2c4 ... done
Creating sonarqube_adminer_1_9c85e1252b37   ... done

[email protected]:/data/devops/sonarqube$ docker-compose ps
               Name                             Command               State           Ports         
----------------------------------------------------------------------------------------------------
sonarqube_adminer_1_87adf9587bb0     entrypoint.sh docker-php-e ...   Up      0.0.0.0:8088->8080/tcp
sonarqube_db_1_5622e6afa735          docker-entrypoint.sh postgres    Up      0.0.0.0:5432->5432/tcp
sonarqube_sonarqube_1_7dc22b38da57   ./bin/run.sh                     Up      0.0.0.0:9000->9000/tcp

访问sonarqube web

通过服务器所在ip以及端口9000访问sonarqube web页面,例如

http://10.122.152.26:9000  
admin with password admin

登录后可以根据提示创建一个token,后面项目集成时会用到。下面是已经上传数据的界面

sonarqube 初探

访问数据库

通过服务器所在ip以及端口8088访问数据库web接口,例如

http://10.122.152.26:8088

sonarqube 初探

登录后可以管理数据库

sonarqube 初探

 

项目中集成sonarqube

我们使用官方示例项目,演示如何使用sonarqube

https://github.com/SonarSource/sonar-scanning-examples.git

maven 项目集成sonarqube

参考 https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Maven

下载代码库
git clone https://github.com/SonarSource/sonar-scanning-examples.git

cd sonar-scanning-examples

[email protected]:/data/devops/sonarqube/sonar-scanning-examples$ ls 
objc-llvm-coverage  sonarqube-scanner-ant                  sonarqube-scanner-gradle  sonarqube-scanner-msbuild
sonarqube-scanner   sonarqube-scanner-build-wrapper-linux  sonarqube-scanner-maven   swift-coverage

cd sonarqube-scanner-maven

运行一下命令,生成sonar报告并上传到sonar服务

mvn clean install sonar:sonar \
  -Dsonar.host.url=http://10.122.152.26:9000 \
  -Dsonar.login=d539ae4a4d789a3ee5aedd87da9ec24a176ad5d5

其中 sonar.login即为通过sonarqube web登录后生成的token

ant 项目集成 soanrqube

参考 https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Ant

同上需要下载代码库


mkdir -p $HOME/.ant/lib
cd $HOME/.ant/lib
http://central.maven.org/maven2/org/sonarsource/scanner/ant/sonarqube-ant-task/2.5/sonarqube-ant-task-2.5.jar

修改 sonarqube-scanner-ant/build.xml文件

[email protected]:/data/devops/sonarqube/sonar-scanning-examples/sonarqube-scanner-ant$ git diff 
diff --git a/sonarqube-scanner-ant/build.xml b/sonarqube-scanner-ant/build.xml
index 8507856..ac9d6df 100644
--- a/sonarqube-scanner-ant/build.xml
+++ b/sonarqube-scanner-ant/build.xml
@@ -7,7 +7,7 @@
        <property name="classes.dir" value="${build.dir}/classes" />
        
        <!-- Define the SonarQube global properties (the most usual way is to pass these properties via the command line) -->
-       <property name="sonar.host.url" value="http://localhost:9000" />
+       <property name="sonar.host.url" value="http://10.122.152.26:9000" />
 
        <!-- Define the Sonar properties -->
        <property name="sonar.projectKey" value="org.sonarqube:sonarqube-scanner-ant" />
@@ -36,7 +36,7 @@
        <target name="sonar" depends="compile">
                <taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml">
                        <!-- Update the following line, or put the "sonar-ant-task-*.jar" file in your "$HOME/.ant/lib" folder -->
-                       <classpath path="path/to/sonar/ant/task/lib/sonarqube-ant-task-*.jar" />
+                       <classpath path="sonarqube-ant-task-*.jar" />
                </taskdef>
                
                <!-- Execute SonarQube Scanner for Ant Analysis -->

然后运行下面的命令
ant sonar

gradle项目集成sonarqube

参考 https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Gradle

同上下载代码库

cd sonarqube-scanner-gradle
./gradlew sonarqube -Dsonar.host.url=http://10.122.152.26:9000 -Dsonar.verbose=true

项目直接使用sonar-scan

参考 https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner

下载sonar-scanner工具
https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.2.0.1227-linux.zip

同上下载代码库

[email protected]:/data/devops/sonarqube/sonar-scanning-examples/sonarqube-scanner$ ls /home/letv/sonar-scanner-3.2.0.1227-linux/bin/
sonar-scanner  sonar-scanner-debug

[email protected]:/data/devops/sonarqube/sonar-scanning-examples/sonarqube-scanner$ export PATH=$PATH:/home/letv/sonar-scanner-3.2.0.1227-linux/bin/

[email protected]:/data/devops/sonarqube/sonar-scanning-examples/sonarqube-scanner$ which sonar-scanner
/home/letv/sonar-scanner-3.2.0.1227-linux/bin//sonar-scanner

[email protected]:/data/devops/sonarqube/sonar-scanning-examples$ cat /home/letv/sonar-scanner-3.2.0.1227-linux/conf/sonar-scanner.properties
#Configure here general information about the environment, such as SonarQube server connection details for example
#No information about specific project should appear here

#----- Default SonarQube server
sonar.host.url=http://10.122.152.26:9000

#----- Default source code encoding
#sonar.sourceEncoding=UTF-8


cd sonarqube-scanner
sonar-scanner

Jenkins中集成sonarqube

可以参考

https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Jenkins

安装配置插件

安装如下两个插件

sonarqube 初探

然后在全局配置中配置插件

sonarqube 初探

在全局工具配置中添加一个scanner

sonarqube 初探

freestyle job中使用sonarqube

在传统的freestyle项目中

配置代码源

sonarqube 初探

添加sonar扫描step

sonarqube 初探

运行构建后

sonarqube 初探

pipeline job中使用sonarqube

下面是脚本式pipeline的例子

node('master') {
  def jdk8=tool name: 'java8', type: 'jdk'
  stage('SCM') {
    git 'https://github.com/SonarSource/sonar-scanning-examples.git'
  }
  stage('SonarQube analysis') {
    withSonarQubeEnv('mysonarqube') {
      dir("sonarqube-scanner-maven"){
	     env.PATH = "${jdk8}/bin:${env.PATH}"
	     sh 'mvn clean install "${SONAR_MAVEN_GOAL}" -Dsonar.host.url="${SONAR_HOST_URL}" -Dsonar.login="${SONAR_AUTH_TOKEN}"'
	  }
    }
  }
}