Мотивацию надо поднять

Всем привет! Иногда бывает так, что учиться очень сложно и мотивацию надо поднять, а дженерики и лямбда выражения совсем высосали силы. Поэтому я, пару дней назад, залипая в мобильную игру, внезапно поймал себя на мысли, что могу упростить себе и еще нескольким сотням человек жизнь. Поэтому было принято решение сделать свое приложение

Предыстория. Пару месяцев назад я наткнулся на совершенно бессмысленную мобилку, в которой ты, как игрок, бьешь дерево, получаешь предметы, которые надеваешь на героя, поднимаешь уровень и тратишь на это персики (валюта). Но игра настолько же бессмысленная, насколько и занимательная (да и я сейчас описываю не все аспекты игры). Так, играя день за днем по часику в день, я ловил себя на мысли, что хочется спрогнозировать, сколько времени я потрачу на lvlup и как быстро «оденусь» в крутые доспехи.

4bfeb94a3bd456b561b6c863de25d91c.png

Начав ресерчить, что я могу сделать и как быстро это реализовать, вначале я сделал просто консольное приложение, которое делало расчеты и писало все это в консоль.

С таким справится и ребенок, подумал я. Надо было что то сложнее, я же успел за эти два месяца подтянуть базу. Так я начал реализовывать десктоп.

Обычный цикл, ничего особенного и вывод в консоль.

Обычный цикл, ничего особенного и вывод в консоль.

Погуглив и покурив бамбук, я понял что надо подключать джавовую библиотеку Swing. Дальше часик-два в документации и я уже пишу следующее:

Здесь ничего особенного, просто настраиваем окно, добавляем кнопки, текст и тд.

Здесь ничего особенного, просто настраиваем окно, добавляем кнопки, текст и тд.

Дальше берем значения из полей, проверяем их на ошибки и делаем вычисления.

3805ab135f66e17be63bc6bedc5cc8b5.png


Не забываем обрабатывать ошибки, 1я проектная работа научила многому)

41504b656a252666c559c27ad921596c.png

Запускаем все это и вуа-ля, у нас целое десктопное приложение, в котором можно считать и оно даже работает.

078893ff8307ded1ed8814b52b996965.png

Но и этого мне стало мало, потому что большинство пользователей этой игры не буду запускать exe-шник на компе и считать персики. Нужно было удобное решение, удобное для всех пользователей мобилки. Поэтому было решено делать веб-приложение, используя весь накопленный опыт.

Опять гугл, опять бамбук и вот найдено решение. Spring. Да да, не удивляйтесь. Поэтому заходим на spring initializr, настраиваем то, что нам нужно (Spring web и шаблонизатор Thymeleaf) и жмем Generate.

ea108c5d6865e49f2f103679eda54d01.png

Дальше ютуб, гугл, документация спринга и stackoverflow, чтобы разобраться как и что накрутить здесь. В итоге, получилась такая логика — на сервере мы делаем вычисления, работаем с двумя запросами: первый get, при загрузке главной страницы и post /calculate для расчетов, на фронте у нас html и css, с шаблонизатором, который может передавать данные из полей.

Добавляем в нашу модель атрибуты для get-запроса.

b43490d079d690fb40de7e8bf0ba2153.png

И считаем в post /calculate.

94223c6cbeabfcd1d10c6a515676b464.png

Дальше я настроил шаблон (и вспомнил html), чтобы все значения, который пользователь вводит передавались на бэк, проводились расчеты и отдавался результат.

4a48178b2c5eac3738848458c9744967.png

В итоге имеем такой результат

4858e67045575f14e1f07fc3b682e36d.png

Здорово, круто, я даже горжусь собой, но есть одно НО. Только я могу пользоваться этим, потому что это развернуто локально, у меня на компе. Для этого все это надо развернуть на сервере. А как развернуть jar-ник на сервере? Правильно, докер. И здесь я совсем профан, я не знал ни как, ни почему, ни зачем это все нужно. Так что дальше пол дня гугления, настройки, документации и видео, чтобы разобраться. Я опущу многие детали, пройдусь по основным. Я создал Dockerfile в своем проекте, установил Docker Desktop и запустил контейнер.

22dfdfe9ac4aef54499f90f6127ad53a.png


Dockerfile

1efa39cef938702db2768f97500c1346.png

Все работает, контейнер запускается, можно зайти в приложение. Теперь надо запустить это на сервере (благо у моего отца уже есть настроенный Ubuntu с nginx на борте) и настроить gitlab, чтобы при пуше в main ветку, происходила автоматическая сборка и деплой.

Предварительно, настроив nginx для моего проекта, указав все порты, хосты и прочие детали, я преступил к настройке CI/CD

6681d296878812fe30ae504b86194ad8.png

Тут я тоже опущу много нюансов, как боролся с тем, чтобы jar предварительно собирался, обратным прокси и т.д. Покажу как реализован yaml файл в проекте.

b0e2d5a1f246946873ae3ae253dbfb79.png

В нем я указал что мы — деплоим все это дело, собираем jar файл, билдим докер, удаляя образ, если он уже есть и если у нас есть запущенный — останавливаем его. Ну и все это для ветки main.

Все работает как надо и при каждом пуше, я наблюдаю запуск job’ов

b460a2b26bb5dbad8625e0f5d38411dc.png

И веб приложение теперь доступно по адресу

11b4c173ce4dcc24e57e0075b6e82a3a.png

Подытожу: с такой пустяковой идеи как сделать базовый, простенький калькулятор, я столкнулся с множеством фреймворков, нюансов, идей и вариантов их реализаций. Набрался немного опыта в Java, Spring, Docker, Gitlab CI/CD, поработал с гитом и еще куча всего. Хочу сказать — не бойтесь делать что то, даже если не получается и беритесь за такие микро-пэт проекты, чтобы набраться опыта :-)

И да, я не претендую на то, что я сделал все правильно и не допустил ошибок, я лишь учусь как и мы все.

© Habrahabr.ru