Skip to content

CI: сборка с тестами, кеш Docker-слоёв, починка версии в образе - #12

Merged
maximkr merged 1 commit into
mainfrom
ci/gradle-build
Aug 12, 2026
Merged

CI: сборка с тестами, кеш Docker-слоёв, починка версии в образе#12
maximkr merged 1 commit into
mainfrom
ci/gradle-build

Conversation

@maximkr

@maximkr maximkr commented Aug 12, 2026

Copy link
Copy Markdown
Owner

Что было

В репозитории два workflow: Docker Image CI (собирает образ) и CodeQL Advanced. Оба зелёные. Чего не было — сборки проекта как таковой: Dockerfile собирает WAR командой gradle clean war -x test, то есть тесты не запускались нигде и никогда.

Что добавлено

Build (.github/workflows/build.yml)

./gradlew build на JDK 21 (temurin) с кешем Gradle через gradle/actions/setup-gradle. Отчёты тестов и TrackStudio.war выкладываются артефактами прогона, отдельный шаг printVersion показывает версию сборки в логе.

Починена версия сборки в Docker-образе

Плагин com.palantir.git-version определяет version по git-тегам, а actions/checkout по умолчанию делает shallow clone без тегов. Dockerfile копирует .git внутрь сборки — значит, version.properties и имя артефакта в образе получали версию-заглушку.

Проверено локально на этом репозитории:

shallow clone (как сейчас в CI):  trackstudio.version=a3e8436
full history + tags:              trackstudio.version=v6.0.0-55-ga3e8436

Обоим workflow добавлен fetch-depth: 0.

Docker Image CI

  • Сборка переведена на docker/build-push-action с кешем слоёв type=gha. Без него Gradle на каждом прогоне заново качает все зависимости — отсюда стабильные 1м15с–1м26с на каждый пуш, включая пуши, которые правят только README.
  • Тег образа github.sha вместо $(date +%s) — прогон теперь сопоставим с коммитом.
  • Добавлен .dockerignore. Контекст сборки — весь репозиторий (27 МБ с картинками и markdown), притом Dockerfile берёт из него только .git, три файла Gradle и src/, а Dockerfile.migrator — только liquibase/. .git в исключения намеренно не попал: он нужен для версионирования.

Обоим workflow

concurrency с cancel-in-progress (новый пуш в ветку отменяет предыдущий незавершённый прогон), явный permissions: contents: read, workflow_dispatch для ручного запуска.

.gitignore

Добавлены /build/ и .gradle/ — файл остался с времён Maven и знал только про target/.

Важно: тестов в проекте фактически нет

Шаг test в новом workflow сейчас проходит вхолостую. Все три тест-класса помечены @Ignore:

tests="1" skipped="1"   SliderTest
tests="1" skipped="1"   IndexManagerTest
tests="1" skipped="1"   SecuredTaskAdapterManagerTest

Снимать @Ignore в этом PR я не стал — это решение про код, а не про CI. Что выяснилось при проверке:

  • IndexManagerTest — должен остаться отключённым: он создаёт список из 100 000 000 Lucene-документов в памяти, на раннере это гарантированный OOM.
  • SecuredTaskAdapterManagerTest — требует поднятого AdapterManager и базы, в отрыве от приложения не работает.
  • SliderTest — единственный, который реально можно включить: я снял @Ignore локально, тест прошёл (tests="1" skipped="0" failures="0"). Но включать его как есть смысла мало: у него нет ни одного assert-а, он только печатает результат, а внутри при этом гасится GranException: I18n must be initialized before use — то есть проходит он по деградировавшему пути. Тест возвращён в исходное состояние.

Пока в проекте не появятся настоящие тесты, ценность нового workflow — в том, что он компилирует весь Java-код и собирает WAR на каждый PR, чего раньше не происходило вне Docker-сборки.

Проверка

Полная сборка прогнана локально — BUILD SUCCESSFUL, TrackStudio.war 37 МБ. Итоговую проверку сделает CI этого PR.

🤖 Generated with Claude Code

Новый workflow Build (.github/workflows/build.yml):
- ./gradlew build на JDK 21 (temurin) с кешем Gradle
- отчеты тестов и TrackStudio.war выкладываются артефактами прогона
- шаг printVersion, чтобы версия сборки была видна в логе

Починена версия сборки. Плагин com.palantir.git-version определяет version
по git-тегам, а actions/checkout по умолчанию делает shallow clone без тегов.
Dockerfile копирует .git внутрь сборки, поэтому в образ попадала версия-заглушка.
Проверено локально на этом репозитории:

  shallow clone:      trackstudio.version=a3e8436
  full history+tags:  trackstudio.version=v6.0.0-55-ga3e8436

Обоим workflow добавлен fetch-depth: 0.

Docker Image CI:
- сборка через docker/build-push-action с кешем слоев type=gha — без него
  Gradle на каждом прогоне заново качает все зависимости
- тег образа по github.sha вместо $(date +%s): прогон стало можно
  сопоставить с коммитом
- добавлен .dockerignore. Контекст сборки — весь репозиторий (27 МБ),
  притом Dockerfile берет из него только .git, файлы Gradle и src/.
  .git исключать нельзя, он нужен для версионирования

Обоим workflow добавлены concurrency-группы (новый пуш отменяет предыдущий
прогон), permissions: contents: read и workflow_dispatch для ручного запуска.

.gitignore: добавлены /build/ и .gradle/ — файл остался от Maven и знал
только про target/

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@maximkr
maximkr merged commit 40e2ab7 into main Aug 12, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant