SonarQube 8.9 与 GitLab CI完全集成

本文所要达到的效果: 在push时自动触发GitLab CI/CD pipeline job, 自动扫描所提交的代码, 并将结果上报到sonarqube

名词解释:

SonarQube® - 是一个检测bug, 漏洞及代码异味的自动化工具. 它可以整合到现有的工作流中去启用持续的代码审查在项目的多分支及PR中.

SonarScanner for Maven - 通过常规的Maven命令执行SonarQube分析的工具.

GitLab CI/CD 是一个内置在GitLab中的工具,用于通过持续方法进行软件开发:

  • Continuous Integration (CI) 持续集成
  • Continuous Delivery (CD) 持续交付
  • Continuous Deployment (CD) 持续部署

持续集成的工作原理是将小的代码块推送到Git仓库中托管的应用程序代码库中,并且每次推送时,都要运行一系列脚本来构建、测试和验证代码更改,然后再将其合并到主分支中。

持续交付和部署相当于更进一步的CI,可以在每次推送到仓库默认分支的同时将应用程序部署到生产环境。

这些方法使得可以在开发周期的早期发现bugs和errors,从而确保部署到生产环境的所有代码都符合为应用程序建立的代码标准。

GitLab CI/CD 由一个名为 .gitlab-ci.yml 的文件进行配置,改文件位于仓库的根目录下。文件中指定的脚本由GitLab Runner执行。

软件版本:

SonarQube: 8.9.2 lts-community

SonarScanner for Maven: 3.9

GitLab Runner: gitlab/gitlab-runner:alpine

Docker安装SonarQube

docker-compose.yml

version: "3"

services:
  sonarqube:
    image: sonarqube:lts-community #8.9.2社区长期支持版
    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" #暴露端口9000
  db:
    image: postgres:12
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data

volumes:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:
  postgresql:
  postgresql_data:

安装好后设置管理员密码, 在 administration - marketplace中搜索并下载中文插件, 重启

多分支插件

GitHub - mc1arke/sonarqube-community-branch-plugin: A plugin that allows branch analysis and pull request decoration in the Community version of Sonarqube

安装步骤:

  1. 将下载的jar文件拷贝到sonar安装目录下extensions/plugins/ 及 lib/common下, 并将权限设为775

  2. 在sonar安装目录下的config/sonar.properties中添加 sonar.web.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.0.jar=web 配置项

  3. 在sonar安装目录下的config/sonar.properties中添加 sonar.ce.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.0.jar=ce 配置项

  4. 重启SonarQube(在docker容器重启, 如果使用仪表板的重启服务器会导致插件不生效), 然后忽略使用第三方插件的警告

注意一定要将jar包权限设置为775, 并且要同时复制到 lib/common 下

GitLab-Runner 安装及配置

docker安装GitLab-Runner

docker pull gitlab/gitlab-runner

注册一个Runner

Registering runners | GitLab

以下是安装GitLab Runner完之后的步骤.

以下的步骤描述了启动并注册一个短期gitlab-runner容器. 注册后, 容器的配置会写入你配置挂载的volume(例如/srv/gitlab-runner/config), 并且会被runner载入.

通过Docker注册一个Runner:

  1. 根据不同的挂载类型运行相应的注册命令:

    挂在到本地文件系统:

    docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
    

    如果你在安装期间配置了其他位置的volume, 替换/srv/gitlab-runner/config成你配置的volume.

    挂载到docker volume:

    docker run --rm -it -v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner:latest register
    
  2. 输入GitLab地址.

  3. 输入从GitLab获取的token.

  4. 输入这个Runner的详情描述. 你可以到GitLab的用户界面修改该详情.

  5. 输入 runner所关联的tag, 多个tag用逗号隔开. 你可以在GitLab的用户界面修改该值.

  6. runner需要的 执行器. 对于大多数情形来说, 输入docker. 执行器选取可以参考Executors | GitLab.

  7. 如果你使用docker作为执行器, 需要提供默认的运行镜像, 假如 .gitlab-ci.yml`文件没有指定的话会在默认镜像中运行.

注册sonar-scanner-maven Runner

  1. 运行命令

    docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner:alpine register
    
  2. 填写所需要的信息, GitLab地址和token可以在 GitLab项目设置 - CI/CD - Runner中找到

  1. 注册完后, 会在GitLab 项目设置 - CI/CD - Runner中看到注册的Runner
  1. 因为我们选择了使用docker执行器来运行maven镜像, sonar-scanner-maven扫描器在扫描项目时会下载所需要的所有依赖, 并且有可能会找不到我们自己所打包的依赖, 为了防止扫描器下载时间过长及找不到我们自定义的依赖, 需要将本地依赖仓库放入服务器上, 将仓库目录挂载到runner的volume.

    ① 将本地依赖拷入到服务器/root/gitlab-runner-temp/maven-repository

② 进入gitlab-runner容器修改config.toml

找到我们刚配置的 runner

在volumes后添加"/root/gitlab-runner-temp/maven-repository:/root/.m2/repository:rw", 将宿主机的/root/gitlab-runner-temp/maven-repository挂载到 runner启动时maven容器中的默认repository位置

扫描分析项目

参考GitLab Integration | SonarQube Docs

设置禁用浅克隆

具体原因为确保扫描器可以访问GitLab执行CI/CD时的所有历史

项目设置 - CI/CD - 流水线通用设置 - Git 浅克隆

设置为0

定义一些公共变量

项目设置 - CI/CD - 变量

变量可以参考https://docs.sonarqube.org/8.9/analysis/analysis-parameters/

其中sonar_login和sonar_token参数可以在sonarqube中 点击右上角头像 - 我的账号 - 安全 - 生成令牌中获取

创建.gitlab-ci.yml文件

创建.gitlab-ci.yml文件到项目根目录, .gitlab-ci.yml配置项可参考Keyword reference for the .gitlab-ci.yml file | GitLab

.gitlab-ci.yml

stages: # 定义gitlab pipeline执行步骤
  - sonarqube-check

sonarqube-check:
  stage: sonarqube-check
  tags: # 指定gitlab runner tag
    - sonar-scanner-maven
  image: maven:3.6.3-jdk-11 # 指定运行镜像, 如果docker没有会自动pull
  variables: # 变量, 有些变量像SONAR_HOST_URL, SONAR_TOKEN, SONAR_LOGIN在gitlab CI/CD 变量中配置过, 所以可以不用重复配置
    SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"  # 声明分析任务缓存文件夹
    GIT_DEPTH: "0"  # 告诉git获取所有的分支, 分析任务强制要求
  cache:
    key: "${CI_JOB_NAME}"
    paths:
      - .sonar/cache
  script:
    # 此位置配置新的服务 配置参数参考 https://docs.sonarqube.org/8.9/analysis/analysis-parameters/
    # 一定要指定sonar.projectKey和sonar.projectName两个参数
    - mvn verify sonar:sonar -X -Dmaven.test.skip=true -Dsonar.qualitygate.wait=true  -am -Dsonar.projectKey=com.company.project:projectName -Dsonar.projectName=projectName
  allow_failure: true

BTW

可以在IDEA中安装sonarlint插件来获取sonarqube配置的规则, 并实时在编码时扫描

plugin:SonarLint - IntelliJ IDEs Plugin | Marketplace (jetbrains.com)

另外需要安装 Node.js

下载安装好后, 切换到sonarlint选项卡, 点击右边的设置

配置连接

点击 + 号

配置好后, 点击Search in list, 会将所有项目列入左边方框, 选中相应项目即可

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容