Интеграция GitFlic → PT Sandbox
PoC-скрипт для автоматической выгрузки релизов из GitFlic в PT Sandbox на анализ.
Содержание
- Как это работает
- Подготовка: данные и ключи
- Установка и запуск
- Конфигурация (справочник)
- Файл состояния state.json
- Примеры запуска
Как это работает
Скрипт выполняет один проход (или бесконечный цикл):
- Загружает конфигурацию из
config.yaml - Загружает историю отправленных релизов из
state.json - Авторизуется в GitFlic по API-токену пользователя
- Получает список проектов (все / по списку / компании / команды)
- Для каждого проекта получает релизы
- Фильтрует уже отправленные (ключ:
project_id + release_id + tag + version) - Для каждого нового релиза:
- Скачивает архив исходного кода по тегу релиза
- Скачивает прикреплённые файлы (assets), если они есть
- Каждый файл отправляет в PT Sandbox отдельной задачей
- Помечает релиз как отправленный в
state.json
- Логирует всё в консоль и/или файл
- Если включён цикл — ждёт заданный интервал и повторяет
Подготовка: данные и ключи
GitFlic: создание API-токена
Скрипт использует персональный API-токен пользователя GitFlic с правами на чтение.
Как создать:
- Войдите в GitFlic под своей учётной записью.
- Перейдите в Профиль → Настройки профиля → Ключи → API токены.
(или откройте ссылку: https://gitflic.ru/settings/tokens) - Нажмите «Создать токен».
- Задайте имя, например:
sandbox-integration - В разделе Scopes (области) отметьте:
- ✅ api — полный доступ к API (требуется для чтения проектов и релизов)
- ✅ read_repository — чтение репозиториев (для скачивания архива)
- Нажмите «Создать».
- Скопируйте токен сразу — после закрытия страницы он будет недоступен.
Важно: токен даёт доступ ко всем проектам, в которых ваш пользователь является участником. Храните его в безопасном месте, не добавляйте в публичные репозитории.
В config.yaml токен указывается в поле:
gitflic:
api_token: "glpat-XXXXXXXXXXXXXXXXXXXX"
### PT Sandbox: получение API-ключа
Способ получения API-ключа зависит от версии PT Sandbox и способа развёртывания.
**Вариант 1. Веб-интерфейс Sandbox**
1. Войдите в веб-интерфейс PT Sandbox.
2. Перейдите в **Настройки → API → Ключи доступа**.
3. Нажмите **«Создать ключ»**, скопируйте сгенерированный ключ.
**Вариант 2. Конфигурационный файл сервера**
Найдите файл конфигурации Sandbox (обычно `config.yml`, `settings.py` или `.env`).
В нём может быть определён параметр наподобие:
```yaml
api_keys:
- "your-api-key-here"
Вариант 3. Обратиться к администратору
Если Sandbox развёрнут вашей командой — уточните у DevOps/администратора, какой заголовок и значение используются для авторизации.
Типовые параметры авторизации (могут отличаться):
| Параметр | Наиболее частое значение |
|---|---|
Заголовок (auth_header) |
X-API-Key или Authorization |
| Передача | Просто ключ в заголовке или Bearer <key> |
В config.yaml:
pt_sandbox:
api_key: "ваш-ключ"
auth_header: "X-API-Key" # или "Authorization"
## Установка и запуск
### Зависимости
- Python 3.9+
- Установка зависимостей:
```bash
pip install -r requirements.txt
Настройка config.yaml
Скопируйте шаблон из config.yaml и заполните обязательные поля:
gitflic:
base_url: "https://gitflic.ru" # или ваш self-hosted URL
api_token: "glpat-..." # API-токен пользователя (обязательно)
pt_sandbox:
base_url: "http://192.168.1.100:8080" # URL вашей инсталляции Sandbox
api_key: "..." # API-ключ (обязательно)
Запуск
Однократный проход:
python main.py
Циклический запуск (каждый час):
# config.yaml
loop:
enabled: true
interval_seconds: 3600
python main.py # работает до Ctrl+C
Конфигурация (справочник)
gitflic — подключение к GitFlic
| Поле | Тип | Обяз. | По умолч. | Описание |
|---|---|---|---|---|
base_url |
строка | да | https://gitflic.ru |
Базовый URL GitFlic |
api_token |
строка | да | — | API-токен пользователя |
project_source |
строка | нет | all |
all / list / company / team |
project_list |
массив | при list | [] |
["namespace/project"] |
project_ids |
массив | при list | [] |
[123, 456] |
company_id |
число | при company | null |
ID компании |
team_id |
число | при team | null |
ID команды |
scan_mode |
строка | нет | latest |
latest или all |
per_page |
число | нет | 50 |
Страница пагинации |
download_chunk_size |
число | нет | 8388608 |
Чанк скачивания (8 МБ) |
pt_sandbox — подключение к PT Sandbox
| Поле | Тип | Обяз. | По умолч. | Описание |
|---|---|---|---|---|
base_url |
строка | да | http://localhost:8080 |
URL Sandbox |
upload_endpoint |
строка | нет | /api/v1/files/upload |
Путь загрузки файла |
auth_header |
строка | нет | X-API-Key |
Заголовок авторизации |
api_key |
строка | да | — | Ключ API |
file_field_name |
строка | нет | file |
Имя поля multipart |
extra_fields |
словарь | нет | {source: gitflic} |
Доп. поля запроса |
timeout_connect |
число | нет | 30 |
Таймаут соединения (с) |
timeout_read |
число | нет | 300 |
Таймаут чтения (с) |
state, logging, loop
| Раздел | Поле | Тип | По умолч. | Описание |
|---|---|---|---|---|
state |
file_path |
строка | state.json |
Файл состояния |
logging |
level |
строка | INFO |
DEBUG, INFO, WARNING, ERROR |
logging |
format |
строка | %(asctime)s... |
Формат лога |
logging |
file |
строка | — | Файл лога (иначе только консоль) |
loop |
enabled |
bool | false |
Вкл. бесконечный цикл |
loop |
interval_seconds |
число | 3600 |
Интервал (с) |
Файл состояния state.json
Автоматически создаётся при первом запуске и хранит историю отправленных релизов.
{
"sent_releases": {
"1:42:v1.0:v1.0": {
"project_id": 1,
"project_name": "org/my-project",
"release_id": 42,
"release_tag": "v1.0",
"release_version": "v1.0",
"files": [
{
"filename": "source_org_my-project_v1.0.zip",
"type": "source_archive",
"sandbox_task_id": "task-uuid-12345"
}
],
"sent_at": "2026-09-16T12:00:00+00:00"
}
}
}
Чтобы переотправить релиз — удалите соответствующую запись из state.json и перезапустите скрипт.
Примеры запуска
1. Однократно, только последний релиз:
python main.py
2. В цикле, проверка каждые 30 минут:
# config.yaml
loop:
enabled: true
interval_seconds: 1800
python main.py # Ctrl+C для остановки
3. Только проекты компании ID=5:
gitflic:
project_source: "company"
company_id: 5
4. Конкретные проекты по имени:
gitflic:
project_source: "list"
project_list:
- "my-namespace/app-frontend"
- "my-namespace/app-backend"
project_ids: [101, 203]
5. Детальное логирование:
logging:
level: "DEBUG"
file: "debug.log"