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

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


SONARQUBE_ALM_KEY;SONARQUBE_TOKEN для коректної роботи worker;SONARQUBE_TOKEN, що
використовується в CI пайплайні для виконання аналізу та управління
проектом.GITLAB_TOKEN для worker, потрібен
для отримання списку всіх учасників групи або проекту, включаючи
успадкованих та запрошених учасників$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME а ключ проекту рекомендується
встановити в gitlab:$CI_PROJECT_ID. Тільки при таких налаштуваннях
синхронізація буде проходити успішно, інші стани можливі, але не перевірялися.Проект реалізований на flask, для WSGI застосований bjoern, робота з API GitLab відбувається через python-gitlab, а SonarQube API через python-sonarqube-api. Для обробки черги повідомлень використовується RQ, чиї метрики віддає rq-exporter.
Ви можете отримати зображення з регістрів:
ghcr.io/woozymasta/guassp:latestquay.io/woozymasta/guassp:latestdocker.io/woozymasta/guassp:latestДля швидкого старту можна використати приклад із docker-compose:
docker-compose up -dЩоб запустити потрібну утиліту, передайте в контейнер або сценарій
guassp.sh аргумент:
worker (за замовчуванням) - процесор завдань для черги;api - API для контролю завдань;exporter - prometheus метрики;all-in-one - запуск worker, api та exporter одразу;API -DEV - запуск API через сервер Flask Dev.LISTEN_ADDRESS=0.0.0.0 - Хост для публікації API;LISTEN_PORT=5000 - Порт для публікації API;LOG_LEVEL=INFO - Рівень логування;SECRET_KEY=secret - Секретний ключ;QUEUE_RESULT_TTL=7200 - Час зберігання результатів черги;MORE_ACCURATE_SYNC=true - Пошук користувачів у SonarQube
електронною поштою GitLab, інакше пошук відбувається на ім’я
користувача. Це викликає ще один запит API для кожного користувача, це
більш точно, але повільніше вдвічі.GITLAB_URL=https://gitlab.com - Адреса сервера GitLab;GITLAB_TOKEN - Токен доступу до GitLab, повинен мати права на
перегляд учасників та їх прав доступу для проектів, що обслуговуються;GITLAB_SKIP_USERS - Список (розділених комою) ID користувачів,
які будуть пропущені при синхронізації.SONARQUBE_URL - Адреса сервера SonarQube;SONARQUBE_TOKEN - Токен доступу до SonarQube з адміністративними
привілеями;SONARQUBE_ALM_KEY - Ключ ALM (назва) інтеграції з GitLab;SONARQUBE_SKIP_GROUPS - Список (розділених комою) груп,
які будуть проігноровані при синхронізації.REDIS_URL=redis://localhost:6379/0 - URL-адреса підключення до
сервера Redis.EXPORTER_LISTEN_ADDRESS=0.0.0.0 - Хост для публікації
Prometeus метрик;EXPORTER_LISTEN_PORT=9726 - Порт для публікації Prometeus метрик.POST
/task{"job_token": str}Headers:
JOB-TOKENorAuthorization: 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
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