Предисловие

Это 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. ссылка на проект.

Комментарии (0)