• Русский
  • Использование Reviewdog с GitLab Connector

    В этом руководстве показано, как использовать пользовательские CLI-инструменты, такие как reviewdog, для взаимодействия с GitLab и автоматического проведения кода на проверку в merge request.

    Overview

    Reviewdog — это инструмент автоматического кода-ревью, который может публиковать комментарии к обзору на различных платформах, включая GitLab. В сочетании с GitLab Connector вы можете запускать автоматические проверки кода в ваших CI/CD пайплайнах без необходимости вручную управлять учетными данными GitLab.

    Требования

    • GitLab Connector, настроенный с Private Access Token, имеющим область действия api
    • Репозиторий GitLab с существующим merge request
    • Доступ kubectl к вашему Kubernetes кластеру
    • Базовое понимание reviewdog и инструментов линтинга

    Что вы узнаете

    • Как использовать встроенные конфигурации GitLab Connector для доступа к GitLab API
    • Как настроить reviewdog для публикации автоматических комментариев к коду в merge request

    Обзор рабочего процесса

    Типичный рабочий процесс использования reviewdog с GitLab Connector:

    1. Клонировать репозиторий и переключиться на ветку merge request с помощью GitLab CLI (glab)
    2. Запустить инструменты линтинга/анализа кода
    3. Использовать reviewdog для публикации результатов в виде комментариев к merge request через GitLab API

    Шаг 1: Создайте GitLab Connector

    Убедитесь, что у вас есть GitLab Connector с соответствующими правами:

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: gitlab-secret
      namespace: gitlab-connector-demo
    type: connectors.cpaas.io/gitlab-pat-auth
    stringData:
      token: glpat-xxxxxxxxxxxxxxxxxxxx  # Токен должен иметь область 'api'
    ---
    apiVersion: connectors.alauda.io/v1alpha1
    kind: Connector
    metadata:
      name: gitlab-connector
      namespace: gitlab-connector-demo
    spec:
      connectorClassName: gitlab
      address: https://gitlab.com
      auth:
        name: patAuth
        secretRef:
          name: gitlab-secret
    EOF

    Замените:

    • glpat-xxxxxxxxxxxxxxxxxxxx: Замените на ваш реальный Private Access Token GitLab (должен иметь область api)
    • https://gitlab.com: Замените на адрес вашего сервера GitLab (используйте https://gitlab.com для GitLab.com или URL вашего self-hosted GitLab)

    Шаг 2: Используйте Reviewdog для публикации комментариев к обзору

    Ниже приведён полный пример, который клонирует репозиторий, переключается на ветку merge request и запускает reviewdog:

    cat << 'EOF' | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: reviewdog-demo
      namespace: gitlab-connector-demo
    spec:
      restartPolicy: Never
      initContainers:
      # Клонирование репозитория и переключение на ветку merge request
      - name: checkout-mr
        image: gitlab/glab:v1.74.0
        command: ["sh"]
        args:
        - "-c"
        - |
          set -ex
          
          # Настройка конфигурации glab
          mkdir -p ~/.config/glab-cli
          cp /opt/gitlab/config/config.yml ~/.config/glab-cli/
          chmod 600 ~/.config/glab-cli/config.yml
          
          cp /opt/gitlab/config/.gitconfig ~/
          chmod 644 ~/.gitconfig
          
          # Клонирование репозитория и переключение на ветку merge request
          cd /data
          glab repo clone <your-group>/<your-repo> ./repo
          cd /data/repo
          git checkout <mr-source-branch-name>
        volumeMounts:
        - name: gitlab-config
          mountPath: /opt/gitlab/config
        - name: data
          mountPath: /data
      containers:
      # Запуск reviewdog для публикации комментариев к обзору
      - name: reviewdog
        image: reviewdog/action-golangci-lint:v1
        command: ["sh"]
        args:
        - "-c"
        - |
          set -ex
          cd /data/repo
          
          # Чтение учетных данных GitLab из встроенных конфигураций коннектора
          GITLAB_TOKEN=$(cat /opt/gitlab/config/context.token)
          GITLAB_SERVER=$(cat /opt/gitlab/config/connector.status.proxyAddress)
          
          # Настройка переменных окружения для reviewdog
          export REVIEWDOG_GITLAB_API_TOKEN=${GITLAB_TOKEN}
          export GITLAB_API=${GITLAB_SERVER}/api/v4
          export CI_PULL_REQUEST=<merge-request-id>
          export CI_REPO_OWNER=<your-group>
          export CI_REPO_NAME=<your-repo>
          export CI_COMMIT=$(git rev-parse HEAD)
          
          # Запуск reviewdog (пример с фиктивным комментарием)
          echo "example.go:1:1: This is a review comment from reviewdog" | \
            reviewdog -f=golint -reporter=gitlab-mr-commit -fail-on-error=false
          
          echo "Reviewdog completed"
        volumeMounts:
        - name: gitlab-config
          mountPath: /opt/gitlab/config
        - name: data
          mountPath: /data
      volumes:
      - name: data
        emptyDir: {}
      - name: gitlab-config
        csi:
          driver: connectors-csi
          readOnly: true
          volumeAttributes:
            connector.name: "gitlab-connector"
            configuration.names: "gitlabconfig,gitconfig"
    EOF

    Замените:

    • <your-group>/<your-repo>: Замените на путь к вашему репозиторию GitLab (например, gitlab-org/gitlab)
    • <merge-request-id>: Замените на ID merge request (например, 123)
    • <mr-source-branch-name>: Замените на имя исходной ветки merge request (например, feature-branch)
    • <your-group>: Замените на имя вашей группы/пользователя GitLab
    • <your-repo>: Замените на имя вашего репозитория
    • echo "example.go:1:1: This is a review comment from reviewdog": Замените на реальный вывод инструмента линтинга (убедитесь, что файл существует в merge request и номер строки корректен).

    Шаг 3: Проверьте результаты

    После применения Pod проверьте, что reviewdog успешно опубликовал комментарии в merge request.

    Проверьте логи Pod:

    # просмотр логов контейнера checkout-mr
    kubectl logs reviewdog-demo -n gitlab-connector-demo -c checkout-mr

    Вы увидите вывод, подтверждающий успешное клонирование репозитория и переключение на ветку merge request:

    Cloning into './repo'...
    remote: Enumerating objects: 123, done.
    remote: Counting objects: 100% (123/123), done.
    remote: Compressing objects: 100% (89/89), done.
    remote: Total 123 (delta 34), reused 123 (delta 34), pack-reused 0
    Receiving objects: 100% (123/123), 45.67 KiB | 1.23 MiB/s, done.
    Resolving deltas: 100% (34/34), done.
    + echo 'Repository cloned successfully'
    Repository cloned successfully
    + cd /data/repo
    + git checkout dev-1764221453
    branch 'dev-1764221453' set up to track 'origin/dev-1764221453'.
    Switched to a new branch 'dev-1764221453'
    # просмотр логов контейнера reviewdog
    kubectl logs reviewdog-demo -n gitlab-connector-demo -c reviewdog

    Вы увидите вывод, подтверждающий успешное завершение работы reviewdog:

    + git rev-parse HEAD
    + export 'CI_COMMIT=7681622c06bb5e298ee5da6a710a177f7d4f2af6'
    + echo 'README.md:3:1: This is a review comment from reviewdog'
    + reviewdog '-f=golint' '-reporter=gitlab-mr-commit' '-fail-on-error=false'
    Reviewdog completed
    + echo 'Reviewdog completed'

    Проверьте в интерфейсе GitLab:

    Откройте merge request в GitLab и перейдите на вкладку Changes. Комментарий к обзору должен появиться в указанном файле и на указанной строке.

    Если комментарии не отображаются, проверьте:

    • Логи Pod на наличие ошибок: kubectl logs reviewdog-demo -c reviewdog -n gitlab-demo
    • Существование файла и номера строки в комментарии в merge request
    • Корректность ID merge request
    • Наличие у Private Access Token области api
    • Статус коннектора "Ready": kubectl get connector gitlab-connector -n gitlab-connector-demo

    Понимание конфигурации

    Переменные окружения Reviewdog

    Для взаимодействия reviewdog с GitLab требуются следующие переменные окружения:

    ПеременнаяОписаниеИсточник
    REVIEWDOG_GITLAB_API_TOKENТокен аутентификации GitLab APIИз файла context.token
    GITLAB_APIКонечная точка GitLab APIИз connector.status.proxyAddress + /api/v4
    CI_PULL_REQUESTID merge requestПредоставляется пользователем
    CI_REPO_OWNERВладелец/группа репозиторияПредоставляется пользователем
    CI_REPO_NAMEИмя репозиторияПредоставляется пользователем
    CI_COMMITSHA коммита для проверкиИз команды git rev-parse HEAD

    Подробнее см. в Reviewdog Documentation

    Встроенные конфигурации коннектора

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

    • context.token: токен Kubernetes API для доступа к прокси-сервису коннектора
    • connector.status.proxyAddress: адрес прокси-сервиса коннектора

    Подробнее см.: Connectors-CSI Built-in Configurations

    Использование с реальными инструментами линтинга

    В приведённом выше примере используется фиктивный комментарий для демонстрации. В продакшене используйте реальные инструменты линтинга:

    Пример с golangci-lint:

    golangci-lint run --out-format=line-number ./... | \
      reviewdog -f=golangci-lint -reporter=gitlab-mr-commit -fail-on-error=false

    Пример с eslint:

    eslint . --format=stylish | \
      reviewdog -f=eslint -reporter=gitlab-mr-commit -fail-on-error=false

    Для других интеграций reviewdog смотрите: Reviewdog Documentation

    Следующие шаги