将 SonarQube 集成到流水线

SonarQube 是一种主流的代码质量持续检测工具。您可以将其用于代码库的静态和动态分析。SonarQube 集成到 KubeSphere 流水线后,如果在运行的流水线中检测到问题,您可以直接在仪表板上查看常见代码问题,例如 Bug 和漏洞。

本教程演示如何将 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 kubesphere-devops-system --create-namespace --set service.type=NodePort

    备注

    请您确保使用 Helm 3 安装 SonarQube Server。

  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. 您可以获得如下输出(本示例中端口号为 31377,可能与您的端口号不同):

    1. http://10.77.1.201:31377

配置 SonarQube 服务器

步骤 1:访问 SonarQube 控制台

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

    1. $ kubectl get pod -n kubesphere-devops-system
    2. NAME READY STATUS RESTARTS AGE
    3. ks-jenkins-68b8949bb-7zwg4 1/1 Running 0 84m
    4. s2ioperator-0 1/1 Running 1 84m
    5. sonarqube-postgresql-0 1/1 Running 0 5m31s
    6. sonarqube-sonarqube-bb595d88b-97594 1/1 Running 2 5m31s
    7. uc-jenkins-update-center-8c898f44f-m8dz2 1/1 Running 0 85m
  2. 在浏览器中访问 SonarQube 控制台 http://{$Node IP}:{$NodePort},您可以看到其主页,如下所示:

    访问 SonarQube 控制台

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

    登录页面

    备注

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

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

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

    SonarQube 配置-1

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

    SonarQube 配置-2

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

    SonarQube 配置-3

    警告

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

步骤 3:创建 Webhook 服务器

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

    1. export NODE_PORT=$(kubectl get --namespace kubesphere-devops-system -o jsonpath="{.spec.ports[0].nodePort}" services ks-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。

    SonarQube Webhook-1

  4. 点击 Create

    SonarQube Webhook-2

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

    Webhook 页面信息

步骤 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 ks-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://Public IP:30180 访问 Jenkins。安装 KubeSphere 时,默认情况下也会安装 Jenkins 仪表板。此外,Jenkins 还配置有 KubeSphere LDAP,这意味着您可以直接使用 KubeSphere 帐户(例如 admin/P@88w0rd)登录 Jenkins。有关配置 Jenkins 的更多信息,请参见 Jenkins 系统设置

    Jenkins 登录页面

    备注

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

  4. 点击左侧的 Manage Jenkins

    管理 Jenkins

  5. 向下翻页找到并点击 Configure System

    configure-system

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

    添加 SonarQube

  7. 输入 NameServer URL (http://Node IP:port) 和 Server authentication token(SonarQube 管理管理员令牌)。点击 Apply 完成操作。

    sonarqube-jenkins-settings

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

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

  1. 执行以下命令:

    1. kubectl edit cm -n kubesphere-system ks-console-config
  2. 搜寻到 client,添加 devops 字段并指定 sonarqubeURL

    1. client:
    2. version:
    3. kubesphere: v3.0.0
    4. kubernetes: v1.17.9
    5. openpitrix: v0.3.5
    6. enableKubeConfig: true
    7. devops: # Add this field manually.
    8. sonarqubeURL: http://10.77.1.201:31377 # The SonarQube IP address.
  3. 保存该文件。

步骤 7:重启服务

执行以下命令。

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

为新工程创建 SonarQube Token

您需要一个 SonarQube 令牌,以便您的流水线可以在运行时与 SonarQube 通信。

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

    SonarQube 创建项目

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

    Jenkins 项目密钥

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

    创建令牌

  4. 创建令牌后,点击 Continue

    令牌已创建

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

    sonarqube-example

在 KubeSphere 控制台查看结果

使用图形编辑面板创建流水线使用 Jenkinsfile 创建流水线之后,可以查看代码质量分析的结果。如果 SonarQube 成功运行,您可能会看到下图所示结果。

code-analysis