CI/CD для Java проектов: настройка GitHub Actions

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение в 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 — вынесите тесты и

Блоги

Рекомендаций по книгам