【Jenkins】pipeline实现自动化代码扫描

0 实验环境

服务器 IP
Jenkins服务器 192.168.1.155
Gitlab服务器 192.168.3.159
Sonarqube服务器 192.168.1.151

1 Docker安装SonarQube

  1. 在宿主机上新建目录,挂载docker数据卷
# 进入数据卷的目录
cd /home/jenkins/docker_volume
# 新建文件夹
mkdir postgresql sonarqube
cd sonarqube
mkdir data extensions  logs
复制代码
  1. docker启动postgresql数据库
# 拉取postgresql数据库镜像
docker pull postgres
# 进入数据卷
cd /home/jenkins/docker_volume
# 启动一个postgressql的实例 创建sonar数据库
docker run -itd --name postgresql -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar -p 5432:5432 -v $PWD/postgresql:/var/lib/postgresql/data  postgres
复制代码
  1. 编辑/etc/sysctl.conf,设置vm.max_map_count=262144,执行sysctl -p
  2. docker启动sonarqube镜像,使用-v参数映射数据卷,实现数据持久化
# 拉取sonarqube镜像
docker pull sonarqube
# 启动sonarqube
docker run -itd --name sonarqube -p 9000:9000 --link postgresql:db  \
-e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar -e SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/sonar   \
-v $PWD/sonarqube/data:/opt/sonarqube/data  -v $PWD/sonarqube/extensions:/opt/sonarqube/extensions -v $PWD/sonarqube/logs:/opt/sonarqube/logs   sonarqube
复制代码

2 Sonar Scanner配置

Sonar Scanner下载地址

配置/etc/profile

export SONAR_HOME=/home/software/sonar-scanner
export PATH=$PATH:$SONAR_HOME/bin
复制代码

source /etc/profile 使之生效

3 pipeline添加自动化代码扫描

3.1 配置Java语言

这里使用的SonarQube是8.9版本的,不需要额外安装Java的插件,点击配置 > 通用配置 > 语言 > 选择Java

3.2 编写pipeline

在共享库中编写sonarqube.groovy

package org.devops

// scan
def SonarScan(projectName, projectDesc, projectPath) {
  def sonarHome = "/home/software/sonar-scanner"
  def sonarServer = "http://192.168.1.151:9000/"
  def sonarDate = sh returnStdout: true, script: 'date +%Y%m%d%H%M%S'
  sonarDate = sonarDate - "\n"
  sh """
    ${sonarHome}/bin/sonar-scanner -Dsonar.host.url="${sonarServer}" \
                  -Dsonar.projectKey=${projectName} \
                  -Dsonar.login=admin \
                  -Dsonar.password=123456 \
                  -Dsonar.projectName=${projectName} \
                  -Dsonar.projectVersion=${sonarDate} \
                  -Dsonar.ws.timeout=30 \
                  -Dsonar.projectDescription=${projectDesc} \
                  -Dsonar.sources=${projectPath} \
                  -Dsonar.sourceEncoding=UTF-8 \
                  -Dsonar.java.binaries=target/classes \
                  -Dsonar.java.test.binaries=target/test-classes \
                  -Dsonar.java.surefire.report=target/surefire-reports
    """
}
复制代码

在jenkinsfile中增加一个新的阶段,命名为QA,调用共享库中定义的方法。

    stage("QA") {
      steps {
        script {
            tools.PrintMes('代码扫描', "green")
            sonar.SonarScan("${JOB_NAME}","${JOB_NAME}","src")
        }
      }
    }
复制代码

3.3 执行pipeline

流水线执行成功:
image.png

QA成功的效果:
image.png

添加一句不符合sonarlint规范的语句,测试sonarqube的代码扫描效果

// 测试一下Sonarqube质量扫描
private final String message = "test sonarqube";
复制代码

image.png
image.png

3.4 遇到的问题

Jenkins shell执行sonar-scanner提示命令存在的问题

原因:jenkins编译项目,不继承linux环境变量 ~/.bash_profile ~/.bashrc /etc/profile,导致在执行shell脚本,提示命令找不到!
解决方法:在服务器执行ln -sv /home/software/sonar-scanner/bin/sonar-scanner /usr/local/bin/sonar-scanner

几台服务器IP互相ping通的问题

这个问题还不知道原因是什么,有些IP不能实现3者互相ping通(偶尔能ping通,偶尔不能ping通),防火墙也都关了,都在同一网段,最后改了好几次IP,才互相可以ping通。

微信截图_20210525162437.png

4 优化pipeline

安装Jenkins的插件SonarQube Scanner

在SonarQube上生成Jenkins使用的令牌:我的账号 > 安全 > 令牌

image.png

在Jenkins上配置SonarQube的信息,这里配置的name之后需要在写pipeline的时候使用。

image.png

使用Jenkins插件执行QA,Jenkins项目管理页面会显示QA的结果,还会在执行的流水线项旁边加一个SonarQube的图标,链接到SonarQube中可以直接查看结果。

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享