Источник: Dev.to
В этой публикации показано, как создавать рабочие процессы, которые упаковывают приложение Java с помощью Maven, а затем сохраняют его как артефакт или публикуют в GitHub Packages.
![Кофе-брейк #102. Упаковка Java-приложений с помощью Maven и GitHub Actions - 1]()
![Кофе-брейк #102. Упаковка Java-приложений с помощью Maven и GitHub Actions - 2]()
![Кофе-брейк #102. Упаковка Java-приложений с помощью Maven и GitHub Actions - 3]()
С помощью этих двух подходов мы успешно решили проблему автоматической публикации приложений Java в виде пакетов Maven и продемонстрировали использование GitHub Actions и GitHub Packages для создания полного решения для сквозной разработки в одном месте.

Среда разработки
По представленной здесь ссылке вы можете найти репозиторий с исходным кодом. Это простое приложение Spring Boot, которое извлекает имена студентов из базы данных. Приложение выполняет загрузку с помощью Spring Initializr. Для зависимостей мы добавили Spring Web, который используют для создания веб-приложений с использованием Spring MVC. Этот пакет также использует Apache Tomcat в качестве встроенного контейнера по умолчанию. Мы также использовали Spring Data JDBC для сохранения данных в SQL с помощью простого JDBC, и PostgreSQL Driver, который позволяет Java-приложениям подключаться к базе данных Postgres с использованием стандартного, независимого от базы данных кода Java. Для локальной разработки мы можем запустить экземпляр Postgres с Docker, используя следующую команду:docker run -d --name postgresDB -p <port>:5432 -e POSTGRES_PASSWORD=<YourPassword>-v /postgresdata:/var/lib/postgresql/data postgres:latest
Spring Boot следует многоуровневой архитектуре, в которой каждый уровень взаимодействует со слоем непосредственно под или над ним. Мы следовали этой практике и реализовали Controller, Service и Repository внутри нашего приложения и продемонстрировали принципы внедрения зависимостей. Исходный код также содержит класс StudentConfig, который просто вставляет студента в базу данных.
После успешной настройки среды разработки и написания некоторого кода мы решили перенести нашу работу в систему управления исходным кодом, в данном случае GitHub. Теперь нам нужно собрать код и опубликовать его как пакет Maven. Этот процесс можно выполнить вручную, но мы бы хотели, чтобы он выполнялся автоматически, когда изменения вносятся в ветку main. Так мы избежим ручных задач при публикации новой версии.
Как и большинство других вещей, эту проблему можно решить несколькими способами, и мы будем использовать два разных подхода. Во-первых, мы опубликуем наш пакет как артефакт сборки и сделаем его доступным для загрузки, а при втором подходе мы опубликуем пакет в репозитории GitHub Packages Maven.
Хранение данных рабочего процесса в виде артефактов
В файле main.yaml первые несколько строк сообщают нам, какие события запускают рабочий процесс. Кроме запросов push и pull в основной ветке, мы также добавили тег workflow_dispatch, позволяющий запускать рабочий процесс вручную. В разделе “Задания” мы определили задание build, которое запустится в средстве выполнения Ubuntu. Первые два шага проверяют основную ветку из GitHub и настраивают JDK (Java Development Kit). Далее мы создаем проект и настраиваем кеш для Maven:- name: Build Maven project
run: |
mvn -B package --file pom.xml -Dmaven.test.skip
mkdir staging && cp target/*.jar staging
- name: Set up a cache for Maven
uses: actions/cache@v2
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2
После завершения сборки промежуточный каталог будет содержать созданный файл .jar. Каждое задание в рабочем процессе выполняется в новой виртуальной среде, что означает, что после выполнения задания build мы не можем получить доступ к этой среде и наш файл .jar исчезнет. Вот где происходит наш последний шаг, который загружает артефакты из вашего рабочего процесса, позволяя вам обмениваться данными между заданиями и сохранять данные после завершения рабочего процесса.
- name: Persist workflow data as artifacts
uses: actions/upload-artifact@v2
with:
name: github-actions-artifact
path: staging
По умолчанию артефакты, созданные рабочими процессами, хранятся в течение 90 дней, а затем автоматически удаляются. Вы можете настроить срок хранения в зависимости от типа репозитория. Когда вы настраиваете срок хранения, он применяется только к новым артефактам и не имеет обратной силы к существующим объектам.
Артефакты можно найти на вкладке Actions, если щелкнуть нужный запуск рабочего процесса.

Публикация в пакетах GitHub
Вы можете настроить Apache Maven для публикации пакетов в GitHub Packages и использования пакетов, хранящихся в GitHub Packages, в качестве зависимостей в проекте Java. Помимо Maven, GitHub Packages предлагает различные реестры пакетов для часто используемых менеджеров пакетов, таких как npm, NuGet, Gradle и RubyGems. Также можно хранить Docker и другие образы OCI. Благодаря всем этим функциям вы можете создавать комплексные решения DevOps и централизовать разработку программного обеспечения на GitHub. В файле maven-publish.yaml вы можете найти детали рабочего процесса для публикации пакета в GitHub Packages. Как и в предыдущем решении, мы указываем имя и события, которые будут запускать рабочий процесс. Затем в разделе заданий мы выбрали Ubuntu runner в качестве среды для задания publish и определили разрешения на чтение содержимого и запись пакетов.name: Publish package to GitHub Packages
on:
push:
branches: [main]
jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
На следующих шагах мы проверяем основную ветку и настраиваем JDK с параметром java-version. Последний шаг — публикация пакета, для этого ему нужен личный токен доступа для аутентификации. PAT — это конфиденциальная информация, и мы не хотим хранить ее в виде простого текста, поэтому мы определили секрет на уровне репозитория и получили к нему доступ как переменную среды. Для простоты мы пропустили тесты во время развертывания.
- name: Publish package
run: mvn --batch-mode deploy -Dmaven.test.skip
env:
GITHUB_TOKEN: ${{ secrets.TOKEN }}
Перед запуском рабочего процесса нам также нужно одно изменение конфигурации в исходном коде приложения. Внутри файла pom.xml нам нужно передать информацию об управлении распространением пакетов.
<project ...>
...
<distributionManagement>
<repository>
<id>github</id>
<name>GitHub Packages</name>
<url>https://maven.pkg.github.com/cvitaa11/java-spring-demo</url>
</repository>
</distributionManagement>
</project>
После внесения изменений в основную ветку рабочий процесс запускается автоматически, и мы можем следить за выводом журнала на вкладке Actions на странице репозитория. Когда все шаги будут выполнены, мы увидим готовый к использованию пакет Maven в нашем репозитории кода в разделе Packages.


ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ