guassp

Guassp - GitLab User Access Synchronizer for SonarQube Projects

GuasspСинхронізатор доступу користувачів GitLab для проектів SonarQube

Проект призначений для створення розрахованої на багато користувачів інтеграції SonarQube та GitLab. Бачимість проекту та дозволи користувачів будуть встановлені в SonarQube таким же чином, як дозволи для проекту в GitLab.

Цей документ доступний мовами: eng 🇬🇧, ua 🇺🇦, rus 🇷🇺

Реалізація

Цей застосунок складається з API інтерфейсу, який приймає запити на оновлення дозволів з конвеєра GitLab CI, де вся довіра побудована навколо CI_JOB_TOKEN, довірені завдання додаються до черги завдань RQ (Redis Queue). Завдання обробляються бекенд-воркерами Worker, а для виведення статистики використовується окремий експортер метрик prometheus.

scheme

Права доступу видаються за рівнем доступу ролей SonarQube відповідно до наявних дозволів користувачів проекту в GitLab.
Враховується те, як GitLab реалізує права доступу користувачів у проекті, та користувачів із запрошених груп, де рівні доступу імітуються відповідно до GitLab.

permissions
role-mapping

Вимоги

Обов’язково

Рекомендовано

Компоненти

Проект реалізований на flask, для WSGI застосований bjoern, робота з API GitLab відбувається через python-gitlab, а SonarQube API через python-sonarqube-api. Для обробки черги повідомлень використовується RQ, чиї метрики віддає rq-exporter.

Зображення контейнерів

Ви можете отримати зображення з регістрів:

Швидкий старт

Для швидкого старту можна використати приклад із docker-compose:

  1. docker-compose.env - змініть налаштування у файлі налаштувань оточення
  2. docker-compose.yml - виконайте docker-compose up -d

Конфігурація

Щоб запустити потрібну утиліту, передайте в контейнер або сценарій guassp.sh аргумент:

Параметри застосунку

Параметри роботи з GitLab

Параметри роботи з SonarQube

Параметри роботи з Redis

Параметри експортера метрик Prometheus

API

Реєстрація завдання

POST /task

{"job_token": str}

Headers: JOB-TOKEN or Authorization: Bearer

Потрібно передати токен завдання у будь-якому з варіантів:

curl -sL http://127.0.0.1:5000/task \
  -H "Content-Type: application/json" \
  -d '{"job_token": "'$CI_JOB_TOKEN'"}' | jq

curl -sL http://127.0.0.1:5000/task -X POST \
  -H "JOB-TOKEN: $CI_JOB_TOKEN" | jq

curl -sL http://127.0.0.1:5000/task -X POST \
  -H "Authorization: Bearer $CI_JOB_TOKEN" | jq

Токен завдання може бути переданий заголовком JOB-TOKEN або Authorization: Bearer або бути значенням ключа job_token у JSON

Черга завдань

GET /tasks

curl -sL http://127.0.0.1:5000/tasks | jq
curl -sL http://127.0.0.1:5000/tasks | jq -er '.tasks | keys'

Статус завдання

GET /task/<uuid:job_uuid>

curl -sL http://127.0.0.1:5000/task/8b155172-cfcf-4777-b9f4-bfce53b6eb0e | jq

Видалення завдання з черги

DELETE /task/<uuid:job_uuid>

curl -sL http://127.0.0.1:5000/task/8b155172-cfcf-4777-b9f4-bfce53b6eb0e \
  -X DELETE | jq

Ручна реєстрація завдання з ID проекту GitLab

POST /task_manual/<int:prj_id>

curl -sL http://127.0.0.1:5000/task_manual/111 \
  -X POST | jq

Доступність

GET /health

Здоров’я API, доступність самого додатку і черги завданнь.

Пайплайн

У пайплайні GitLab CI в першу чергу потрібно переконатися, що налаштування ALM зроблено та відноситься до вашого проекту, після чого можна надсилати завдання на синхронізацію в guassp. Ось тепер можна розпочинати аналіз проекту.

Для публікації API Guassp за Nginx як частини API SonarQube, дивіться до прикладу конфігурації Nginx

: "${SONARQUBE_PROJECT_KEY:=gitlab:$CI_PROJECT_ID}"

curl --location --fail --user "$SONARQUBE_TOKEN:" \
  "$SONARQUBE_URL/api/alm_settings/set_gitlab_binding" \
  -d "almSetting=$SONARQUBE_ALM_NAME" \
  -d "project=$SONARQUBE_PROJECT_KEY" \
  -d "repository=$CI_PROJECT_ID"

curl --location --fail -X POST -H "JOB-TOKEN: $CI_JOB_TOKEN" \
  "$SONARQUBE_URL/api/guassp/task"

Більш об’ємний приклад скрипту виконання SonarQube у пайплайні ви можете побачити у файлі sq-integration-taks.sh

Метрики

Метрики реалізовані за допомогою проекту rq-exporter

Dashboard ID 12196 підходить для візуалізації в Grafana або використовуйте його адаптацію, який виводитиме лише метрики з guassp.

Складання та налагодження проекту

Набір команд для швидкого локального налагодження

# Build
podman build -t guassp .

# Redis
podman run --rm -d -p 6379:6379 --name redis redis
# API
podman run --rm -d -p 5000:5000 --env-file .env --name guassp-api localhost/guassp:latest api
# Workers
podman run --rm -d --env-file .env --name guassp-worker-1 localhost/guassp:latest worker
podman run --rm -d --env-file .env --name guassp-worker-2 localhost/guassp:latest worker
# Exporter
podman run --rm -d -p 9726:9726 --env-file .env --name guassp-exporter localhost/guassp:latest exporter

# Check
curl 0.0.0.0:9726 -s | grep -v '^#'
curl 0.0.0.0:5000/tasks -s | jq
curl 0.0.0.0:5000/task -s -X POST -H "JOB-TOKEN: $CI_JOB_TOKEN" | jq

Або запустимо локально, для цього потрібно встановити залежності

apt-get install -y libev-dev libevdev2
python -m venv .venv
./.venv/bin/activate
pip install requirements.txt

Або для простоти запустити застосунки через скрипт guassp

./guassp.sh api
./guassp.sh worker
./guassp.sh exporter