sonarqube的部署与代码质量简单测试案例

SonarQube介绍

1、SonarQube 是一个用于代码质量管理的开放平台,通过插件机制实现对不同语言的源代码质量扫描,如go、python、java、python等代码扫描并生成扫描报告,官方网站:http://www.sonarqube.org。
2、下载地址:https://www.sonarqube.org/downloads
3、支持25种以上的常见编程语言,如java、pyhton、go、c、JavaScript等。
4、插件化,便于后期功能扩展。
5、可视化展示代码分析结果。
 

SonarQube代码扫描流程:

 
 

环境依赖

软件依赖:

1、https://docs.sonarqube.org/8.9/requirements/requirements/
2、7.9.x 版本开始不再支持MySQL
3、不能使用root用户启动SonarQube 

硬件依赖:

1、https://docs.sonarqube.org/8.9/requirements/hardware-recommendations/ 
2、CPU、内存、磁盘、网卡、数据库
 
 
本文PostgreSQL和SonarQube都在一台服务器上部署

部署PostgreSQL 14.x:   

PostgreSQL安装:

 

PostgreSQL安装:

 

sudo apt update
apt-cache madison postgresql
apt install postgresql 
 

PostgreSQL环境初始化

1、sudo pg_createcluster --start 12 mycluster #指定版本为PostgreSQL 12
2、vim /etc/postgresql/14/mycluster/pg_hba.conf

如果PostgreSQL单独一个服务器,则上面127.0.0.1/32 需要修改成 0.0.0.0/0

3、vim /etc/postgresql/14/mycluster/postgresql.conf
60行 打开  listen_addresses = localhost   
同样如果PostgreSQL单独一个服务器,则改成listen_addresses = '*'

PostgreSQL端口验证

systemctl restart postgresql  重启

lsof -i:5432   
 

创建数据库及账户授权

su - postgres #切换到postgres普通用户
psql -U postgres #进入到postgresql命令行敞口
CREATE DATABASE sonar; #创建sonar数据库 
CREATE USER sonar WITH ENCRYPTED PASSWORD '123456'; #创建sonar用户密码为123456
GRANT ALL PRIVILEGES ON DATABASE sonar TO sonar; #授权用户访
ALTER DATABASE sonar OWNER TO sonar; #执行变更
\q #退出
exit

 

 

部署SonarQube Server 8.9.x:

安装jdk 11:

apt install -y openjdk-11-jdk

内核参数:

vim /etc/sysctl.conf 

    vm.max_map_count = 524288
    fs.file-max = 131072

vim /etc/security/limits.conf 
root                soft    core            unlimited
root                hard    core            unlimited
root                soft    nproc           1000000
root                hard    nproc           1000000
root                soft    nofile          1000000
root                hard    nofile          1000000
root                soft    memlock         32000
root                hard    memlock         32000
root                soft    msgqueue        8192000
root                hard    msgqueue        8192000

*                soft    core            unlimited
*                hard    core            unlimited
*                soft    nproc           1000000
*                hard    nproc           1000000
*                soft    nofile          1000000
*                hard    nofile          1000000
*                soft    memlock         32000
*                hard    memlock         32000
*                soft    msgqueue        8192000
*                hard    msgqueue        8192000

 

部署SonarQube 8.9.x:

mkdir /apps && cd /apps/   上传sonarqube二进制文件
unzip sonarqube-8.9.10.61524.zip 
ln -sv /apps/sonarqube-8.9.10.61524 /apps/sonarqube
useradd -r -m -s /bin/bash sonarqube && chown sonarqube.sonarqube /apps/ -R && su - sonarqube
vim /apps/sonarqube/conf/sonar.properties
   18 sonar.jdbc.username=sonar
   19 sonar.jdbc.password=123456
    37 sonar.jdbc.url=jdbc:postgresql://localhost/sonar  注:如果postgresql不在本机,需要localhost需要填写postgresql所在服务器的ip
/apps/sonarqube/bin/linux-x86-64/sonar.sh start
 

验证SonarQube:

tail /apps/sonarqube/logs/*.log 
lsof -i:9000

 

访问web界面:

默认账户: admin
默认密码:admin #首次登录需要修改密码

 

 

插件管理

Administration--> Marketplace--> I understand the risk(首次需要点击我理解风险)-->all
Administration--> System--> Restart Server #新插件安装成功后需要重启SonarQube server
 

 

 

认证管理:

配置--> 权限--> Force user authentication

 

 

service 文件:

# cat /etc/systemd/system/sonarqube.service 
[Unit] 
Description=SonarQube service 
After=syslog.target network.target 
[Service] 
Type=simple 
User=sonarqube 
Group=sonarqube 
PermissionsStartOnly=true
ExecStart=/bin/nohup /usr/bin/java -Xms1024m -Xmx1024m -Djava.net.preferIPv4Stack=true -jar /apps/sonarqube/lib/sonar-application-8.9.10.61524.jar
StandardOutput=syslog 
LimitNOFILE=131072 
LimitNPROC=8192 
TimeoutStartSec=5 
Restart=always 
SuccessExitStatus=143 
[Install] 
WantedBy=multi-user.target

 

systemctl daemon-reload

systemctl start sonarqube.service

systemctl enable sonarqube.service

 

部署扫描器sonar-scanner: 

1、sonar-scanner会访问指定的SonarQube Server,以下载执行代码质量扫描的时候所需要的分析器、质量配置文件等资源,以实现代码分析和结果上传。
2、在jenkins或其它需要进行代码指令扫描的服务器部署sonar-scanner:
     下载地址:https://binaries.sonarsource.com/?prefix=Distribution/sonar-scanner-cli 
     官方文档:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner
选择在jenkins上部署
将下载好的sonar-scanner-cli-4.7.0.2747.zip 上传至/apps
unzip sonar-scanner-cli-4.7.0.2747.zip 
ln -sv /apps/sonar-scanner-4.7.0.2747 /apps/sonar-scanner
vim /apps/sonar-scanner/conf/sonar-scanner.properties

 

在sonar-scanne节点测试代码质量扫描: 

配置参数:

上传python-test文件:

cat sonar-project.properties

 

 

执行扫描:

基于配置文件执行扫描:
/apps/sonar-scanner/bin/sonar-scanner
最终将结果上传到SonarQube

 

基于传递扫描参数:

/apps/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=xiaonuo1 -Dsonar.projectName=xiaonuo1 -python-app1 -Dsonar.projectVersion=1.0 -Dsonar.sources=./src -Dsonar.language=py -Dsonar.sourceEncoding=UTF-8

 

 

 

 

 

 

扩展:基于jenkins shell实现代码克隆、测试代码质量

cd /root/data/gitdata/gxn
git clone git@10.247.8.36:gxn/app2.git
cd app2
/apps/sonar-scanner/bin/sonar-scanner

 

 

 

扩展:基于jenkins pipline实现代码克隆、测试代码质量

pipeline {
  agent any
  parameters {
    string(name: 'BRANCH', defaultValue:  'develop', description: '分支选择')   //字符串参数,会配置在jenkins的参数化构建过程中
    choice(name: 'DEPLOY_ENV', choices: ['develop', 'production'], description: '部署环境选择')  //选项参数,会配置在jenkins的参数化构建过程中
  }
  stages {
    stage('变量测试1') {
      steps {
        sh "echo $env.WORKSPACE"  //JOB的工作目录,可用于后期目录切换
        sh "echo $env.JOB_URL"  //JOB的URL
        sh "echo $env.NODE_NAME"  //节点名称,master 名称显示built-in
        sh "echo $env.NODE_LABELS" //节点标签
        sh "echo $env.JENKINS_URL"  //jenkins的URL地址
        sh "echo $env.JENKINS_HOME" //jenkins的家目录路径
      }
    }
    stage("code clone"){
            //#agent { label 'master' }  //具体执行的步骤节点,非必须
            steps {
                deleteDir() //删除workDir当前目录
                script {
                    if ( env.BRANCH == 'main' ) {
                        git credentialsId: '50c62603-00d5-4d48-8a53-8319c6eafeab', url: 'git@10.247.8.36:gxn/app2.git'
                    } else if ( env.BRANCH == 'develop' ) {
                        git credentialsId: '50c62603-00d5-4d48-8a53-8319c6eafeab', url: 'git@10.247.8.36:gxn/app2.git'
                    } else {
                        echo '您传递的分支参数BRANCH ERROR,请检查分支参数是否正确'
                    }
                    GIT_COMMIT_TAG = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim() //获取clone完成的分支tagId,用于做镜像做tag
                    }
                }
            } 

    stage('python源代码质量扫描') {
        steps {
            sh "cd $env.WORKSPACE && /apps/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=magedu -Dsonar.projectName=magedu-python-app3 -Dsonar.projectVersion=2.0  -Dsonar.sources=./src -Dsonar.language=py -Dsonar.sourceEncoding=UTF-8"
            }
        }
    }
}

 

 

 

 

 

 

 

 

 
 

 

posted @ 2022-11-26 19:40  耿筱诺  阅读(273)  评论(0编辑  收藏  举报