• Русский
  • SonarQube Connector

    SonarQube Connector — это коннектор, который обеспечивает подключение к любой инстанции SonarQube.

    Вы можете использовать SonarQube Connector для безопасного доступа к SonarQube в CI/CD пайплайнах для анализа качества кода, сканирования безопасности и проверки quality gate.

    Кроме того, коннектор позволяет централизованно управлять конфигурациями доступа к SonarQube по пространствам имён, устраняя необходимость дублировать токены SonarQube в каждом пространстве имён.

    Overview

    В этом документе рассматриваются:

    • Integration Requirements: требования к целевым инстанциям SonarQube
    • Creating SonarQube connector
    • Advanced Features: возможности прокси и настройки SonarQube Connector

    Integration Requirements

    SonarQube Prerequisites

    • Инстанция SonarQube должна быть доступна по HTTP/HTTPS
    • Версия SonarQube должна поддерживать API эндпоинты, используемые коннектором:
      • /api/authentication/validate — для проверки аутентификации
      • /api/system/status — для проверки работоспособности

    Creating a Simple SonarQube Connector

    Пример создания базового SonarQube Connector для self-hosted инстанции SonarQube:

    # SonarQube Connector для self-hosted инстанции
    apiVersion: connectors.alauda.io/v1alpha1
    kind: Connector
    metadata:
      name: sonarqube-connector
    spec:
      connectorClassName: sonarqube
      address: https://sonarqube.example.com
      auth:
        name: tokenAuth
        secretRef:
          name: sonarqube-token-secret

    Fields Reference

    spec.connectorClassName:

    sonarqube (константа), указывает имя ConnectorClass для интеграции с SonarQube.

    spec.address:

    Адрес целевого сервера SonarQube, например:

    • Self-hosted: https://sonarqube.example.com

    spec.auth (опционально):

    Определяет метод аутентификации для инстанции SonarQube.

    • spec.auth.name: должен быть tokenAuth для SonarQube Connector.

    • spec.auth.secretRef: указывает секрет, содержащий токен аутентификации для SonarQube. Секрет должен быть создан в том же пространстве имён, что и коннектор.

    Опциональные поля метаданных:

    • cpaas.io/description: описание для SonarQube Connector, например:

      apiVersion: connectors.alauda.io/v1alpha1
      kind: Connector
      metadata:
        name: sonarqube-connector
        annotations:
          cpaas.io/description: "Connect to team SonarQube for code quality analysis"

    Capabilities of SonarQube Connector

    Authentication

    SonarQube Connector поддерживает следующие типы аутентификации:

    • tokenAuth: аутентификация на основе токена, соответствующий тип секрета: connectors.cpaas.io/bearer-token

    Пример:

    apiVersion: v1
    stringData:
      token: your-sonarqube-token  # пользовательский токен или токен анализа проекта
    kind: Secret
    metadata:
      name: sonarqube-token-secret
    type: connectors.cpaas.io/bearer-token
    Token Types

    SonarQube поддерживает несколько типов токенов:

    • User Token: персональный токен доступа для отдельных пользователей
    • Project Analysis Token: токен, ограниченный конкретными проектами (рекомендуется для CI/CD)
    • Global Analysis Token: токен для анализа любых проектов (использовать с осторожностью)

    Для production-сред рекомендуем использовать Project Analysis Tokens с минимально необходимыми правами.

    Для подробной информации о статусе смотрите Connector Status Documentation.

    Credential Permissions Required

    Необходимые права для настроенных учётных данных зависят от того, как вы планируете их использовать в Pods/Pipelines.

    Например:

    • Code Analysis: если требуется только анализ кода, токен должен иметь право "Execute Analysis" на целевом проекте.
    • Quality Gate Checks: для проверки статуса quality gate токен должен иметь права чтения quality gates.
    • Creating Projects: для создания новых проектов во время анализа требуются дополнительные права.

    Для безопасности рекомендуем создавать токены с минимально необходимыми правами. Если нужны дополнительные привилегии, создавайте отдельные Connectors с более привилегированными токенами и используйте изоляцию по пространствам имён для контроля доступа пользователей к каждому Connector.

    SonarQube Connector Proxy and Configuration with sonar-project.properties File

    Чтобы клиенты могли обращаться к SonarQube без прямого управления токенами, SonarQube Connector предоставляет прокси-сервер, который автоматически внедряет информацию об аутентификации.

    Клиенты могут использовать этот прокси для доступа к SonarQube без необходимости настраивать токены на стороне клиента.

    Для упрощения использования SonarQube Connector предоставляет файл sonar-project.properties, который можно монтировать в Pods через CSI. При выполнении операций сканера в Pod прокси-сервис автоматически внедряет данные аутентификации.

    Proxy Address

    При создании Connector система автоматически создаёт прокси-сервис для целевой инстанции SonarQube.

    Адрес прокси записывается в status.proxy.httpAddress:

    Например:

    apiVersion: connectors.alauda.io/v1alpha1
    kind: Connector
    metadata:
      name: sonarqube-connector
    spec:
      # поля спецификации коннектора
    status:
      conditions:
        # условия статуса
      proxy:
        httpAddress:
          url: http://c-sonarqube-connector.default.svc.cluster.local

    sonar-project.properties Configuration File

    SonarQube Connector предоставляет следующую конфигурацию:

    sonar-project.properties:

    • Предоставляет конфигурационный файл sonar-project.properties. Этот файл монтируется в Pod через CSI, что позволяет обращаться к SonarQube через прокси без необходимости настройки токена на стороне клиента.

    Пример содержимого файла конфигурации, созданного в ConfigMap:

    # Конфигурация сервера SonarQube
    sonar.host.url=https://sonarqube.example.com
    
    # Настройки прокси (свойства сканера)
    sonar.scanner.proxyHost=c-sonarqube-connector.default.svc.cluster.local
    sonar.scanner.proxyPort=80
    sonar.scanner.proxyUser=default%2Fsonarqube-connector
    sonar.scanner.proxyPassword=<connector-token>

    Конфигурация включает:

    • sonar.host.url: реальный адрес сервера SonarQube
    • sonar.scanner.proxyHost: имя хоста прокси для безопасного доступа
    • sonar.scanner.proxyPort: порт прокси (80 для HTTP, 443 для HTTPS)
    • sonar.scanner.proxyUser: закодированное пространство имён и имя коннектора
    • sonar.scanner.proxyPassword: токен аутентификации (управляется автоматически)
    INFO

    Sonar Scanner версии 8.0+ по умолчанию отключает аутентификацию туннельного прокси. Чтобы включить поддержку аутентификации прокси, необходимо добавить параметр -Djdk.http.auth.tunneling.disabledSchemes= через SONAR_SCANNER_OPTS при запуске.

    Using sonar-project.properties in Pods

    Коннектор монтирует конфигурационный файл sonar-project.properties через CSI, который содержит настройки сканера с прокси configuration.names.

    Чтобы использовать его в вашем Pod:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: sonar-scanner-job
    spec:
      template:
        spec:
          containers:
            - name: sonar-scanner
              image: sonarsource/sonar-scanner-cli:latest
              command:
                - sh
                - -c
                - |
                  # Использовать конфигурацию коннектора
                  sonar-scanner -Dproject.settings=/scanner-config/sonar-project.properties
              volumeMounts:
                - name: scanner-config
                  mountPath: /scanner-config
          volumes:
            - name: scanner-config
              csi:
                driver: connectors.cpaas.io
                volumeAttributes:
                  connectorName: sonarqube-connector
                  connectorNamespace: connectors-sonarqube-demo
                  configuration.names: "sonar-scanner"

    Сканер будет использовать прокси-конфигурацию для безопасного доступа к SonarQube без необходимости прямого доступа к токену.

    Если ваша инстанция SonarQube использует HTTPS, необходимо импортировать CA-сертификат в Java truststore в контейнере сканера:

    keytool -importcert -noprompt \
        -trustcacerts \
        -keystore $JAVA_HOME/lib/security/cacerts \
        -storepass changeit \
        -alias corp-ca \
        -file /<mount-path>/ca.cert

    ca.cert автоматически монтируется коннектором и содержит CA-сертификат сервера Connector Proxy. Подробнее см. в Connectors CSI Built-in Configurations.

    Health Checks

    SonarQube Connector выполняет автоматические проверки состояния для проверки доступности:

    Liveness Probe:

    • Эндпоинт: /api/system/status
    • Ожидаемый ответ: HTTP 200 с {"status": "UP"}
    • Назначение: проверка работоспособности инстанции SonarQube

    Authentication Probe:

    • Эндпоинт: /api/authentication/validate
    • Ожидаемый ответ: HTTP 200 с {"valid": true}
    • Назначение: проверка валидности предоставленного токена

    Эти проверки выполняются автоматически, а результаты отражаются в условиях статуса Connector.

    Best Practices

    1. Namespace Isolation: создавайте отдельные коннекторы для разных команд или проектов с использованием изоляции по пространствам имён
    2. Token Rotation: регулярно обновляйте токены аутентификации и соответствующие секреты
    3. Monitor Status: отслеживайте состояние Ready коннектора для выявления проблем с аутентификацией или подключением
    4. Minimize Permissions: предоставляйте только минимально необходимые права для вашего конкретного сценария

    Troubleshooting

    Если коннектор отображает статус не Ready:

    1. Check Authentication: проверьте, что токен в секрете действителен и не истёк
    2. Verify Connectivity: убедитесь, что инстанция SonarQube доступна из Kubernetes кластера
    3. Review Logs: проверьте логи connector-proxy-service для подробных сообщений об ошибках
    4. Validate Address: убедитесь, что spec.address указан корректно и содержит протокол (https://)
    5. API Access: убедитесь, что инстанция SonarQube разрешает API-доступ из вашего кластера

    Для дополнительной помощи смотрите Troubleshooting Guide.