本次使用的 sonar 8.9 communicate 社区版,postgresql 12
1 requirement 要求
参考:https://docs.sonarqube.org/8.9/requirements/requirements/
you’re running on Linux, you must ensure that:
- vm.max_map_count is greater than or equal to 524288
- fs.file-max is greater than or equal to 131072
- the user running SonarQube can open at least 131072 file descriptors
- the user running SonarQube can open at least 8192 threads
You can see the values with the following commands:
sysctl vm.max_map_count
sysctl fs.file-max
ulimit -n
ulimit -u
You can set them dynamically for the current session by running the following commands as root:
sysctl -w vm.max_map_count=524288
sysctl -w fs.file-max=131072
ulimit -n 131072
ulimit -u 8192
本次使用的是 wsl 的 docker,ubuntu 20
xiaohui@220200700182:/mnt/c/Users/DELL$ sudo sysctl -w vm.max_map_count=524288
vm.max_map_count = 524288
xiaohui@220200700182:/mnt/c/Users/DELL$
xiaohui@220200700182:/mnt/c/Users/DELL$ sudo sysctl -w fs.file-max=131072
fs.file-max = 131072
xiaohui@220200700182:/mnt/c/Users/DELL$ sudo ulimit -n 131072
sudo: ulimit: command not found
xiaohui@220200700182:/mnt/c/Users/DELL$ ulimit -u 8192
2 docker-compose yaml
xiaohui@220200700182:/mnt/c/Users/DELL$ cat sonar-compose.yaml
version: "3"
services:
sonarqube:
image: sonarqube:8.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
ports:
- "9000:9000"
db:
image: postgres:12
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
volumes:
- postgresql:/var/lib/postgresql
- postgresql_data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
sonarqube_data:
sonarqube_extensions:
sonarqube_logs:
postgresql:
postgresql_data:
3 dockr-compose -f sonar-compose.yaml up -d (创建)启动
xiaohui@220200700182:/mnt/c/Users/DELL$ docker-compose -f sonar-compose.yaml up -d
Starting dell_db_1 ... done
Starting dell_sonarqube_1 ... done
4 查看日志
docker-compose -f sonar-compose.yaml logs
5 访问 http://localhost:9000/
第一次访问,默认的用户 admin,密码 admin。访问后需要修改密码。
本次就修改为 123456 吧
6 安装中文插件
参考:https://docs.sonarqube.org/8.9/setup/install-plugin/
点击上面的 接受风险,然后就有 install 按钮了
安装插件后,需要重启,本次就简单一点,重启 yaml 中所有:
docker-compose -f sonar-compose.yaml restart
xiaohui@220200700182:/mnt/c/Users/DELL$ docker-compose -f sonar-compose.yaml restart
Restarting dell_sonarqube_1 ... done
Restarting dell_db_1 ... done
重新访问,现在就是中文简体了
7 工具使用
7.1 建立项目
根据界面提示,搞一搞就行。本次使用的是 maven、java
手动触发,本地运行命令:
mvn sonar:sonar -Dsonar.projectKey=demo111 -Dsonar.host.url=http://localhost:9000 -Dsonar.login=46c5425dd43e74a645b9e0aebd4431988b85dc2b
8 与 gitlab 集成
8.1 设置 gitlab 的 cicd
登录后,如果没有需求,建议先将Continuous Integration and Deployment Auto DevOps关闭。
Admin Area -> Settings -> CI/CD -> Expand -> Default to Auto DevOps pipeline for all projects选项去掉并记得保存。
8.2 设置Gitlab OAuth
Admin Area -> Applications -> New Application
选择新建,设置以下参数:
Redirect URI:回调地址。HTTP://SONAR_ADDRES + /oauth2/callback/gitlab;如果版本不同或许可能存在差异,具体可以看官方文档。
Scopes:仅启用委托认证勾选read_user,需要组同步则同时勾选api。
其他选项根据需求勾选。
提交后保存Application ID和Secret。
复制好密码 ecaced74b79219efd93a3387f87259d0f9737e74c6e2972b6b031b74a50df8aa 后面使用。
8.3 配置sonarqube ALM Integrations
8.3.1 设置 server base url
首先在通用设置中配置好Server base URL,此地址必须和Gitlab Redirect URI(回调地址)的协议+主机域名(或IP)是一致的,或者先在这里配置好之后再去配置或修改Gitlab Redirect URI。
配置 -> 通用配置 -> 通用
Server base URL:sonarqube的公共访问地址。(其实,再开始的时候也可以设置好,只是当时没有设置,现在才搞)
8.3.2 配置ALM Integrations
配置 -> 通用配置 -> ALM Integrations -> Gitlab
Enabled:启用。
GitLab URL:Gitlab地址。
Application ID:在Gitlab applications中创建的application id。
Secret:在Gitlab applications中创建的application Secret。
其他选项根据需求勾选。
确认无误后退出账号,点击登录后则会看到使用gitlab登录。
8.4 设置 Gitlab-ci
登录到 gitlab,在对应的project 中设置 ci/cd。
Project overview、Details页面中,可以看到有一个CI/CD configuretion选项,点击按钮添加.gitlab-ci.yml文件配置内容:
第一步:配置 CI/CD
第二步:进入配置页面
第三步:设置 .gitlab-ci.yml
.gitlab.yml 内容
image:
name: sonarsource/sonar-scanner-cli:latest
entrypoint: [""]
variables:
SONAR_TOKEN: "46c5425dd43e74a645b9e0aebd4431988b85dc2b" # 在sonarqube中创建项目时生成的TOKEN
SONAR_HOST_URL: "http://192.168.0.187:9000"
GIT_DEPTH: 0
sonarqube-check:
stage: test
script:
- sonar-scanner -X -Dsonar.qualitygate.wait=true -Dsonar.projectKey=my-gitlab-pro # sonarqube中项目的标识
allow_failure: true
only: # 仅检测master合并请求和master分支代码提交,sonarqube-ce版本只支持分析master分支
- merge_requests
- main
结果报错:
10:05:09.402 ERROR: Error during SonarScanner execution
org.sonar.java.AnalysisException: Your project contains .java files, please provide compiled classes with sonar.java.binaries property, or exclude them from the analysis with sonar.exclusions property.
at org.sonar.java.classpath.ClasspathForMain.init(ClasspathForMain.java:75)
at org.sonar.java.classpath.AbstractClasspath.getElements(AbstractClasspath.java:317)
at org.sonar.java.SonarComponents.getJavaClasspath(SonarComponents.java:164)
at org.sonar.java.JavaSquid.
需要修改 gitlab-ci.yml,添加 Dsonar.java.binaries=.
image:
name: sonarsource/sonar-scanner-cli:latest
entrypoint: [""]
variables:
SONAR_TOKEN: "46c5425dd43e74a645b9e0aebd4431988b85dc2b" # 在sonarqube中创建项目时生成的TOKEN
SONAR_HOST_URL: "http://192.168.0.187:9000"
GIT_DEPTH: 0
sonarqube-check:
stage: test
script:
- sonar-scanner -X -Dsonar.qualitygate.wait=true -Dsonar.projectKey=my-gitlab-pro -Dsonar.java.binaries=. # sonarqube中项目的标识
allow_failure: true
only: # 仅检测master合并请求和master分支代码提交,sonarqube-ce版本只支持分析master分支
- merge_requests
- main
8.5 补充,sonarqube 使用 gitlab 账号
gitlab 登录个人账号
在个人偏好设置中设置 personal token
在 sonarqube 中,admin 登录,配置中设置
下面就可以使用 gitlab 账号登录了
再次访问 sonarqube,界面多处 gitlab 登录
进入登录后,新增项目也出现 gitlab 选项
填写个人 token
就可以看到自己的项目了
此时点击设置,根据提示直接可创建 sonarqube 的质量检查项目
设置对应项目的 pom.xml 中设置 properties
<properties>
<sonar.projectKey>xiaohui_my-produce_AX_AEchKOfvdUKK8Apfl</sonar.projectKey>
<sonar.qualitygate.wait>true</sonar.qualitygate.wait>
</properties>
sonarqube 生成的 gitlab-ci.yml (小有调整):
variables:
SONAR_TOKEN: "46c5425dd43e74a645b9e0aebd4431988b85dc2b" # 在sonarqube中创建项目时生成的TOKEN
SONAR_HOST_URL: "http://192.168.0.187:9000"
GIT_DEPTH: 0
sonarqube-check:
image: maven:3.6.3-jdk-11
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:
- mvn verify sonar:sonar
allow_failure: true
only:
- dev # or the name of your main branch
- master
- merge-reuqests