本次使用的 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:

  1. sysctl vm.max_map_count
  2. sysctl fs.file-max
  3. ulimit -n
  4. ulimit -u

You can set them dynamically for the current session by running the following commands as root:

  1. sysctl -w vm.max_map_count=524288
  2. sysctl -w fs.file-max=131072
  3. ulimit -n 131072
  4. ulimit -u 8192

本次使用的是 wsl 的 docker,ubuntu 20

  1. xiaohui@220200700182:/mnt/c/Users/DELL$ sudo sysctl -w vm.max_map_count=524288
  2. vm.max_map_count = 524288
  3. xiaohui@220200700182:/mnt/c/Users/DELL$
  4. xiaohui@220200700182:/mnt/c/Users/DELL$ sudo sysctl -w fs.file-max=131072
  5. fs.file-max = 131072
  6. xiaohui@220200700182:/mnt/c/Users/DELL$ sudo ulimit -n 131072
  7. sudo: ulimit: command not found
  8. xiaohui@220200700182:/mnt/c/Users/DELL$ ulimit -u 8192

2 docker-compose yaml

xiaohui@220200700182:/mnt/c/Users/DELL$ cat sonar-compose.yaml

  1. version: "3"
  2. services:
  3. sonarqube:
  4. image: sonarqube:8.9-community
  5. depends_on:
  6. - db
  7. environment:
  8. SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
  9. SONAR_JDBC_USERNAME: sonar
  10. SONAR_JDBC_PASSWORD: sonar
  11. volumes:
  12. - sonarqube_data:/opt/sonarqube/data
  13. - sonarqube_extensions:/opt/sonarqube/extensions
  14. - sonarqube_logs:/opt/sonarqube/logs
  15. ports:
  16. - "9000:9000"
  17. db:
  18. image: postgres:12
  19. environment:
  20. POSTGRES_USER: sonar
  21. POSTGRES_PASSWORD: sonar
  22. volumes:
  23. - postgresql:/var/lib/postgresql
  24. - postgresql_data:/var/lib/postgresql/data
  25. ports:
  26. - "5432:5432"
  27. volumes:
  28. sonarqube_data:
  29. sonarqube_extensions:
  30. sonarqube_logs:
  31. postgresql:
  32. postgresql_data:

3 dockr-compose -f sonar-compose.yaml up -d (创建)启动

  1. xiaohui@220200700182:/mnt/c/Users/DELL$ docker-compose -f sonar-compose.yaml up -d
  2. Starting dell_db_1 ... done
  3. Starting dell_sonarqube_1 ... done

4 查看日志

docker-compose -f sonar-compose.yaml logs

5 访问 http://localhost:9000/

第一次访问,默认的用户 admin,密码 admin。访问后需要修改密码。
image.pngimage.png
本次就修改为 123456 吧
image.png

6 安装中文插件

参考:https://docs.sonarqube.org/8.9/setup/install-plugin/
image.png
点击上面的 接受风险,然后就有 install 按钮了
image.png
安装插件后,需要重启,本次就简单一点,重启 yaml 中所有:

  1. docker-compose -f sonar-compose.yaml restart
  1. xiaohui@220200700182:/mnt/c/Users/DELL$ docker-compose -f sonar-compose.yaml restart
  2. Restarting dell_sonarqube_1 ... done
  3. Restarting dell_db_1 ... done

重新访问,现在就是中文简体了
image.png

剩余事情就是对工具的使用了。

7 工具使用

7.1 建立项目

根据界面提示,搞一搞就行。本次使用的是 maven、java
手动触发,本地运行命令:

  1. mvn sonar:sonar -Dsonar.projectKey=demo111 -Dsonar.host.url=http://localhost:9000 -Dsonar.login=46c5425dd43e74a645b9e0aebd4431988b85dc2b

然后就可见sonarqube 的检查结果了
image.png

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选项去掉并记得保存。
image.png

8.2 设置Gitlab OAuth

Admin Area -> Applications -> New Application
image.png
选择新建,设置以下参数:
Redirect URI:回调地址。HTTP://SONAR_ADDRES + /oauth2/callback/gitlab;如果版本不同或许可能存在差异,具体可以看官方文档。
Scopes:仅启用委托认证勾选read_user,需要组同步则同时勾选api。
其他选项根据需求勾选。
image.png
提交后保存Application ID和Secret。
image.png
复制好密码 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的公共访问地址。(其实,再开始的时候也可以设置好,只是当时没有设置,现在才搞)
image.png

8.3.2 配置ALM Integrations

配置 -> 通用配置 -> ALM Integrations -> Gitlab
Enabled:启用。
GitLab URL:Gitlab地址。
Application ID:在Gitlab applications中创建的application id。
Secret:在Gitlab applications中创建的application Secret。
其他选项根据需求勾选。
确认无误后退出账号,点击登录后则会看到使用gitlab登录。

image.png
image.png

8.4 设置 Gitlab-ci

登录到 gitlab,在对应的project 中设置 ci/cd。
Project overview、Details页面中,可以看到有一个CI/CD configuretion选项,点击按钮添加.gitlab-ci.yml文件配置内容:
第一步:配置 CI/CD
image.png
第二步:进入配置页面
image.png
第三步:设置 .gitlab-ci.yml
image.png
.gitlab.yml 内容

  1. image:
  2. name: sonarsource/sonar-scanner-cli:latest
  3. entrypoint: [""]
  4. variables:
  5. SONAR_TOKEN: "46c5425dd43e74a645b9e0aebd4431988b85dc2b" # 在sonarqube中创建项目时生成的TOKEN
  6. SONAR_HOST_URL: "http://192.168.0.187:9000"
  7. GIT_DEPTH: 0
  8. sonarqube-check:
  9. stage: test
  10. script:
  11. - sonar-scanner -X -Dsonar.qualitygate.wait=true -Dsonar.projectKey=my-gitlab-pro # sonarqube中项目的标识
  12. allow_failure: true
  13. only: # 仅检测master合并请求和master分支代码提交,sonarqube-ce版本只支持分析master分支
  14. - merge_requests
  15. - 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.(JavaSquid.java:87) at org.sonar.plugins.java.JavaSquidSensor.execute(JavaSquidSensor.java:104) at org.sonar.scanner.sensor.AbstractSensorWrapper.analyse(AbstractSensorWrapper.java:48) at org.sonar.scanner.sensor.ModuleSensorsExecutor.execute(ModuleSensorsExecutor.java:85) at org.sonar.scanner.sensor.ModuleSensorsExecutor.lambda$execute$1(ModuleSensorsExecutor.java:59) at org.sonar.scanner.sensor.ModuleSensorsExecutor.withModuleStrategy(ModuleSensorsExecutor.java:77) at org.sonar.scanner.sensor.ModuleSensorsExecutor.execute(ModuleSensorsExecutor.java:59) at org.sonar.scanner.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:82) at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:137) at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:123) at org.sonar.scanner.scan.ProjectScanContainer.scan(ProjectScanContainer.java:392) at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:388) at org.sonar.scanner.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:357) at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:137) at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:123) at org.sonar.scanner.bootstrap.GlobalContainer.doAfterStart(GlobalContainer.java:150) at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:137) at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:123) at org.sonar.batch.bootstrapper.Batch.doExecute(Batch.java:72) at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:66) at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:46) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.sonarsource.scanner.api.internal.IsolatedLauncherProxy.invoke(IsolatedLauncherProxy.java:60) at com.sun.proxy.$Proxy0.execute(Unknown Source) at org.sonarsource.scanner.api.EmbeddedScanner.doExecute(EmbeddedScanner.java:189) at org.sonarsource.scanner.api.EmbeddedScanner.execute(EmbeddedScanner.java:138) at org.sonarsource.scanner.cli.Main.execute(Main.java:112) at org.sonarsource.scanner.cli.Main.execute(Main.java:75) at org.sonarsource.scanner.cli.Main.main(Main.java:61) ERROR: Job failed: exit code 1

需要修改 gitlab-ci.yml,添加 Dsonar.java.binaries=.

  1. image:
  2. name: sonarsource/sonar-scanner-cli:latest
  3. entrypoint: [""]
  4. variables:
  5. SONAR_TOKEN: "46c5425dd43e74a645b9e0aebd4431988b85dc2b" # 在sonarqube中创建项目时生成的TOKEN
  6. SONAR_HOST_URL: "http://192.168.0.187:9000"
  7. GIT_DEPTH: 0
  8. sonarqube-check:
  9. stage: test
  10. script:
  11. - sonar-scanner -X -Dsonar.qualitygate.wait=true -Dsonar.projectKey=my-gitlab-pro -Dsonar.java.binaries=. # sonarqube中项目的标识
  12. allow_failure: true
  13. only: # 仅检测master合并请求和master分支代码提交,sonarqube-ce版本只支持分析master分支
  14. - merge_requests
  15. - main

8.5 补充,sonarqube 使用 gitlab 账号

gitlab 登录个人账号
在个人偏好设置中设置 personal token
image.png
在 sonarqube 中,admin 登录,配置中设置
image.png
下面就可以使用 gitlab 账号登录了
再次访问 sonarqube,界面多处 gitlab 登录
image.png
进入登录后,新增项目也出现 gitlab 选项
image.png
填写个人 tokenimage.png
就可以看到自己的项目了
image.png
此时点击设置,根据提示直接可创建 sonarqube 的质量检查项目

设置对应项目的 pom.xml 中设置 properties

  1. <properties>
  2. <sonar.projectKey>xiaohui_my-produce_AX_AEchKOfvdUKK8Apfl</sonar.projectKey>
  3. <sonar.qualitygate.wait>true</sonar.qualitygate.wait>
  4. </properties>

sonarqube 生成的 gitlab-ci.yml (小有调整):

  1. variables:
  2. SONAR_TOKEN: "46c5425dd43e74a645b9e0aebd4431988b85dc2b" # 在sonarqube中创建项目时生成的TOKEN
  3. SONAR_HOST_URL: "http://192.168.0.187:9000"
  4. GIT_DEPTH: 0
  5. sonarqube-check:
  6. image: maven:3.6.3-jdk-11
  7. variables:
  8. SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # Defines the location of the analysis task cache
  9. GIT_DEPTH: "0" # Tells git to fetch all the branches of the project, required by the analysis task
  10. cache:
  11. key: "${CI_JOB_NAME}"
  12. paths:
  13. - .sonar/cache
  14. script:
  15. - mvn verify sonar:sonar
  16. allow_failure: true
  17. only:
  18. - dev # or the name of your main branch
  19. - master
  20. - merge-reuqests