Предисловие
Это 2-ая часть статьи "Как задеплоить монолитный pet проект на Java с 0 и не сойти с ума". Первую часть вы можете найти по ссылке.
В первой части мы успешно добавили свои наработки в репозиторий GitHub, в этой части мы рассмотрим что такое GitHub Actions и как с помощью этого инструмента сбилдить наш проект, сформировать из билда свой образ docker container и как отправить наш image в хранилище DockerHub.
Actions
Actions в GitHub это инструкции, которые GitHub может сделать исполнить в рамках вашего приложения. Actions являются частью парадигмы разработки приложения CI/CD (Continuous Integration/Continuous Delivery).

В этой статье мы разберем такие шаги как Build и Release.
Build
Для того, чтобы сформировать jar файл из своего проекта, достаточно в корневой папке проекта запустить команду.
./gradlew build
Для того, чтобы Actions у себя сформировал этот образ, перейдите в GitHub в свой проект и нажмите на вкладку Actions.

Далее в поиске найдите Java with gradle (для настройки приложения я использую gradle, по maven будет написана отдельная статья, я надеюсь).

Нажимите на кнопку "Configure" и вас перекидывает на шаблон файла с прописанными настройками для build gradle.

В открывшемся файле можете просто удалить все и вставлять мой код, он идет с пояснениями.
// Имя вашего GitHub Action, с помощью него
// вы можете выбрать тот или другой файл
name: Gradle Package
// инструкция когда вызывать тот или иной файл
on:
push:
branches:
- "main"
Хочу немного остановится подробнее на моменте вызова нашего Action. При разработке в большой команде с несколькими контурами (dev, stage, prod) довольно важно иметь различные алгоритмы развертки кода на стенде. Например, не всегда при разворачивании на dev стенде нужно проходить интеграционные тесты. Так как статья состоит в том, что мы делаем деплой на сервер, то мы указываем что Actions будет работать при push операции в репозитории с ветки "main".
Далее указываем с помощью какой ос будет происходить управление командами. Я выбрал ubuntu, с другими я не пробовал.
jobs:
build:
runs-on: ubuntu-latest
Далее на уровне runs-on (это важно, именно на одном уровне, хоть код и будет в репозитории, но на всякий случай подсвечу этот момент) мы указываем шаги нашего CI/CD. Первый шаг - подключаем версию JDK, под которой вы работаете. Она у меня 17.
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
settings-path: ${{ github.workspace }} # location for the settings.xml file
Следующим шагом мы сбилдим наш проект следующей командой.
- name: Build with Gradle
run: ./gradlew build
Теперь на сервере в GitHub у нас сформировался jar файл, который мы сможем запустить.
Чтобы проверить что все работает, сохраните ваш файл, перейдите во вкладку Actions и сможете увидеть что ваш Actions завершил свою работу успешно.
Release
С шагом build мы разобрались, теперь наш образ нужно где-то хранить. В идеале мы должны производить версионирование версий различных образов, чтобы можно было откатиться к предыдущей версии, если что-то пошло не так, но в этой статье мы просто будем использовать последнюю версию, перезатирая старые. Хранить наш образ мы будем в DockerHub, а из него мы уже будем выгружать готовый образ к себе на сервер.
DockerHub
Для того, чтобы положить наш образ в DockerHub, первым шагом нам нужно будет авторизоваться. После авторизации нажмите на главном экране на кнопку "Create repository".

Далее нужно добавить login, password, имя репозитория от DockerHub в GitHub Secrets. Это нужно для того, чтобы ваши данные оставались в сохранности и чтобы можно было легко поменять эти данные, не изменяя кодпроекте. Перейдите обратно в ваш репозиторий GitHub и нажмите на вкладку "Settings".

Далее перейдите в "Secrets and variables" -> "Actions".

Далее во вкладке "Secrets" нажмите на кнопку "New repository secret".

Добавьте сюда следующие secrets DOCKERHUB_USERNAME, DOCKERHUB_PASSWORD, DOKCERHUB_REPOSITORY_NAME с соответствующими значениями как показано на картинке ниже.

Результат должен выглядеть как на следующей картинке.

Еще один важный момент, нужно в корневую папку проекта добавить Dockerfile, чтобы docker смог сформировать образ. Создайте в коневой папке файл с названием Dockerfile без какого-либо расширения и добавьте туда следующий код. Вместо <Name of your GitHub repository> нужно вставить имя своего GitHub репозитория.
FROM openjdk:17-oracle
VOLUME /tmp
COPY build/libs/<Name of your GitHub repository>-0.0.1-SNAPSHOT.jar <Name of your GitHub repository>-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-jar","/<Name of your GitHub repository>-0.0.1-SNAPSHOT.jar"]
Далее возвращайтесь в ваш файл с Actions и пропишите следующие шаги.
- name: login to DockerHub ; # логинимся в dockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Set up Docker Buildx #
uses: docker/setup-buildx-action@v2
- name: Build and push # билдим и отправляем наш докер образ в dockerHub
uses: docker/build-push-action@v4
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOKCERHUB_REPOSITORY_NAME }}:latest
Сохраняйте ваш вайл и дождитесь когда Actions закончит свою работу.

Также в своем DockerHub репозитории вы сможете увидеть результат своей работы в виде добавленного image.

Таким образом, мы смогли реализовать шаги сделать шаги по автоматической сборке нашего docker image, который вы можете выгрузить на любую машину и запустить его.
В следующей статье мы разберем как сконфигурирован свой Instance в AWS EC2, как подключаться к нему и допишем команды для отправки и запуска нашего docker image на сервере, по сути мы сделаем шаг Release из парадигмы CI/CD. Результатом будет ip адрес, по которому вы сможете с любого устройства достучаться до своего приложения.
Спасибо за внимание, оставляйте свои вопросы и комментарии в комментариях :)
P.S. ссылка на проект.