在 Gitlab CI 中调用 Sonarqube 进行代码扫描

时间:2022-06-26
本文章向大家介绍在 Gitlab CI 中调用 Sonarqube 进行代码扫描,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Gitlab 提供了基于 Code Climate 的代码质量评估功能,这一功能是通过 dind(Docker in Docker)方式运行的,在 Kubernetes 环境中、尤其是托管集群中,这种方式不太合适,还好还有一个替代方案:Sonarqube,通过在 .gitlab-ci.yml 中的设置,可以使用 Sonarqube 对代码进行扫描,接收到 Commit 之后,Sonarqube 会生成针对提交的代码质量提示,如图所示:

过程也并不复杂,简单的部署一个 Sonarqube 服务,并在 Gitlab CI 中调用即可。

配置 Gitlab

这个步骤很简单,只要打开页面 profile/personal_access_tokens,新建 Token 备用即可。

启动 Sonarqube

在 Kubernetes 环境中启用一个简单的 Sonarqube 服务器是很方便的,具体说明可以参看官方 Docker 镜像的说明,这里有几个重点:

  1. 数据:该镜像内置 H2 存储,在生产环境中使用自然是不合适的,可以通过环境变量,使用外部的 MySQL 或者 PostgreSQL 服务器。
  2. 持久化:该镜像的数据目录为 /opt/sonarqube/,下面的 datalogsconfextensions,都是需要接入 PVC 进行持久化存储的。(就算只是测试,因为安装插件需要重启,因此也需要提供持久化支持)
  3. 权限:该镜像主进程是使用 999 的组 ID 运行的,因此需要进行配置。
  4. 后续内容所用插件目前还无法支持 Sonarqube 7.7,因此此处使用的是 7.6 版本。

总结以上几点,列出代码中需要注意的内容:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: sonarqube
  labels:
    app: sonarqube
spec:
...  
  template:
    metadata:
...
    spec:
      securityContext:
        fsGroup: 999
      containers:
      - name: sonarqube
        image: "sonarqube:7.6-community"
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 9000
        volumeMounts:
        - name: sonar-ext
          mountPath: /opt/sonarqube/extensions
        - name: sonar-data
          mountPath: /opt/sonarqube/data
        - name: sonar-log
          mountPath: /opt/sonarqube/logs
        - name: sonar-conf
          mountPath: /opt/sonarqube/conf
...

配置 Sonarqube

Sonarqube 启动之后,使用缺省用户名和密码(admin/admin)登录之后,首先安装 Java 语言插件:

  • /account/security/ 修改密码。
  • 前往 /admin/marketplace 安装 SonarJava 插件。
  • 打开路径 /admin/system,重启服务。

接下来是手工安装 Gitlab 插件:

  • 使用 kubectl exec -it 进入 Sonarqube 的 Pod 中。
  • 进入 /opt/sonarqube/extensions/plugins 路径,下载插件
  • 重启 Sonarqube。

插件安装完成之后,/projects/create 创建新项目,选择 java -> maven,最终会出现如下提示:

其中包含了后续步骤所需要的 Token。

配置 Gitlab 插件

  • 打开 admin/settings?category=gitlab
  • 填写 GitLab url 以及 GitLab User Token
  • 保存。

配置项目 CI

这部分相当简单的一行 Maven 命令,例如

stages:
  - test
  - scan
...
Sonar:
  stage: scan
  tags:
    - maven
  script:
    - mvn --batch-mode verify sonar:sonar -Dsonar.host.url=https://sonar.microservice.xyz -Dsonar.login=cd387c80d1d40b24c1000b9982778ecef572795c -Dsonar.projectKey=sam -Dsonar.gitlab.project_id=$CI_PROJECT_ID -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME

这里的关键参数:

  • sonar.host.url:Sonarqube 的地址。
  • sonar.login:Sonarqube 配置新项目时生成的 Token
  • sonar.projectKey:Sonarqube 新项目生成的 ID。

完成上述修改之后,就可以提交你的 Java 代码,看看 Sonarqube 在 Commit 下使用评论方式发表的代码分析结果。

附录

  • 插件项目地址:https://github.com/gabrie-allaigre/sonar-gitlab-plugin/