持续集成部署

本文介绍如何基于docker,将代码静态分析工具sonarqube集成至Jenkins

一、系统架构

Jenkins为持续集成系统架构的核心,sonarqube在代码编译之后进行静态扫描,sonarqube使用PostgreSQL作为静态扫描的数据持久化方案。目前架构如下图所示: todo

二、部署步骤

2.1 镜像安装

  1. 使用以下命令拖取Jenkins、PostgreSQL、SonarQubedocker镜像:

     docker pull jenkins/jenkins:lts
     docker pull sonarqube:lts
     docker pull postgres:10
  2. 编写docker-compose.yaml

     version: "3"
    
     services:
         jenkins:
             image: jenkins/jenkins:lts
             ports:
                 - "8080:8080"
                 - "50000:50000"
             networks:
                 ci_net:
                     ipv4_address: 172.20.0.2
             volumes:
                 - ${WQ_CI_HOME}/jenkins_home:/var/jenkins_home:rw
    
         sonarqube:
             image: sonarqube:lts
             ports:
                 - "9000:9000"
             networks:
                 ci_net:
                     ipv4_address: 172.20.0.3
             environment:
             - SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/sonar
             volumes:
                 - ${WQ_CI_HOME}/sonarqube_home/conf:/opt/sonarqube/conf:rw
                 - ${WQ_CI_HOME}/sonarqube_home/logs:/opt/sonarqube/logs:rw
                 - ${WQ_CI_HOME}/sonarqube_home/data:/opt/sonarqube/data:rw
                 - ${WQ_CI_HOME}/sonarqube_home/extensions:/opt/sonarqube/extensions:rw
    
         db:
             image: postgres:10
             networks:
                 ci_net:
                     ipv4_address: 172.20.0.4
             ports:
                 - "8001:5432"
             environment:
             - POSTGRES_USER=sonar
             - POSTGRES_PASSWORD=sonar
             volumes:
             - ${WQ_CI_HOME}/db_data:/var/lib/postgresql/data:rw
    
     networks:
         ci_net:
             driver: bridge
             ipam:
                 driver: default
                 config:
                     - subnet: 172.20.0.0/16
  3. docker-compose.yaml中用到的bind目录创建出来;

  4. docker-compose.yaml同级目录下使用docker-compose up启动服务;

  5. 等待服务器启动完成,即可进入JenkinsSonarQube进行配置。

2.2 配置

  1. 初始密码键入

    Jenkins在初次启动会要求输入初始密码,该密码位于$JENKINS_HOME/secrets/initialAdminPassword,使用下列命令查看:

     cat $JENKINS_HOME/secrets/initialAdminPassword

    输入该密码并进入Jenkins

  2. 选择初始安装插件

    这一步会选择初始安装的插件,如果当前环境不能翻墙,建议反选所有插件,并进入用户名密码设置阶段,设置完成后就可以进入Jenkins

  3. 安装插件

    Jenkins提供了在线安装的方式,如果不能翻墙,也可以选择使用下载好的离线插件。点击Manage Jenkins->Manage Plugin->Advanced,点击Browse上传已经下载好的*.hpi插件。

  4. 配置证书

    • 打开sonarqube的web管理页,登陆账号,初始账号和密码均为admin。点击Administration->Security->User,在admin里面点击tokens下面的button,添加界面如下图所示:

      Generate Tokens随意输入一个key,点击generate,复制弹出框中的token。

    • 打开Jenkins的web管理页,点击Credentials->System,在右边点击Global credentials (unrestricted),然后点击左边的Add Credentials,在Kind中选为Secret Text,然后将刚刚复制的token粘贴到Secret框中,在ID中为该证书取名,Description可以为空。

  5. 其中Name表示该服务器的名字,可以随意更改;Server URL为固定值,如果想修改,需要修改docker-compose.yaml中的ipamServer authentication tokenJenkinssonarqube服务器通信的证书,选择上一步添加的证书即可。

  6. 配置sonarqube scanner

    sonarqube scanner是用于代码静态分析的工具,点击Manage Jenkins->Global Tool Configuration,找到SonarQube Scanner Installations,进入配置。如果不能翻墙,请反选Install Automatically,并将安装包解压的路径填入SONAR_RUNNER_HOME

2.3 添加项目测试

  1. Jenkins点击New Items,然后选择Freestyle Project,输入项目名称点击OK;

  2. 找到Source Code Management,选择Git,填入项目地址。如果是从公司的gerrit上clone代码,那么需要配置证书,配置方法跟上面所述类似。

  3. 找到Build,选择Add build step->Execute SonarQube Scanner。根据所测项目的类型,在Analysis properties,填入相关配置。以golang为例,通用填法如下:

     sonar.projectKey=$(projectKey)
     sonar.sources=.
     sonar.exclusions=**/*_test.go,**/vendor/**
    
     sonar.tests=.
     sonar.test.inclusions=**/*_test.go
     sonar.test.exclusions=**/vendor/**

    其中,$(projectKey)可以随意填,例如项目的名字,但是对于maven项目,它的格式为<groupId>:<artifactId>。具体请参考官方文档。 其余语言参考sonarqube分析参数

2.4 查看测试结果

三、troubleshooting

  1. 执行docker-compose可能会有文件夹权限错误:

     sonarqube_1  | 2020-04-26 10:13:50,791 main ERROR RollingFileManager (/opt/sonarqube/logs/es.log) java.io.FileNotFoundException: /opt/sonarqube/logs/es.log (Permission denied) java.io.FileNotFoundException: /opt/sonarqube/logs/es.log (Permission denied)

    solution:

     //获取sonarqube的bind目录应为什么权限
     docker run --rm sonarqube:lts id sonarqube
     //根据结果设定目录权限
     sudo chown -R 999:999 sonarqube_home/
  2. error 1 bootstrap checks failed sonarqube

    执行以下命令即可:

     sudo sysctl -w vm.max_map_count=262144

Last updated

Was this helpful?