SonarQube 是一种主流的代码质量持续检测工具,可用于代码库的静态和动态分析。SonarQube 集成到 KubeSphere 企业版流水线后,如果在运行的流水线中检测到问题,将会在仪表板上直接显示常见代码问题。

本文档演示如何将 SonarQube 集成到流水线中。在使用 Jenkinsfile 创建流水线之前,请先阅读本节内容。

前提条件

KubeSphere 企业版平台需要安装并启用 DevOps 扩展组件。

安装 SonarQube 服务器

要将 SonarQube 集成到您的流水线,必须先安装 SonarQube 服务器。

  1. 安装 Helm,以便使用该工具安装 SonarQube。例如,运行以下命令安装 Helm 3:

    1. curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3|bash

    查看 Helm 版本。

    1. helm version
    2. version.BuildInfo{Version:"v3.4.1", GitCommit:"c4e74854886b2efe3321e185578e6db9be0a6e29", GitTreeState:"clean", GoVersion:"go1.14.11"}
    说明

    有关更多信息,请参阅 Helm 文档

  2. 执行以下命令安装 SonarQube 服务器。

    1. helm upgrade --install sonarqube sonarqube --repo https://charts.kubesphere.io/main -n \
    2. kubesphere-devops-system --create-namespace --set service.type=NodePort
    说明

    请确保使用 Helm 3 安装 SonarQube 服务器。

获取 SonarQube 控制台地址

  1. 执行以下命令获取 SonarQube NodePort。

    1. export NODE_PORT=$(kubectl get --namespace kubesphere-devops-system -o jsonpath="{.spec.ports[0].nodePort}" services sonarqube-sonarqube)
    2. export NODE_IP=$(kubectl get nodes --namespace kubesphere-devops-system -o jsonpath="{.items[0].status.addresses[0].address}")
    3. echo http://$NODE_IP:$NODE_PORT
  2. 预期输出结果:(您的 NodeIP 和 NodePort 应该不同)

    1. http://10.77.1.201:31377

配置 SonarQube 服务器

步骤 1:访问 SonarQube 控制台

  1. 执行以下命令查看 SonarQube 的状态。注意,只有在 SonarQube 启动并运行后才能访问 SonarQube 控制台。

    1. kubectl get pod -n kubesphere-devops-system
  2. 在浏览器中访问 SonarQube 控制台 http://NodeIP:NodePort

  3. 点击右上角的 Log in,然后使用默认账户 admin/admin 登录。

    说明

    取决于实例的部署位置,您可能需要设置必要的端口转发规则,并在您的安全组中放行该端口,以便访问 SonarQube。

步骤 2:创建 SonarQube 管理员令牌 (Token)

  1. 点击右上角字母 A,然后从菜单中选择 My Account 以转到 Profile 页面。

  2. 点击 Security 并输入令牌名称,例如 kubesphere

  3. 点击 Generate 并复制此令牌。

    说明

    如提示所示,您无法再次查看此令牌,因此请确保复制成功。

步骤 3:创建 Webhook 服务器

  1. 执行以下命令获取 SonarQube Webhook 的地址。

    1. export NODE_PORT=$(kubectl get --namespace kubesphere-devops-system -o jsonpath="{.spec.ports[0].nodePort}" services devops-jenkins)
    2. export NODE_IP=$(kubectl get nodes --namespace kubesphere-devops-system -o jsonpath="{.items[0].status.addresses[0].address}")
    3. echo http://$NODE_IP:$NODE_PORT/sonarqube-webhook/
  2. 预期输出结果:

    1. http://10.77.1.201:30180/sonarqube-webhook/
  3. 依次点击 AdministrationConfigurationWebhooks 创建一个 Webhook。

  4. 点击 Create

  5. 在弹出的对话框中输入 NameJenkins Console URL(即 SonarQube Webhook 地址)。点击 Create 完成操作。

步骤 4:将 SonarQube 配置添加到 ks-installer

  1. 执行以下命令编辑 ks-installer

    1. kubectl edit cc -n kubesphere-system ks-installer
  2. 搜寻至 devops。添加字段 sonarqube 并在其下方指定 externalSonarUrlexternalSonarToken

    1. devops:
    2. enabled: true
    3. jenkinsJavaOpts_MaxRAM: 2g
    4. jenkinsJavaOpts_Xms: 512m
    5. jenkinsJavaOpts_Xmx: 512m
    6. jenkinsMemoryLim: 2Gi
    7. jenkinsMemoryReq: 1500Mi
    8. jenkinsVolumeSize: 8Gi
    9. sonarqube: # Add this field manually.
    10. externalSonarUrl: http://10.77.1.201:31377 # The SonarQube IP address.
    11. externalSonarToken: 00ee4c512fc987d3ec3251fdd7493193cdd3b91d # The SonarQube admin token created above.
  3. 完成操作后保存此文件。

步骤 5:将 SonarQube 服务器添加至 Jenkins

  1. 执行以下命令获取 Jenkins 的地址。

    1. export NODE_PORT=$(kubectl get --namespace kubesphere-devops-system -o jsonpath="{.spec.ports[0].nodePort}" services devops-jenkins)
    2. export NODE_IP=$(kubectl get nodes --namespace kubesphere-devops-system -o jsonpath="{.items[0].status.addresses[0].address}")
    3. echo http://$NODE_IP:$NODE_PORT
  2. 获取 Jenkins 的端口号。

    1. http://10.77.1.201:30180
  3. 使用地址 http://NodeIP:30180 访问 Jenkins。

    安装 DevOps 时,默认情况下也会安装 Jenkins 仪表板。此外,Jenkins 还配置有 KubeSphere 企业版 LDAP,这意味着您可以直接使用 KubeSphere 企业版账户登录 Jenkins。有关配置 Jenkins 的更多信息,请参阅 Jenkins 系统设置

    说明

    取决于实例的部署位置,您可能需要设置必要的端口转发规则,并在您的安全组中放行端口 30180,以便访问 Jenkins。

  4. 点击左侧导航栏中的系统管理

  5. 向下滚动并点击系统配置

  6. 搜寻到 SonarQube servers,然后点击 Add SonarQube

  7. 输入 NameServer URL (http://NodeIP:NodePort)。 点击添加,选择 Jenkins,然后在弹出的对话框中用 SonarQube 管理员令牌创建凭证(如下方第二张截图所示)。创建凭证后,从 Server authentication token 旁边的下拉列表中选择该凭证。点击应用完成操作。

    sonarqube jenkins settings

    add credentials

    说明

    如果点击添加按钮无效,前往系统管理下的 Manage Credentials 并点击 Stores scoped to Jenkins 下的 Jenkins,再点击全局凭据 (unrestricted),然后点击左侧导航栏的添加凭据,参考上方第二张截图用 SonarQube 管理员令牌添加凭证。添加凭证后,从 Server authentication token 旁边的下拉列表中选择该凭证。

步骤 6:将 sonarqubeURL 添加到 KubeSphere 企业版控制台

您需要指定 sonarqubeURL,以便可以直接从 KubeSphere 企业版 Web 控制台访问 SonarQube。

  1. 执行以下命令:

    1. kubectl editcm -n kubesphere-system ks-console-config
  2. 搜寻到 data:client:enableKubeConfig,在下方添加 devops 字段并指定 sonarqubeURL

    1. client:
    2. enableKubeConfig: true
    3. devops: # 手动添加该字段。
    4. sonarqubeURL: http://10.77.1.201:31377 # SonarQube IP 地址。
  3. 保存该文件。

步骤 7:重启服务

执行以下命令重启服务。

  1. kubectl -n kubesphere-devops-system rollout restart deploy devops-apiserver
  1. kubectl -n kubesphere-system rollout restart deploy ks-console

为新项目创建 SonarQube Token

创建一个 SonarQube 令牌,以便流水线在运行时可以与 SonarQube 通信。

  1. 在 SonarQube 控制台上,点击 Create new project

    sonarqube create project

  2. 输入项目密钥,例如 java-demo,然后点击 Set Up

    jenkins projet key

  3. 输入项目名称,例如 java-sample,然后点击 Generate

    generate a token

  4. 创建令牌后,点击 Continue

    token created

  5. 分别选择 JavaMaven,复制下图所示绿色框中的序列号。如果要在流水线中使用,则需要在凭证中添加此序列号。

    sonarqube example

在 KubeSphere 企业版控制台查看结果

使用 Jenkinsfile 创建流水线使用图形编辑面板创建流水线之后,即可查看代码质量分析的结果。