SonarQube与GitLab集成(一)
Kiml Lv5
1
2
3
24-12-11 初始记录
24-12-12 完成SonarQube与插件的安装
24-12-16 maven 与 多模块项目

准备工作

  1. SonarQube:选择适合项目的 SonarQube 版本。~Java8 适配的 SonarQube 版本最高为 7.8~。这里部署的是: docker 方式的 9.9 LTS 版本官方长期支持版本

  2. GitLab:14.9.1 版本

1
2
# 可以通过以下命令查看
cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
  1. docker:Docker version 20.10.17, build 100c701。官方推荐版本 20.10 以上。

  2. Gitlab CI

  3. SonarScanner/Maven + Java 11

SonarQube 安装

  1. docker-compose.yml

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:9.9-community
depends_on:
- db
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
volumes:
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_logs:/opt/sonarqube/logs
- sonarqube_conf:/opt/sonarqube/conf
ports:
- "9000:9000"
db:
image: postgres:15.3
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
volumes:
- postgresql:/var/lib/postgresql
- postgresql_data:/var/lib/postgresql/data

volumes:
sonarqube_data:
external: true
sonarqube_extensions:
external: true
sonarqube_logs:
external: true
sonarqube_conf:
external: true
postgresql:
postgresql_data:
  1. docker-compose 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 前台启动, 启动项目中的所有服务。
docker-compose up
# 后台启动, 启动所有服务并在后台运行。
docker-compose up -d
# -f 指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定
docker-compose -f docker-compose.yml up -d

# 列出项目中目前的所有容器
docker-compose ps

# 停止所有服务。
docker-compose stop

# 停止和删除容器、网络、卷、镜像。
docker-compose down
# 删除已经在compose文件中定义的和匿名的附在容器上的数据卷
docker-compose down -v

SonarQube 插件安装

SonarQube 有两个插件:

  1. 下载 sonar-gitlab-plugin 对应 5.4 版本的 jar 包

  2. 下载 sonarqube-community-branch-plugin 对应 1.14.0 的 jar 包

  3. 上传 jar 包到挂载的 sonarqube_extensions 目录里面的 plugins 目录里面。上传到 JumpServer 可以在目录下输入:rz;下载为 sz

  4. 修改挂载的 sonarqube_conf 目录路径下面的 sonar.properties 配置文件,添加如下配置

1
2
sonar.web.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.14.0.jar=web
sonar.ce.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.14.0.jar=ce
  1. 重启 SonarQube

Gitlab CI 安装与注册

  1. 版本确认
    image
    image

  2. 安装与 Gitlab 一致的 Gitlab-Runner 版本。

1
2
3
4
5
6
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-runner/yum/el7/gitlab-runner-14.9.0-1.x86_64.rpm --no-check-certificate

sudo rpm -ivh gitlab-runner-14.9.0-1.x86_64.rpm

# 查看是否安装成功
gitlab-runner -v
  1. 指定 gitlab-runner 用户为 root 用户

1
2
3
sudo gitlab-runner uninstall 

sudo gitlab-runner install --working-directory /home/zwadmin --user zwadmin
  1. 启动 gitlab 服务

1
2
3
4
5
6
7
systemctl daemon-reload

/bin/systemctl start gitlab-runner

/bin/systemctl enable gitlab-runner

/bin/systemctl restart gitlab-runner
  1. 设置权限

1
chown -R zwadmin.zwadmin /home/gitlab-runner
  1. 注册服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
gitlab-runner register
#输入公司的gitlab公网地址
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/): https://gitlab.wuidm.com/
#输入gitlab的token
Please enter the gitlab-ci token for this runner:

#输入描述这个runner名称
Please enter the gitlab-ci description for this runner: [k8s-node02]:
test
#输入runner的标签
Please enter the gitlab-ci tags for this runner (comma separated):
my-tag,another-tag
Registering runner... succeeded runner=8sjydnrs
#输入runner执行器的环境
Please enter the executor: custom, docker-ssh, parallels, kubernetes, docker-ssh+machine, docker, shell, ssh, virtualbox, docker+machine:
shell

image

SonarScanner 安装

多模块项目建议用 Maven,这部分可以不看

  1. 官网下载

  2. 上传服务器后,解压

  3. 配置环境变量

1
2
3
4
5
6
7
8
9
10
sudo vim /etc/profile

# 添加以下语句
export SONARRUNNER_HOME=/home/zwadmin/soft/sonar-scanner/sonar-scanner-6.2.1.4610-linux-x64
export PATH=$SONARRUNNER_HOME/bin:$PATH

sudo source /etc/profile

# 查看是否安装成功
sonar-scanner -v

Maven 安装

Maven 更适配多模块项目

  1. 官网下载

  2. 上传服务器后,解压

  3. 配置环境变量

1
2
3
4
5
6
7
8
9
10
sudo vim /etc/profile

# 添加以下语句
export M2_HOME=/opt/maven
export PATH=$M2_HOME/bin:$PATH

source /etc/profile

# 查看是否安装成功
mvn -v

与 Gitlab 集成

  1. 登录 gitlab.com,创建一个测试仓库,并在用户设置里面,创建一个个人访问令牌。
    image

  2. 登录 SonarQube,在 project 管理里面即可通过这个个人访问令牌来导入 gitlab 上面的项目
    image

  3. 导入后,选择以 gitlab ci 的方式来执行 ci 流程前提 gitlab ci 开启
    image

  4. 根据提示,完成所有步骤。

  • 在项目中创建 sonar-project.properties, 并粘贴提示内的内容。多分支指定分支需要下载 sonarqube-community-branch-plugin 插件。额外添加 sonar.branch.name=XXX
    image

  • 在 gitlab 的设置, CI/CD 设置里面,添加环境变量

  • 在项目里面创建一个 .gitlab-ci.yml 文件,并按照提示贴入最小化配置内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sonarqube-check:  
tags:
- test
variables:
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # Defines the location of the analysis task cache
GIT_DEPTH: "0" # Tells git to fetch all the branches of the project, required by the analysis task
cache:
key: "${CI_JOB_NAME}"
paths:
- .sonar/cache
script:
- sonar-scanner
allow_failure: true
only:
- master
# - merge_requests
# - develop
  1. 在 SonarQube 的通用配置里面,配置好 base URL, 以方便在 gitlab 的评论里面能够正确连接到 SonarQube 平台。
    image

使用 Maven 与 Gitlab 集成

Maven 更适配多模块项目,1、2、3、5 步骤相同,4 配置如下

  • 在父项目 pom.xml 文件中添加配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<properties>
<sonar.qualitygate.wait>true</sonar.qualitygate.wait>
</properties>

<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.11.0.3922</version>
</plugin>
</plugins>
</pluginManagement>
</build>
  • 在 gitlab 的设置, CI/CD 设置里面,添加环境变量

  • 在项目里面创建一个 .gitlab-ci.yml 文件,并按照提示贴入最小化配置内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sonarqube-check:
tags:
- sonar
variables:
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # Defines the location of the analysis task cache
GIT_DEPTH: "0" # Tells git to fetch all the branches of the project, required by the analysis task
cache:
key: "${CI_JOB_NAME}"
paths:
- .sonar/cache
script:
- JAVA_HOME=/home/zwadmin/data/jdk-11/ && export JAVA_HOME
- mvn verify sonar:sonar -Dsonar.projectKey=com.ydm:zw-ydm -Dsonar.branch.name=feature/sonar-1216
allow_failure: true
only:
- feature/sonar-1216
# - merge_requests

整合 IDEA 插件

用于同步服务器上的规则、质量配置文件和文件排除设置。

  1. 创建 token 类型为用户
    image

  2. IDEA Plugins Marketplace 下载 SonarQube for IDE。

  3. 连接到 SonarQube。
    image
    image

  4. 配置项目
    image

完整版 .gitlab-ci.yml

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
stages:  
- sonarqube
- notify
- noop
sonarqube-check:
stage: sonarqube
tags:
- sonar
variables:
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # Defines the location of the analysis task cache
GIT_DEPTH: "0" # Tells git to fetch all the branches of the project, required by the analysis task
cache:
key: "${CI_COMMIT_REF_NAME}" # 使用分支名作为缓存的 key paths:
- .sonar/cache
script:
- JAVA_HOME=*** && export JAVA_HOME
- export SONAR_JAVA_OPTS="-Xmx2G -Xms1G"
- mvn verify sonar:sonar -T 10 -Dsonar.projectKey= -Dsonar.branch.name=master -Dmaven.test.skip=true -Dsonar.qualitygate.wait=false -Dsonar.ce.parallel=1 -Dmaven.repo.local=***
allow_failure: false
rules:
# 如果 SKIP_SONAR 为 "true",跳过任务
- if: '$SKIP_SONAR == "true"'
when: never
# 在合并请求时触发
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

sonar_to_feishu:
stage: notify
tags:
- sonar
script:
- |
response=$(curl -u admin:123456Aa -s "***/api/qualitygates/project_status?projectKey=com.ydm%3Azw-ydm&branch=master")

echo "$response"

quality_gate_status=$(echo "$response" | grep -o '"status":"[^"]*"' | head -n 1 | sed 's/"status":"\([^"]*\)"/\1/')

echo "$quality_gate_status"

if [ "$quality_gate_status" == "OK" ]; then
status="通过 (OK)"
else
status="未通过 (ERROR)"
fi

echo "请求飞书"

curl -X POST -H "Content-Type: application/json" \
-d "{
\"msg_type\": \"post\",
\"content\": {
\"post\": {
\"zh_cn\": {
\"title\": \"SonarQube 分析完成\",
\"content\": [
[{
\"tag\": \"text\",
\"text\": \"项目:zw-ydm\n分支:master\n状态:$status\n仪表盘:\"
}, {
\"tag\": \"a\",
\"text\": \"点击查看\",
\"href\": \"***/dashboard?id=com.ydm%3Azw-ydm&branch=master\"
}]
]
}
}
}
}" \
https://open.feishu.cn/open-apis/bot/v2/hook/***
needs:
- sonarqube-check
rules:
# 如果 SKIP_SONAR 为 "true",跳过任务
- if: '$SKIP_SONAR == "true"'
when: never
# 在合并请求时触发
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

noop:
tags:
- sonar
stage: noop
script:
- echo "Pipeline skipped all main jobs."
rules:
# 在合并请求时触发
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

BUG 记录

docker 拉取失败 (Client.Timeout exceeded while awaiting headers)

内链:[[Docker拉取失败 (Client.Timeout exceeded while awaiting headers)]]

外链:Docker拉取失败 (Client.Timeout exceeded while awaiting headers)

docker-compose 加载挂载卷,只加载默认

未完全解决。有一个较麻烦的方法。

  1. 手动挂载卷

1
2
3
4
sudo docker volume create --driver local --opt type=none --opt device=/home/zwadmin/data/docker/sonarqube/data --opt o=bind sonarqube_data
sudo docker volume create --driver local --opt type=none --opt device=/home/zwadmin/data/docker/sonarqube/extensions --opt o=bind sonarqube_extensions
sudo docker volume create --driver local --opt type=none --opt device=/home/zwadmin/data/docker/sonarqube/logs --opt o=bind sonarqube_logs
sudo docker volume create --driver local --opt type=none --opt device=/home/zwadmin/data/docker/sonarqube/conf --opt o=bind sonarqube_conf
  1. docker-compose.yml 中从外部加载卷

1
2
3
volumes:
sonarqube_data:
external: true
 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
访客数 访问量