Как задеплоить монолитный pet проект на Java с 0 и не сойти с ума… Часть 2

от автора

Предисловие

Это 2-ая часть статьи «Как задеплоить монолитный pet проект на Java с 0 и не сойти с ума». Первую часть вы можете найти по ссылке.

В первой части мы успешно добавили свои наработки в репозиторий GitHub, в этой части мы рассмотрим что такое GitHub Actions и как с помощью этого инструмента сбилдить наш проект, сформировать из билда свой образ docker container и как отправить наш image в хранилище DockerHub.

Actions

Actions в GitHub это инструкции, которые GitHub может сделать исполнить в рамках вашего приложения. Actions являются частью парадигмы разработки приложения CI/CD (Continuous Integration/Continuous Delivery).

Бесконечность CI/CD

Бесконечность CI/CD

В этой статье мы разберем такие шаги как Build и Release.

Build

Для того, чтобы сформировать jar файл из своего проекта, достаточно в корневой папке проекта запустить команду.

./gradlew build

Для того, чтобы Actions у себя сформировал этот образ, перейдите в GitHub в свой проект и нажмите на вкладку Actions.

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

Вот так это должно выглядеть

Вот так это должно выглядеть

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

В зависимости от настроек GitHub будет запускать тот или иной файл

В зависимости от настроек GitHub будет запускать тот или иной файл

В открывшемся файле можете просто удалить все и вставлять мой код, он идет с пояснениями.

// Имя вашего 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 с соответствующими значениями как показано на картинке ниже.

В поле secret просто добавьте впишите соответствующие названия

В поле secret просто добавьте впишите соответствующие названия

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

Еще один важный момент, нужно в корневую папку проекта добавить 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. ссылка на проект.


ссылка на оригинал статьи https://habr.com/ru/articles/755332/