将 SonarQube 集成到流水线
SonarQube 是一种主流的代码质量持续检测工具,可用于代码库的静态和动态分析。SonarQube 集成到 KubeSphere 企业版流水线后,如果在运行的流水线中检测到问题,将会在仪表板上直接显示常见代码问题。
本文档演示如何将 SonarQube 集成到流水线中。在使用 Jenkinsfile 创建流水线之前,请先阅读本节内容。
前提条件
KubeSphere 企业版平台需要安装并启用 DevOps 扩展组件。
安装 SonarQube 服务器
要将 SonarQube 集成到您的流水线,必须先安装 SonarQube 服务器。
-
安装 Helm,以便使用该工具安装 SonarQube。例如,运行以下命令安装 Helm 3:
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3|bash
查看 Helm 版本。
helm version version.BuildInfo{Version:"v3.4.1", GitCommit:"c4e74854886b2efe3321e185578e6db9be0a6e29", GitTreeState:"clean", GoVersion:"go1.14.11"}
说明 有关更多信息,请参阅 Helm 文档。
-
执行以下命令安装 SonarQube 服务器。
helm upgrade --install sonarqube sonarqube --repo https://charts.kubesphere.io/main -n \ kubesphere-devops-system --create-namespace --set service.type=NodePort
说明 请确保使用 Helm 3 安装 SonarQube 服务器。
获取 SonarQube 控制台地址
-
执行以下命令获取 SonarQube NodePort。
export NODE_PORT=$(kubectl get --namespace kubesphere-devops-system -o jsonpath="{.spec.ports[0].nodePort}" services sonarqube-sonarqube) export NODE_IP=$(kubectl get nodes --namespace kubesphere-devops-system -o jsonpath="{.items[0].status.addresses[0].address}") echo http://$NODE_IP:$NODE_PORT
-
预期输出结果:(您的 NodeIP 和 NodePort 应该不同)
http://10.77.1.201:31377
配置 SonarQube 服务器
步骤 1:访问 SonarQube 控制台
-
执行以下命令查看 SonarQube 的状态。注意,只有在 SonarQube 启动并运行后才能访问 SonarQube 控制台。
kubectl get pod -n kubesphere-devops-system
-
在浏览器中访问 SonarQube 控制台 http://NodeIP:NodePort。
-
点击右上角的 Log in,然后使用默认账户 admin/admin 登录。
说明 取决于实例的部署位置,您可能需要设置必要的端口转发规则,并在您的安全组中放行该端口,以便访问 SonarQube。
步骤 2:创建 SonarQube 管理员令牌 (Token)
-
点击右上角字母 A,然后从菜单中选择 My Account 以转到 Profile 页面。
-
点击 Security 并输入令牌名称,例如 kubesphere。
-
点击 Generate 并复制此令牌。
说明 如提示所示,您无法再次查看此令牌,因此请确保复制成功。
步骤 3:创建 Webhook 服务器
-
执行以下命令获取 SonarQube Webhook 的地址。
export NODE_PORT=$(kubectl get --namespace kubesphere-devops-system -o jsonpath="{.spec.ports[0].nodePort}" services devops-jenkins) export NODE_IP=$(kubectl get nodes --namespace kubesphere-devops-system -o jsonpath="{.items[0].status.addresses[0].address}") echo http://$NODE_IP:$NODE_PORT/sonarqube-webhook/
-
预期输出结果:
http://10.77.1.201:30180/sonarqube-webhook/
-
依次点击 Administration、Configuration 和 Webhooks 创建一个 Webhook。
-
点击 Create。
-
在弹出的对话框中输入 Name 和 Jenkins Console URL(即 SonarQube Webhook 地址)。点击 Create 完成操作。
步骤 4:将 SonarQube 配置添加到 ks-installer
-
执行以下命令编辑 ks-installer。
kubectl edit cc -n kubesphere-system ks-installer
-
搜寻至 devops。添加字段 sonarqube 并在其下方指定 externalSonarUrl 和 externalSonarToken。
devops: enabled: true jenkinsJavaOpts_MaxRAM: 2g jenkinsJavaOpts_Xms: 512m jenkinsJavaOpts_Xmx: 512m jenkinsMemoryLim: 2Gi jenkinsMemoryReq: 1500Mi jenkinsVolumeSize: 8Gi sonarqube: # Add this field manually. externalSonarUrl: http://10.77.1.201:31377 # The SonarQube IP address. externalSonarToken: 00ee4c512fc987d3ec3251fdd7493193cdd3b91d # The SonarQube admin token created above.
-
完成操作后保存此文件。
步骤 5:将 SonarQube 服务器添加至 Jenkins
-
执行以下命令获取 Jenkins 的地址。
export NODE_PORT=$(kubectl get --namespace kubesphere-devops-system -o jsonpath="{.spec.ports[0].nodePort}" services devops-jenkins) export NODE_IP=$(kubectl get nodes --namespace kubesphere-devops-system -o jsonpath="{.items[0].status.addresses[0].address}") echo http://$NODE_IP:$NODE_PORT
-
获取 Jenkins 的端口号。
http://10.77.1.201:30180
-
使用地址 http://NodeIP:30180 访问 Jenkins。
安装 DevOps 时,默认情况下也会安装 Jenkins 仪表板。此外,Jenkins 还配置有 KubeSphere 企业版 LDAP,这意味着您可以直接使用 KubeSphere 企业版账户登录 Jenkins。有关配置 Jenkins 的更多信息,请参阅 Jenkins 系统设置。
说明 取决于实例的部署位置,您可能需要设置必要的端口转发规则,并在您的安全组中放行端口 30180,以便访问 Jenkins。
-
点击左侧导航栏中的系统管理。
-
向下滚动并点击系统配置。
-
搜寻到 SonarQube servers,然后点击 Add SonarQube。
-
输入 Name 和 Server URL (http://NodeIP:NodePort)。 点击添加,选择 Jenkins,然后在弹出的对话框中用 SonarQube 管理员令牌创建凭证(如下方第二张截图所示)。创建凭证后,从 Server authentication token 旁边的下拉列表中选择该凭证。点击应用完成操作。
说明 如果点击添加按钮无效,前往系统管理下的 Manage Credentials 并点击 Stores scoped to Jenkins 下的 Jenkins,再点击全局凭据 (unrestricted),然后点击左侧导航栏的添加凭据,参考上方第二张截图用 SonarQube 管理员令牌添加凭证。添加凭证后,从 Server authentication token 旁边的下拉列表中选择该凭证。
步骤 6:将 sonarqubeURL 添加到 KubeSphere 企业版控制台
您需要指定 sonarqubeURL,以便可以直接从 KubeSphere 企业版 Web 控制台访问 SonarQube。
-
执行以下命令:
kubectl editcm -n kubesphere-system ks-console-config
-
搜寻到 data:client:enableKubeConfig,在下方添加 devops 字段并指定 sonarqubeURL。
client: enableKubeConfig: true devops: # 手动添加该字段。 sonarqubeURL: http://10.77.1.201:31377 # SonarQube IP 地址。
-
保存该文件。
步骤 7:重启服务
执行以下命令重启服务。
kubectl -n kubesphere-devops-system rollout restart deploy devops-apiserver
kubectl -n kubesphere-system rollout restart deploy ks-console
为新项目创建 SonarQube Token
创建一个 SonarQube 令牌,以便流水线在运行时可以与 SonarQube 通信。
-
在 SonarQube 控制台上,点击 Create new project。
-
输入项目密钥,例如 java-demo,然后点击 Set Up。
-
输入项目名称,例如 java-sample,然后点击 Generate。
-
创建令牌后,点击 Continue。
-
分别选择 Java 和 Maven,复制下图所示绿色框中的序列号。如果要在流水线中使用,则需要在凭证中添加此序列号。
在 KubeSphere 企业版控制台查看结果
使用 Jenkinsfile 创建流水线或使用图形编辑面板创建流水线之后,即可查看代码质量分析的结果。