From cf194b5eb7315dad639e285085065c88f98e5852 Mon Sep 17 00:00:00 2001 From: Maxim Kramarenko Date: Wed, 12 Aug 2026 12:33:47 +0300 Subject: [PATCH] =?UTF-8?q?CI:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D1=83=20=D1=81=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=B0=D0=BC=D0=B8,=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=87=D0=B8=D0=BD=D0=B8=D1=82=D1=8C=20=D0=B2=D0=B5=D1=80=D1=81?= =?UTF-8?q?=D0=B8=D1=8E=20=D0=B2=20Docker-=D0=BE=D0=B1=D1=80=D0=B0=D0=B7?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Новый 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 --- .dockerignore | 29 ++++++++++++++ .github/workflows/build.yml | 63 ++++++++++++++++++++++++++++++ .github/workflows/docker-image.yml | 36 ++++++++++++++--- .gitignore | 4 ++ 4 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 .dockerignore create mode 100644 .github/workflows/build.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..e9fcca5 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,29 @@ +# Контекст сборки — весь репозиторий, но Dockerfile берёт из него только +# .git, файлы сборки Gradle и src/, а Dockerfile.migrator — liquibase/. +# Всё остальное исключаем, чтобы не гонять десятки мегабайт в билдер. +# +# ВНИМАНИЕ: .git исключать нельзя — Dockerfile копирует его внутрь, +# плагин com.palantir.git-version определяет по нему версию сборки. + +# Результаты сборки +/build/ +.gradle/ +*.war +*.ear +*.class + +# Документация и картинки +/docs/ +/markdown_en/ +/markdown_ru/ +screenshot.png +*.md + +# Инфраструктура, не участвующая в сборке образа +/k8s/ +docker-compose.yml +.env + +# IDE +.idea/ +*.iml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..5b13e37 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,63 @@ +name: Build + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + workflow_dispatch: + +# Новый пуш в ту же ветку отменяет предыдущий незавершённый прогон +concurrency: + group: build-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + build: + name: Gradle build + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + # com.palantir.git-version определяет version по тегам, + # при shallow clone теги недоступны и версия получается неверной + fetch-depth: 0 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: '21' + + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Print version + run: ./gradlew --no-daemon printVersion + + - name: Build (compile + test + war) + run: ./gradlew --no-daemon --stacktrace build + + - name: Upload test results + if: always() + uses: actions/upload-artifact@v4 + with: + name: test-results + path: | + build/reports/tests/test + build/test-results/test + if-no-files-found: ignore + retention-days: 14 + + - name: Upload WAR + uses: actions/upload-artifact@v4 + with: + name: TrackStudio-war + path: build/libs/TrackStudio.war + if-no-files-found: error + retention-days: 14 diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 84a63c7..5e4f490 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -5,14 +5,40 @@ on: branches: [ "main" ] pull_request: branches: [ "main" ] + workflow_dispatch: -jobs: +concurrency: + group: docker-${{ github.ref }} + cancel-in-progress: true - build: +permissions: + contents: read +jobs: + build: + name: Docker build runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Build the Docker image - run: docker build . --file Dockerfile --tag trackstudio/app:$(date +%s) + - name: Checkout + uses: actions/checkout@v4 + with: + # Dockerfile копирует .git внутрь сборки, а com.palantir.git-version + # определяет version по тегам. При shallow clone тегов нет и в образ + # попадает версия-заглушка вместо реальной. + fetch-depth: 0 + + - name: Set up Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build the Docker image + uses: docker/build-push-action@v6 + with: + context: . + file: ./Dockerfile + push: false + load: false + tags: trackstudio/app:${{ github.sha }} + # Кеш слоёв между прогонами: без него Gradle качает зависимости заново + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/.gitignore b/.gitignore index 5a30e1d..3f1aa0d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,10 @@ target .bat .sh +# Gradle +/build/ +.gradle/ + # Mobile Tools for Java (J2ME) .mtj.tmp/