User Эллеонора Керри
Эллеонора Керри
41 уровень

Кофе-брейк #102. Упаковка Java-приложений с помощью Maven и GitHub Actions

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

Среда разработки

По представленной здесь ссылке вы можете найти репозиторий с исходным кодом. Это простое приложение 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, если щелкнуть нужный запуск рабочего процесса. Кофе-брейк #102. Упаковка Java-приложений с помощью Maven и GitHub Actions - 2

Публикация в пакетах 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. Кофе-брейк #102. Упаковка Java-приложений с помощью Maven и GitHub Actions - 3Кофе-брейк #102. Упаковка Java-приложений с помощью Maven и GitHub Actions - 4С помощью этих двух подходов мы успешно решили проблему автоматической публикации приложений Java в виде пакетов Maven и продемонстрировали использование GitHub Actions и GitHub Packages для создания полного решения для сквозной разработки в одном месте.
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ