CI: сборка с тестами, кеш Docker-слоёв, починка версии в образе - #12
Merged
Conversation
Новый 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что было
В репозитории два 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и имя артефакта в образе получали версию-заглушку.Проверено локально на этом репозитории:
Обоим 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:Снимать
@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.war37 МБ. Итоговую проверку сделает CI этого PR.🤖 Generated with Claude Code