持续集成 sonar 环境搭建

雨夜狂奔 · 2019年08月14日 · 2629 次阅读

1. 虚拟机安装 Linux

我使用的是 virtual box 和 ubuntu server 18.04,注意虚拟机资源多分配一点,需要安装的东西有点多,不然资源不够用的。

略,安装好之后设置端口转发,然后使用 ssh 工具(如 securecrt)连接即可

下面的所有需要在本地浏览器访问的都需要对端口进行映射

时间可能不对,修改下时区和时间

# 更改时区
timedatectl list-timezones |grep Shanghai
timedatectl set-timezone Asia/Shanghai
# 同步时间
sudo apt-get install ntpdate
ntpdate cn.pool.ntp.org
hwclock --systohc

为了加快软件安装,最好更换数据源

vim /etc/apt/sources.list;
# 编辑之前先备份,下面的指令是清空文件
%d
# 清华数据源地址:https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ 选择相应的版本复制内容,点击“i”键进入编辑文本模式,粘贴内容到vim编辑窗体,点击“ESC”键进入编辑模式,输入“:wq”保存离开;
sudo apt-get update
sudo apt-get upgrade

2. 安装 Java

如果系统本身的 java 版本不支持,需要安装 java,下载好之后通过rz命令传到服务器

新版的 sonar 需要 java 11 以上,所以下载最新的 JDK,安装方法类似,jdk8 和 jdk11 都安装上,到时候不同的模块可能需要不同的 jdk 版本

mkdir /usr/java
cd /usr/java
tar -xzvf jdk-8u221-linux-x64.tar.gz

建议不用修改环境变量,免得影响其他的应用,如果要配置,可以百度 “linux jdk 环境变量”

3. 安装 mysql(PostgreSQL)

7.9 以及更新版本的 sonarqube 不再支持 MySQL,所以下面需要安装 PostgreSQL

下面是针对 Ubuntu 的,打开https://dev.mysql.com/downloads/repo/apt/下载文件mysql-apt-config_0.8.13-1_all.deb

以下是安装 mysql,已经过时,不需要操作,可以直接查看 PostgreSQL 的安装

# 下面的是安装Mysql步骤,已经作废,参考下面PostgreSQL的安装
sudo dpkg -i path-to-deb-file
# 弹出选择框,默认ok就行
sudo apt-get update
sudo apt install mysql-server
# 会提示一些信息,按照提示操作
mysql -uroot -p
# 连接进入数据库
CREATE USER 'root'@'%' IDENTIFIED BY 'root';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

下面是安装 PostgreSQL

sudo vim /etc/apt/sources.list.d/pgdg.list
# 添加一行
deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main
sudo apt-get install postgresql-10

切换到 postgres 用户,并创建用户和数据库

sudo su - postgres
psql
./createdb sonarqube
CREATE USER sonar WITH PASSWORD 'sonar';
# \q是退出管理界面,不同于mysql的exit
\q
# 尝试用sonar连接数据库,连接成功说明用户和数据库创建完成
./psql sonarqube -U sonar

修改访问权限

修改配置postgresql.conf

  • listen_addresses=’*’

修改配置pg_hba.conf

增加host all all 0.0.0.0/0 trust

同时将local all all peer

改为local all all password

修改之后重启数据库

systemctl restart postgresql

4. 安装 sonar

cd /usr/sonar
unzip -o sonar.xxx.zip

更改conf/sonar.properties,数据库属性要根据自己的数据库来修改

sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:postgresql://localhost:5432/sonarqube

更改wrapper.conf

wrapper.java.command=/usr/java/jdkxxx/bin/java

为 sonar 新建组和用户

sudo groupadd sonar
sudo useradd -g sonar -d /home/sonar sonar
sudo chown -R sonar:sonar /usr/sonar

新增 systemd 服务,要根据自己的版本何路径来修改

vim /etc/systemd/system/sonarqube.service
# 添加以下内容
[Unit]
Description=SonarQube service
After=syslog.target network.target

[Service]
Type=forking
User=sonar
Group=sonar
PermissionsStartOnly=true
ExecStart=/usr/sonar/sonarqube-7.9.1/bin/linux-x86-64/sonar.sh start
ExecStop=/usr/sonar/sonarqube-7.9.1/bin/linux-x86-64/sonar.sh stop
StandardOutput=syslog
LimitNOFILE=65536
LimitNPROC=8192
TimeoutStartSec=5
Restart=always

[Install]
WantedBy=multi-user.target

修改系统参数,按照 sonar 网站要求,需要有下面的参数需要修改,所以要按照下面的步骤修改

  • vm.max_map_count 大于等于 262144
  • fs.file-max 大于等于 65536
  • the user running SonarQube can open at least 65536 file descriptors
  • the user running SonarQube can open at least 4096 threads

修改/etc/sysctl.conf,添加

vm.max_map_count=262144
fs.file-max=65536

修改/etc/security/limits.conf,添加

* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
* soft memlock -1
* hard memlock -1

错误信息

areas vm.max_map_count [65530] is too low, increase to at least [262144]

https://www.cnblogs.com/yidiandhappy/p/7714489.html

切换到 root 用户,执行命令:sysctl -w vm.max_map_count=262144

查看结果:sysctl -a|grep vm.max_map_count

显示:vm.max_map_count = 262144

上述方法修改之后,如果重启虚拟机将失效,所以:

解决办法:在/etc/sysctl.conf文件最后添加一行vm.max_map_count=262144

其它错误

如果有其它错误可以查看日志,路径为path-to-sonar/logs

启动和停止 sonar

systemctl stop sonarqube
systemctl start sonarqube

汉化

打开本地链接打开 sonar 网站,登录admin/admin,然后点击Administration,点击marketplace,在plugins下方的搜索框搜索chinese,找到chinese pack然后点击install,安装好之后网页提示重启,按提示操作即可

5. sonar scanner 使用

下载https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/,根据系统版本下载

例子使用在 windows 上,下载 windows 版本,然后配置环境变量SONAR_RUNNER_HOME,值为 scanner 的路径,然后PATH添加%SONAR_RUNNER_HOME%\bin

在命令行测试下

sonar-scanner -v

配置/conf/sonar-scanner.properties

#Configure here general information about the environment, such as SonarQube server connection details for example
#No information about specific project should appear here

#----- Default SonarQube server
sonar.host.url=http://localhost:9000

#----- Default source code encoding
sonar.sourceEncoding=UTF-8

在项目根目录新建一个文件sonar-project.properties,下面的是官方的样例

sonar.projectKey=org.sonarqube:sonarqube-scanner
sonar.projectName=Example of SonarQube Scanner Usage
sonar.projectVersion=1.0

sonar.sources=src,copybooks

sonar.sourceEncoding=UTF-8

## Cobol Specific Properties

# comma-separated paths to directories with copybooks
sonar.cobol.copy.directories=copybooks
# comma-separated list of suffixes
sonar.cobol.file.suffixes=cbl,cpy
sonar.cobol.copy.suffixes=cpy

## Flex Specific Properties

# retrieve code coverage data from the Cobertura report
sonar.flex.cobertura.reportPath=coverage-report/coverage-cobertua-flex.xml

# PL/I Specific Properties
sonar.pli.marginLeft=2
sonar.pli.marginRight=0

根据实际内容配置

可以下载官方提供的样例:https://github.com/SonarSource/sonar-scanning-examples

配置好之后命令行进入项目根目录,执行sonar-scanner,等待完成,就可以在网页看到分析结果

6. 安装 gitlab

由于安装需要用代理,可以参考链接:https://www.serverlab.ca/tutorials/linux/administration-linux/how-to-configure-proxy-on-ubuntu-18-04/

查看不同系统的安装方法:https://about.gitlab.com/install/,我使用的是 ubuntu,注意修改下EXTENAL_URL为你自己的,如果是本地直接用127.0.0.1就好

sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates
sudo apt-get install -y postfix
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash
sudo EXTERNAL_URL="https://gitlab.example.com" apt-get install gitlab-ee

关于 gitlab 查错,相关日志

sudo gitlab-ctl tail
# 查看其它相关命令,可以用
sudo gitlab-ctl help
find: ‘/var/log/gitlab/redis-exporter’: Permission denied
find: ‘/var/log/gitlab/grafana’: Permission denied
find: ‘/var/log/gitlab/redis’: Permission denied
find: ‘/var/log/gitlab/alertmanager’: Permission denied
find: ‘/var/log/gitlab/unicorn’: Permission denied
find: ‘/var/log/gitlab/logrotate’: Permission denied
find: ‘/var/log/gitlab/sidekiq’: Permission denied
find: ‘/var/log/gitlab/gitlab-shell’: Permission denied
find: ‘/var/log/gitlab/postgresql’: Permission denied
find: ‘/var/log/gitlab/gitlab-monitor’: Permission denied
find: ‘/var/log/gitlab/gitaly’: Permission denied
find: ‘/var/log/gitlab/postgres-exporter’: Permission denied
find: ‘/var/log/gitlab/gitlab-workhorse’: Permission denied
find: ‘/var/log/gitlab/gitlab-rails’: Permission denied
find: ‘/var/log/gitlab/prometheus’: Permission denied
find: ‘/var/log/gitlab/node-exporter’: Permission denied
find: ‘/var/log/gitlab/nginx’: Permission denied

第一次打开会让修改 root 密码,至少 8 个字符,修改为roottest登录成功

7. 安装 jenkins

wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
# 编辑/etc/apt/sources.list,增加下面一行
deb https://pkg.jenkins.io/debian-stable binary/
# 然后执行
sudo apt-get update
sudo apt-get install jenkins

如果遇到报错找不到 JDK

打开/etc/init.d/jenkins,编辑PATH哪一行,在最后加上:path-to-jdk/bin

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/java/jdk1.8.0_221/bin

注意中间是冒号,不是分号

修改之后重新启动

sudo systemctl start jenkins

由于默认 8080 已经被占用,所以需要修改/etc/default/jenkins修改端口,比如 8081

如果还有其它启动问题可以查看日志/var/log/jenkins/jenkins.log

打开http://localhost:8081

第一次打开会提示粘贴密码,所以打开文件/var/lib/jenkins/secrets/initialAdminPassword,复制里面内容到网页,点击继续

按照提示下一步就可以了,按照提示操作完成安装,设置的帐号密码都为test/test

进去以后需要进行一些配置

  • 安装插件:maven integrationpipeline maven integrationsonarqube scanner
  • 全局工具配置:sonarqube serverssonarqube scannerjdkmavengit,某些工具可以自己配置路径,否则可以选择 “自动安装”(因为 jdk 需要 oracle 帐号,自己配置好就行,其它的可以选择自动安装)

需要配置凭据,路径见下图

切换到 jenkins 用户

sudo su - jenkins
cd ~
mkdir .ssh
cd .ssh
ssh-keygen -t rsa

然后将公钥(id_rsa.pub)添加到 gitlab 的 ssh key,方法在下面步骤找

然后将私钥复制到private key部分

8. 新建项目,并上传到 gitlab

在网页上操作新建项目

  • 项目名称:maven-multimodule

新建之后可能会提示添加ssh key,按照提示打开添加界面,将本机c:/user/你的名字/.ssh/id_rsa.pub文件的内容复制到网页并保存。

如果没有.ssh 文件夹,可以百度下搜索 “生成 ssh key”

新建任务完成就有个空项目了,按照提示操作,我们要将示例的项目传到 gitlab,所以按照下面的步骤(根据网页提示)

cd existing_folder
git init
# 下面的地址可能不一样
git remote add origin git@127.0.0.1:root/maven-multimodule.git
git add .
git commit -m "Initial commit"
# 注意上传之前要开通端口映射,使用的22端口
git push -u origin master

提交到 gitlab 可以在网页查看

9. 新建 jenkins job

  • 源码管理:git,url按照实际输入(注意使用 ssh 的方式,http 的方式使用 ssh key 不知道为啥不行),credentials选择在 jenkins 安装那里添加的凭据(如果遇到认证问题,打开 gitlab 的日志查看原因,方法见上,还有如果设置了代理,可能访问本地地址有问题,这个要注意)
  • branches to build,默认 master

构建触发器和构建环境全都不选,Build部分的Goals and options输入clean verify sonar:sonar

保存之后点击 “立即构建”,估计要等一会,因为有一些依赖要从 maven 仓库下载

10. 配置 job

maven 命令如下:

clean -Djacoco.destFile=target/jacoco.exec org.jacoco:jacoco-maven-plugin:0.8.4:prepare-agent install -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true surefire-report:report-only -Daggregate=true

然后增加构建步骤Execute SonarQube Scanner,主要是修改Path to project propertiesAnalysis properties

主要需要配置的为:

  • Path to project properties:配置sonar-project.properties的地址
  • Analysis properties:直接配置属性

两者配置二选一,区别在于一个是文件形式,一个是直接写到 jenkins 任务

属性的主要配置内容如下,主要配置了项目名称、版本、模块等信息

sonar.projectKey=test
sonar.projectName=test
sonar.projectVersion=1.0
sonar.language=java
sonar.sourceEncoding=UTF-8
sonar.modules=module1,module2,tests


module1.sonar.projectName=module1
module1.sonar.language=java
module1.sonar.projectBaseDir=module1
module1.sonar.sources=src/main
module1.sonar.tests=src/test
module1.sonar.java.binaries=target
module1.sonar.junit.reportsPath=target/surefire-reports
module1.sonar.jacoco.reportPath=target/jacoco.exec

module2.sonar.projectName=module2
module2.sonar.language=java
module2.sonar.projectBaseDir=module2
module2.sonar.sources=src/main
module2.sonar.tests=src/test
module2.sonar.java.binaries=target
module2.sonar.junit.reportsPath=target/surefire-reports
module2.sonar.jacoco.reportPath=target/jacoco.exec

tests.sonar.projectName=tests
tests.sonar.language=java
tests.sonar.projectBaseDir=tests
#tests.sonar.sources=src/main
tests.sonar.tests=src/test
tests.sonar.java.binaries=target
tests.sonar.junit.reportsPath=target/surefire-reports
tests.sonar.jacoco.reportPath=target/jacoco.exec

构建后操作增加Record JaCoCo coverage report,属性默认即可

再次构建应该可以在 sonar 平台看到单元测试以及覆盖率等信息

11. 邮件发送单元测试结果

首先在系统管理-系统设置找到Extended E-mail Notifation

  • SMTP server:按实际填写
  • Default user E-mail suffix:邮箱后缀,举例@google.com,根据实际填写
  • 高级,选中Use SMTP Authentication,输入用户名和密码
  • 点击保存

然后在 job 配置界面

  • Project Recipient List:收件人邮箱
  • Content Type:HTML(TEXT/HTML)
  • Default Subject:$JOB_NAME 单元测试结果
  • Default Content:${FILE ,path="$WORKSPACE/target/site/surefire-report.html"}

高级设置,按照下图配置

保存即可,再次构建可以收到邮件

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册