本文最后编辑于   前,其中的内容可能需要更新。
                
                
                    
                
                 
                创建sonarqube服务 可以使用官方的sonarqube:lts-community长期支持版, 也可以自己写Dockerfile,此处我们用自己的dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 FROM  eclipse-temurin:17 -alpineENV  SONAR_VERSION=9.9 .1.69595 \    SONARQUBE_HOME=/opt/sonarqube \               SONARQUBE_JDBC_USERNAME=sonar \     SONARQUBE_JDBC_PASSWORD=sonar \     SONARQUBE_JDBC_URL= EXPOSE  9000 RUN  addgroup -S sonarqube && adduser -S -G sonarqube sonarqube RUN   sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g'  /etc/apk/repositories RUN  set  -x \     && apk add --no-cache  unzip \     && apk add --no-cache su-exec  wget \     && apk add --no-cache bash  RUN  mkdir -p /opt \     && cd  /opt \     && wget -O sonarqube.zip --no-verbose "https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-${SONAR_VERSION} .zip \       && unzip sonarqube.zip \     && mv sonarqube-$SONAR_VERSION sonarqube \     && chown -R sonarqube:sonarqube sonarqube \     && rm sonarqube.zip* \     && rm -rf $SONARQUBE_HOME/bin/* VOLUME  " $SONARQUBE_HOME /data" WORKDIR  $SONARQUBE_HOME  COPY  run.sh $SONARQUBE_HOME /bin/ RUN   chmod +x $SONARQUBE_HOME /bin/run.sh ENTRYPOINT  [" ./bin/run.sh"] 
 
对应的run.sh(在github官方镜像可获取)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # !/bin/sh #  https://raw.githubusercontent.com/SonarSource/docker-sonarqube/4d76dfe9fb4c5d41ba1852cd5072dbff15ca5a20/7.1-alpine/run.sh set -e if [ "${1:0:1}" != '-' ]; then   exec "$@" fi chown -R sonarqube:sonarqube $SONARQUBE_HOME exec su-exec sonarqube \   java -jar lib/sonar-application-$SONAR_VERSION.jar \   -Dsonar.log.console=true \   -Dsonar.jdbc.username="$SONARQUBE_JDBC_USERNAME" \   -Dsonar.jdbc.password="$SONARQUBE_JDBC_PASSWORD" \   -Dsonar.jdbc.url="$SONARQUBE_JDBC_URL" \   -Dsonar.web.javaAdditionalOpts="$SONARQUBE_WEB_JVM_OPTS -Djava.security.egd=file:/dev/./urandom" \   "$@" 
 
build镜像完成后, 通过可以通过docker或者kubernetes 启动该容器, 此处采用docker-compose的方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 version:  '3' services:   sonarqube:           image:  sonarqube:lts-community       ports:        -  9000 :9000        -  9001 :9001        -  9002 :9092      environment:             SONARQUBE_JDBC_USERNAME:  sonar        SONARQUBE_JDBC_PASSWORD:  sonar        SONARQUBE_JDBC_URL:  'jdbc:postgresql://db:5432/sonar'        JAVA_OPTS:  '-Duser.timezone=Asia/Shanghai'      depends_on:        -  db      volumes:        -  ./data/conf:/opt/sonarqube/conf        -  ./data/data:/opt/sonarqube/data        -  ./data/extensions:/opt/sonarqube/extensions        -  ./data/bundled-plugins:/opt/sonarqube/lib/bundled-plugins      networks:        -  sonar-net    db:      image:  postgres:10.4-alpine      ports:        -  5432 :5432      environment:        -  POSTGRES_USER=sonar        -  POSTGRES_PASSWORD=sonar      volumes:        -  ./data/postgresql:/var/lib/postgresql        -  ./data/postgresql_data:/var/lib/postgresql/data      networks:        -  sonar-net  networks:   sonar-net:  
 
sonarqube的服务端口为9000, 我们通过docker-compose启动后可以通过9000端口访问。 
 sonarqube的默认管理员用户名密码为admin/admin
(可选)汉化配置 点击进入配置 –> 应用市场, 在插件上方的提示点击确认风险后,在搜索框中搜索chinese,可安装汉化插件, 安装完成后点击重启sonar即可汉化完成。
 
(可选)LDAP配置 在较高版本的sonarqube中, 已经不需要通过LDAP插件来实现LDAP功能,
我们在docker-compose.yml所在文件夹下的data/conf下,新建sonar.properties</font>文件(已有文件在原有基础上添加配置)
1 2 3 4 5 6 7 8 9 10 11 12 sonar.security.realm =LDAP ldap.url =ldap://YOUR_LDAP_ADDRESS:389  ldap.user.baseDn =LDAP_BASE_DN ldap.user.request =(&(objectClass=inetOrgPerson)(uid={login})) ldap.user.realNameAttribute =cn ldap.user.emailAttribute =mail ldap.group.baseDn =LDAP_BASE_DN ldap.group.request =(&(objectClass=posixGroup)(memberUid={uid})) 
 
sonar-scanner的使用 特殊说明 我们当前的java版本是8, 而sonar上传插件支持的版本需要更高的java版本(目前为11 or 17),也可在通过maven运行扫描命令时指定对应的java版本, 考虑到目前插件通常在ide中运行,建议下载sonar-scanner
使用官方的sonar-scanner-cli容器 官方提供了sonarsource/sonar-scanner-cli的容器镜像, 使用起来也很方便:
1 2 3 4 5 6 docker run --rm \ -e SONAR_HOST_URL="${SONARQUBE_URL}" \ -e SONAR_SCANNER_OPTS="-Dsonar.projectKey=${PROJECTNAME} -Dsonar.scm.provider=git -Dsonar.java.binaries=target -Dsonar.verbose=true"   \ -e SONAR_TOKEN="${TOKEN}"  \ -v ${GITDIR}:/usr/src  \ sonarsource/sonar-scanner-cli 
 
按照官方给的示例,填入对应参数即可
特别说明:
如果代码未经过maven编译,在不加-Dsonar.java.binaries=target这一项配置时会报错,提取部分内容:
1 Your project contains .java files, please provide compiled classes with sonar.java.binaries property, or exclude them from the analysis with sonar.exclusions property. 
 
如果不需要动态检查代码, 只需要静态扫描的话, 只需要新建一个空文件夹target(名字随意),并添加-Dsonar.java.binaries=target让扫描器扫描空文件夹即可。
使用jenkins来自动化代码扫描 直接上流水线代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 def  ApplicationMetadataAPI( GitUrl ) {    GitUrlName = GitUrl          ApplicationMetadataURL = "http://xxxx/xxx"      response = httpRequest contentType:  'APPLICATION_JSON' ,         httpMode:  "GET" ,         requestBody:  "" ,         url:  "${ApplicationMetadataURL}?gitRepo=${GitUrlName}"      responseJson = readJSON text:  response.content     return  responseJson } def  SlaveLabel() {         SlaveLabelPerfix = "jenkins-agent"           GitSourceRepoURL = "${gitlabSourceRepoURL}"           ApplicationMetadataAPI = ApplicationMetadataAPI(GitSourceRepoURL)     script {         BuildSpec = "hfc6-xlarge"          AppName = "${ApplicationMetadataAPI.data.name}"      }     SlaveLabelString = "k8s-jenkins-agent-sonar-scanner-ecs-hfc6-xlarge-4c8g"           echo "SlaveLabelString: ${SlaveLabelString}"      return  SlaveLabelString } pipeline {     agent {                  kubernetes {                          inheritFrom SlaveLabel()                          defaultContainer 'scanner'          }     }          options {                           buildDiscarder(logRotator(numToKeepStr:  '5000' ))                                    timeout(time:  30 , unit:  'MINUTES' )                  retry(1 )                  timestamps()     }               stages {  stage('Pull Repo for Application' ) {                     steps {                         git branch:  "${gitlabTargetBranch}" , credentialsId:  "004" , url:  "${GitSourceRepoURL}"                      }                 }         stage('Scan Backend Project Code' ) {             steps {                 script {                     sh """#!/bin/bash                      mkdir -p target                     export SONAR_HOST_URL="http://SONAR_URL"                     export SONAR_SCANNER_OPTS="-Dsonar.projectKey=${AppName} -Dsonar.scm.provider=git -Dsonar.language=java -Dsonar.java.binaries=target -Dsonar.verbose=true"                     export SONAR_TOKEN="xxxxxxxx"                     /usr/bin/entrypoint.sh                     """                 }             }         }     } } 
 
获取sonar的token 为了让所有项目都能用同一个token,我们在sonarqube上生成一个永久的全局token, 用于上传扫描代码. 点击头像选中”我的账号”,点击”安全”
输入对应令牌名称, 类型选择全局,过期时间选择永久, 生成token后妥善保存。
 
随后我们只需要在gitlab中配置jenkins的webhook即可自动进行代码扫描
参考文档 https://docs.sonarsource.com/sonarqube/9.9/