二.基于jenkins与gitlab的CI/CD及DevOps实战 4.3 SonarQube部署、插件管理、代码自动扫描案例

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

SonarQube代码扫描流程:(见图,略)

Sonarqube部署、插件管理、实现代码扫描;

环境简介:(见图)

环境依赖:
    软件依赖:
        https://docs.sonarqube.org/8.9/requirements/requirements/
        7.9.x 版本开始不再支持MySQL
            MySQL No Longer Supported
            SonarQube no longer supports MySQL. To migrate from MySQL to a supported database, see the free MySQLMigrator tool.
        不能使用root用户启动SonarQube
            SonarQube cannot be run as root on Unix-based systems, so create a dedicated user account for SonarQube ifnecessary.
    硬件依赖:
        https://docs.sonarqube.org/8.9/requirements/hardware-recommendations/
        CPU、内存、磁盘、网卡、数据库

部署PostgreSQL 14.x:(192.168.106.196)
    PostgreSQL安装:
        # sudo apt update
        # apt-cache madison postgresql
        # apt install postgresql
    PostgreSQL环境初始化:
        # sudo pg_createcluster --start 14 mycluster #指定版本为PostgreSQL 14
        # vim /etc/postgresql/14/mycluster/pg_hba.conf
            96 # IPv4 local connections:
            97 host all all 0.0.0.0/0 scram-sha-256
        # vim /etc/postgresql/14/mycluster/postgresql.conf
            60 listen_addresses = '*' #defaults to 'localhost'; use '*' for all
    PostgreSQL端口验证:
        # lsof -i:5432
            • COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
            • postgres 4259 postgres 5u IPv4 54944 0t0 TCP *:postgresql (LISTEN)
            • postgres 4259 postgres 6u IPv6 54945 0t0 TCP *:postgresql (LISTEN)
            
    创建数据库及账户授权:
        # su - postgres #切换到postgres普通用户
        # psql -U postgres #进入到postgresql命令行敞口
            psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1))
            Type "help" for help. 
        postgres=# CREATE DATABASE sonar; #创建sonar数据库
            CREATE DATABASE
        postgres=# CREATE USER sonar WITH ENCRYPTED PASSWORD '123456'; #创建sonar用户密码为123456
            CREATE ROLE
        postgres=# GRANT ALL PRIVILEGES ON DATABASE sonar TO sonar; #授权用户访
            GRANT
        postgres=# ALTER DATABASE sonar OWNER TO sonar; #执行变更
            ALTER DATABASE
        postgres=# \q #退出
        ~$ exit    
        
部署SonarQube Server 8.9.x:(192.168.106.196)
    安装jdk 11:
        # apt install -y openjdk-11-jdk
    内核参数:
        # vim /etc/sysctl.conf
            vm.max_map_count = 262144
            fs.file-max = 65536
    部署SonarQube 8.9.x:
        # mkdir /apps && cd /apps/
        # 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://192.168.106.196/sonar
        ~$ /apps/sonarqube/bin/linux-x86-64/sonar.sh --help
        ~$ /apps/sonarqube/bin/linux-x86-64/sonar.sh start
    验证SonarQube:
        ~$ tail /apps/sonarqube/logs/*.log
        2022.11.08 10:48:22 INFO app[][o.s.a.SchedulerImpl] Process[ce] is up
        2022.11.08 10:48:22 INFO app[][o.s.a.SchedulerImpl] SonarQube is up
        ~$ lsof -i:9000
        COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
        java 6159 sonarqube 14u IPv6 81413 0t0 TCP *:9000 (LISTEN)
    访问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

 

 

 部署扫描器sonar-scanner:(安装到了jenkins192.168.106.190)
    sonar-scanner会访问指定的SonarQube Server,以下载执行代码质量扫描的时候所需要的分析器、质量配置文件等资源,以实现代码分析和结果上传。
    在jenkins或其它需要进行代码指令扫描的服务器部署sonar-scanner:
        下载地址:https://binaries.sonarsource.com/?prefix=Distribution/sonar-scanner-cli
        官方文档:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner
            # 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
                #----- Default SonarQube server
                sonar.host.url=http://192.168.106.196:9000
                #----- Default source code encoding
                sonar.sourceEncoding=UTF-8
    在sonar-scanne节点测试代码质量扫描:
        配置参数:
            root@jenkins:/opt/python-test# ll
            drwxr-xr-x 2 root root 48 Nov 8 20:21 .scannerwork/
            -rw-r--r-- 1 root root 284 Nov 8 20:20 sonar-project.properties
            drwxr-xr-x 2 root root 21 Nov 8 20:07 src/
            # cat sonar-project.properties
            # Required metadata
            sonar.projectKey=laimiya-python //#项目key,项目唯一标识、通常使用项目名称
            sonar.projectName=laimiya-python-app1 #项目名称,当前的服务名称
            sonar.projectVersion=1.0 #当前的代码版本
            # Comma-separated paths to directories with sources (required)
            sonar.sources=./src #源代码路径、sonar-scanner会扫描./src 下的代码
            # Language
            sonar.language=py #编程语言类型
            # Encoding of the source files
            sonar.sourceEncoding=UTF-8 #字符集
            
    执行扫描:
        1.基于配置文件执行扫描:
            root@jenkins:/opt/python-test# pwd
            /opt/python-test
            root@jenkins:/opt/python-test# /apps/sonar-scanner/bin/sonar-scanner

 

 

 

 


       2. 基于传递扫描参数:
            root@jenkins:/opt/app2# pwd
            /opt/app2   

    root@jenkins:/opt/app2# /apps/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=laimiya -Dsonar.projectName=laimiya-python-app2 -Dsonar.projectVersion=1.1 -Dsonar.sources=./src -Dsonar.language=py -Dsonar.sourceEncoding=UTF-8 
    验证扫描结果:

 

 

 

 

 

 

Jenkins结合sonarqube实现代码自动扫描;

    sonarqube实现python代码扫描:(基于pipeline)
    #######
    
    pipeline {
    agent { label 'jenkins-slave1' }#jenkins-slave1 需要安装sonarqube scaner
    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 branch: 'main', credentialsId: '4648de7f-3f27-4701-8b20-98fee3a3bcbf', url: 'git@192.168.106.200:laimiya/app2.git'
                        } else if ( env.BRANCH == 'develop' ) {
                            git branch: 'develop', credentialsId: '4648de7f-3f27-4701-8b20-98fee3a3bcbf', url: 'git@192.168.106.200:laimiya/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=laimiya3 -Dsonar.projectName=laimiya-python-app3 -Dsonar.projectVersion=1.0  -Dsonar.sources=./src -Dsonar.language=py -Dsonar.sourceEncoding=UTF-8"
                }
            }
        }
    }

 

 

 

         3. jenkins 安装sonarqube scanner插件 方式(很少用这种方式)

    jenkins安装Sonarqube Scanner插件、配置sonarqube server地址、基于jenkins配置代码扫描参数实现代码质量扫描
        Execute SonarQube Scanner

 

 

 

应用,保存

创建新任务

在jenkins master执行

 

 

 

 应用,保存应用,保存,执行构建

 

 

 

 

 

 

posted @   梳碧湖砍柴少年  阅读(163)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示