Введение в CI/CD для Java проектов с GitHub Actions
Современная разработка программного обеспечения невозможна без автоматизации процессов сборки, тестирования и развертывания. CI/CD (Continuous Integration / Continuous Deployment) — это набор практик, позволяющий командам быстро и безопасно доставлять изменения в продакшн. Для Java-проектов одним из самых удобных инструментов является GitHub Actions — встроенная система CI/CD, которая не требует настройки отдельного сервера.
В этой статье мы разберем, как настроить пайплайн для Java-приложения: от компиляции и прогона тестов до публикации артефактов. Вы узнаете, как использовать Maven, JUnit и GitHub Actions для создания надежного процесса доставки.
1. Основы GitHub Actions: структура workflow
GitHub Actions работает на основе workflow — файлов конфигурации в формате YAML, которые хранятся в папке .github/workflows. Каждый workflow состоит из одного или нескольких jobs, которые выполняются на виртуальных машинах (runners).
Для Java-проекта типовой workflow включает следующие шаги:
- Checkout — клонирование репозитория
- Setup JDK — установка нужной версии Java
- Cache — кэширование зависимостей Maven/Gradle для ускорения сборки
- Build & Test — компиляция и запуск тестов
- Deploy — публикация артефактов (опционально)
Рассмотрим базовый пример конфигурации для Java 17 и Maven:
name: Java CI with Maven
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: maven
- name: Build with Maven
run: mvn -B package --file pom.xml
- name: Run tests
run: mvn test
- name: Upload JAR artifact
uses: actions/upload-artifact@v4
with:
name: app-jar
path: target/*.jar
Этот workflow запускается при каждом push или pull request в ветку main. Он собирает проект, прогоняет тесты и сохраняет JAR-файл как артефакт.
2. Продвинутая настройка: тестирование и качество кода
Простая сборка — это лишь начало. В реальных проектах важно контролировать качество кода. Добавим в workflow шаги для статического анализа и генерации отчетов.
Сначала подключим JaCoCo для измерения покрытия кода тестами. Добавьте в pom.xml плагин:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.11</version>
<executions>
<execution>
<goals><goal>prepare-agent</goal></goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals><goal>report</goal></goals>
</execution>
</executions>
</plugin>
Теперь обновим workflow, добавив проверку покрытия и публикацию отчета:
- name: Run tests with coverage
run: mvn verify
- name: Upload JaCoCo report
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: target/site/jacoco/
Также можно добавить линтер Checkstyle или SpotBugs. Пример для Checkstyle:
- name: Checkstyle
run: mvn checkstyle:check
Эти шаги помогут автоматически выявлять проблемы в коде до того, как они попадут в основную ветку.
3. Деплой Java-приложения: от JAR до Docker
Финальный этап CI/CD — доставка приложения пользователям. Рассмотрим два популярных сценария: публикация JAR-файла в GitHub Packages и сборка Docker-образа.
Сценарий 1: Публикация в GitHub Packages
Для этого нужно настроить Maven на публикацию в реестр пакетов GitHub. Добавьте в pom.xml:
<distributionManagement>
<repository>
<id>github</id>
<name>GitHub Packages</name>
<url>https://maven.pkg.github.com/OWNER/REPO</url>
</repository>
</distributionManagement>
В workflow используйте секрет GITHUB_TOKEN для аутентификации:
- name: Deploy to GitHub Packages
run: mvn deploy
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Сценарий 2: Сборка Docker-образа
Создайте простой Dockerfile:
FROM eclipse-temurin:17-jre-alpine
COPY target/my-app-1.0.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
Добавьте шаг в workflow для сборки и пуша образа в Docker Hub или GitHub Container Registry:
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: yourusername/my-app:latest
Теперь при каждом успешном прохождении тестов будет автоматически обновляться Docker-образ.
4. Оптимизация и best practices
Чтобы ваш CI/CD был быстрым и надежным, следуйте нескольким правилам:
- Кэшируйте зависимости — мы уже указали
cache: mavenв шаге setup-java. Это сокращает время сборки на 50-70%. - Разделяйте jobs — вынесите тесты и