Спасибо за интерес к проекту. Здесь описано, как собрать TrackStudio, что учитывать при изменениях и как оформить pull request.
Если вы ИИ-агент или используете ассистента для работы с кодом — более подробные правила по архитектуре и стилю лежат в AGENTS.md и docs/architecture.md.
Требуется Docker и Docker Compose. Всё остальное поднимается само.
git clone https://github.com/maximkr/TrackStudio.git
cd TrackStudio
docker compose up -d --buildПриложение — http://localhost:8080, вход root / root.
docker compose logs -f trackstudio # логи приложения
docker compose logs -f migrator # логи миграций Liquibase
docker compose down # остановить
docker compose down -v # остановить и удалить базу (данные пропадут)Нужен JDK 21. Gradle подтягивается wrapper-ом.
./gradlew build # компиляция + тесты
./gradlew war # собрать TrackStudio.war
./gradlew printVersion # версия сборкиВерсия определяется плагином com.palantir.git-version по git-тегам. Если собираете из shallow clone без тегов, вместо версии получится хеш коммита — при клонировании используйте полную историю.
- Загляните в открытые issue. Если задача уже описана — напишите в ней, что берётесь.
- Для крупных изменений сначала откройте issue с обсуждением. Так вы не потратите время на подход, который не подойдёт по архитектурным причинам.
- Изменения из списка ниже требуют предварительного обсуждения в любом случае.
Из docs/architecture.md, раздел 14:
- изменение порядка захвата блокировок;
- изменения модели ACL;
- изменения структуры кешей и их инвалидации;
- процесс старта приложения и конфигурация;
- изменение контракта REST API.
При таких изменениях обновите docs/architecture.md и AGENTS.md в том же PR.
Подробности — в AGENTS.md. Коротко:
- классы
PascalCase, методыcamelCase, константыUPPER_SNAKE_CASE, пакеты в нижнем регистре; - таблицы БД — с префиксом
gr_; - логирование через SLF4J API:
org.slf4j.LoggerиLoggerFactory. Новый код на commons-logging не пишем; - порядок импортов:
java, затемjavax, затемorg.apache, затемcom.trackstudio; - кодировка исходников и ресурсов — UTF-8;
- в kernel-коде — только Lock API (
LockManager,ReadWriteLock), не смешивать блокировки иsynchronizedв одном методе; - наружу отдавать копии или неизменяемые представления, внутренние коллекции не публиковать.
Только через Liquibase, каталог liquibase/. Правки схемы без миграции не принимаются. Учитывайте, что changelog разделён по языкам — changelog-master-en.xml и changelog-master-ru.xml.
Проект использует JUnit 4, тесты лежат в src/test/java/.
./gradlew test
./gradlew test --tests "com.trackstudio.kernel.manager.IndexManagerTest"Честное предупреждение: сейчас все существующие тест-классы помечены @Ignore, то есть фактически выполняется ноль тестов. Новый код с тестами приветствуется особенно — это то место, где проект больше всего нуждается в помощи.
- Ответвитесь от
main, ветку называйте осмысленно:fix/...,feature/...,docs/.... - Убедитесь, что
./gradlew buildпроходит локально. - Опишите в PR, что меняется и зачем. Для изменений в UI приложите скриншоты до и после.
- Дождитесь зелёного CI — на каждый PR запускаются сборка с тестами, сборка Docker-образа и анализ CodeQL.
- Один PR — одно логическое изменение. Не смешивайте рефакторинг с исправлением бага.
Коммиты пишите так, чтобы из заголовка было понятно, что сделано. Строгий формат не навязывается.
Отправляя pull request, вы соглашаетесь, что ваш вклад распространяется на условиях Apache License 2.0.