Skip to content

04 SonarQube 部署

4.1 架构

  • PostgreSQL 16(alpine):SonarQube 后端库,PVC 5Gi(nfs)
  • SonarQube LTS Community:Deployment 单副本,PVC 10Gi(nfs)
  • 特权 initContainer(busybox):调整节点内核参数 vm.max_map_count=524288fs.file-max=131072(内嵌 Elasticsearch 强制要求)
  • Service:NodePort 30900(集群内访问 http://sonarqube.sonarqube.svc.cluster.local:9000

清单文件:

deploy/sonarqube/00-namespace-secret.yaml   # namespace + DB 凭据(sonar / xxx)
deploy/sonarqube/10-postgres.yaml           # PostgreSQL 16
deploy/sonarqube/20-sonarqube.yaml          # SonarQube + initContainer + Service

4.2 部署

bash
export KUBECONFIG=~/.kube/config-122.31
K=./tools/kubectl
$K apply -f deploy/sonarqube/00-namespace-secret.yaml
$K apply -f deploy/sonarqube/10-postgres.yaml
$K apply -f deploy/sonarqube/20-sonarqube.yaml
$K -n sonarqube get pods -w

SonarQube 首次启动需初始化数据库与 ES 索引,约 2-5 分钟 Ready。

4.3 初始化:修改 admin 密码

默认账号 admin / xxx,首次登录强制改密。用 API 直接修改:

bash
curl -s -u 'admin:xxx' -X POST \
  'http://192.168.122.23:30900/api/users/change_password?login=admin&previousPassword=xxx'

4.4 生成分析 Token 并接入 Jenkins

bash
# 1) 生成 token(名称 jenkins)
TOKEN=$(curl -s -u 'admin:xxx' -X POST \
  'http://192.168.122.23:30900/api/user_tokens/generate?name=jenkins' | jq -r '.token')
echo "$TOKEN"

# 2) 更新 Jenkins 命名空间中的 secret(JCasC 凭据来源)
$K -n jenkins create secret generic sonar-credentials \
  --from-literal=sonar-token="$TOKEN" --dry-run=client -o yaml | $K apply -f -

# 3) 重启 Jenkins controller 使挂载的 secret 生效并重新加载 JCasC
$K -n jenkins rollout restart statefulset jenkins

原理:controller.existingSecret: sonar-credentials 将 key sonar-token 挂载到 /run/secrets/additional/sonar-token,JCasC 中以 ${readFile:/run/secrets/additional/sonar-token} 注入到 ID 为 sonarqube-token 的 Jenkins 凭据;SonarQube 服务器地址 http://sonarqube.sonarqube.svc.cluster.local:9000 在 JCasC 的 unclassified.sonarGlobalConfiguration 中配置。

4.6 执行结果

  • SonarQube 版本:9.9.8.100196(LTS Community),状态 UP
  • admin 密码已修改(API 返回 204)
  • 分析 token 已生成(squ_7a3d...),写入 secret jenkins/sonar-credentials
  • JCasC reload 后 Jenkins 凭据 sonarqube-token 生效(无需重启 controller)
  • Webhook 已创建:http://jenkins.jenkins.svc.cluster.local:8080/sonarqube-webhook/waitForQualityGate 依赖 webhook 秒级回调;未配置时会轮询超时导致构建 ABORTED——本次实测踩坑后补上)

4.5 验证

bash
# 系统状态应为 UP
curl -s -u 'admin:xxx' http://192.168.122.23:30900/api/system/status | jq .

浏览器访问 http://192.168.122.23:30900 ,账号 admin / xxx