Всем привет! Иногда бывает так, что учиться очень сложно и мотивацию надо поднять, а дженерики и лямбда выражения совсем высосали силы. Поэтому я, пару дней назад, залипая в мобильную игру, внезапно поймал себя на мысли, что могу упростить себе и еще нескольким сотням человек жизнь. Поэтому было принято решение сделать свое приложение
Предыстория. Пару месяцев назад я наткнулся на совершенно бессмысленную мобилку, в которой ты, как игрок, бьешь дерево, получаешь предметы, которые надеваешь на героя, поднимаешь уровень и тратишь на это персики (валюта). Но игра настолько же бессмысленная, насколько и занимательная (да и я сейчас описываю не все аспекты игры). Так, играя день за днем по часику в день, я ловил себя на мысли, что хочется спрогнозировать, сколько времени я потрачу на lvlup и как быстро «оденусь» в крутые доспехи.
![](https://habrastorage.org/getpro/habr/upload_files/4bf/eb9/4a3/4bfeb94a3bd456b561b6c863de25d91c.png)
Начав ресерчить, что я могу сделать и как быстро это реализовать, вначале я сделал просто консольное приложение, которое делало расчеты и писало все это в консоль.
С таким справится и ребенок, подумал я. Надо было что то сложнее, я же успел за эти два месяца подтянуть базу. Так я начал реализовывать десктоп.
![Обычный цикл, ничего особенного и вывод в консоль. Обычный цикл, ничего особенного и вывод в консоль.](https://habrastorage.org/getpro/habr/upload_files/1a3/8a6/99c/1a38a699c713982e40e4537c71bccb34.png)
Погуглив и покурив бамбук, я понял что надо подключать джавовую библиотеку Swing. Дальше часик-два в документации и я уже пишу следующее:
![Здесь ничего особенного, просто настраиваем окно, добавляем кнопки, текст и тд. Здесь ничего особенного, просто настраиваем окно, добавляем кнопки, текст и тд.](https://habrastorage.org/getpro/habr/upload_files/4d2/aab/612/4d2aab6128e678f118ce62d9f0ae8eba.png)
Дальше берем значения из полей, проверяем их на ошибки и делаем вычисления.
![](https://habrastorage.org/getpro/habr/upload_files/380/5ab/135/3805ab135f66e17be63bc6bedc5cc8b5.png)
Не забываем обрабатывать ошибки, 1я проектная работа научила многому)
![](https://habrastorage.org/getpro/habr/upload_files/415/04b/656/41504b656a252666c559c27ad921596c.png)
Запускаем все это и вуа-ля, у нас целое десктопное приложение, в котором можно считать и оно даже работает.
![](https://habrastorage.org/getpro/habr/upload_files/078/893/ff8/078893ff8307ded1ed8814b52b996965.png)
Но и этого мне стало мало, потому что большинство пользователей этой игры не буду запускать exe-шник на компе и считать персики. Нужно было удобное решение, удобное для всех пользователей мобилки. Поэтому было решено делать веб-приложение, используя весь накопленный опыт.
Опять гугл, опять бамбук и вот найдено решение. Spring. Да да, не удивляйтесь. Поэтому заходим на spring initializr, настраиваем то, что нам нужно(Spring web и шаблонизатор Thymeleaf) и жмем Generate.
![](https://habrastorage.org/getpro/habr/upload_files/ea1/08c/5d6/ea108c5d6865e49f2f103679eda54d01.png)
Дальше ютуб, гугл, документация спринга и stackoverflow, чтобы разобраться как и что накрутить здесь. В итоге, получилась такая логика - на сервере мы делаем вычисления, работаем с двумя запросами: первый get, при загрузке главной страницы и post /calculate для расчетов, на фронте у нас html и css, с шаблонизатором, который может передавать данные из полей.
Добавляем в нашу модель атрибуты для get-запроса.
![](https://habrastorage.org/getpro/habr/upload_files/b43/490/d07/b43490d079d690fb40de7e8bf0ba2153.png)
И считаем в post /calculate.
![](https://habrastorage.org/getpro/habr/upload_files/942/23c/6cb/94223c6cbeabfcd1d10c6a515676b464.png)
Дальше я настроил шаблон (и вспомнил html), чтобы все значения, который пользователь вводит передавались на бэк, проводились расчеты и отдавался результат.
![](https://habrastorage.org/getpro/habr/upload_files/4a4/817/8b2/4a48178b2c5eac3738848458c9744967.png)
В итоге имеем такой результат
![](https://habrastorage.org/getpro/habr/upload_files/485/8e6/704/4858e67045575f14e1f07fc3b682e36d.png)
Здорово, круто, я даже горжусь собой, но есть одно НО. Только я могу пользоваться этим, потому что это развернуто локально, у меня на компе. Для этого все это надо развернуть на сервере. А как развернуть jar-ник на сервере? Правильно, докер. И здесь я совсем профан, я не знал ни как, ни почему, ни зачем это все нужно. Так что дальше пол дня гугления, настройки, документации и видео, чтобы разобраться. Я опущу многие детали, пройдусь по основным. Я создал Dockerfile в своем проекте, установил Docker Desktop и запустил контейнер.
![](https://habrastorage.org/getpro/habr/upload_files/22d/fdf/e9a/22dfdfe9ac4aef54499f90f6127ad53a.png)
Dockerfile
![](https://habrastorage.org/getpro/habr/upload_files/1ef/a39/cef/1efa39cef938702db2768f97500c1346.png)
Все работает, контейнер запускается, можно зайти в приложение. Теперь надо запустить это на сервере(благо у моего отца уже есть настроенный Ubuntu с nginx на борте) и настроить gitlab, чтобы при пуше в main ветку, происходила автоматическая сборка и деплой.
Предварительно, настроив nginx для моего проекта, указав все порты, хосты и прочие детали, я преступил к настройке CI/CD
![](https://habrastorage.org/getpro/habr/upload_files/668/1d2/968/6681d296878812fe30ae504b86194ad8.png)
Тут я тоже опущу много нюансов, как боролся с тем, чтобы jar предварительно собирался, обратным прокси и т.д. Покажу как реализован yaml файл в проекте.
![](https://habrastorage.org/getpro/habr/upload_files/b0e/2d5/a1f/b0e2d5a1f246946873ae3ae253dbfb79.png)
В нем я указал что мы — деплоим все это дело, собираем jar файл, билдим докер, удаляя образ, если он уже есть и если у нас есть запущенный — останавливаем его. Ну и все это для ветки main.
Все работает как надо и при каждом пуше, я наблюдаю запуск job'ов
![](https://habrastorage.org/getpro/habr/upload_files/b46/0a2/b26/b460a2b26bb5dbad8625e0f5d38411dc.png)
И веб приложение теперь доступно по адресу
![](https://habrastorage.org/getpro/habr/upload_files/11b/4c1/73c/11b4c173ce4dcc24e57e0075b6e82a3a.png)
Подытожу: с такой пустяковой идеи как сделать базовый, простенький калькулятор, я столкнулся с множеством фреймворков, нюансов, идей и вариантов их реализаций. Набрался немного опыта в Java, Spring, Docker, Gitlab CI/CD, поработал с гитом и еще куча всего. Хочу сказать - не бойтесь делать что то, даже если не получается и беритесь за такие микро-пэт проекты, чтобы набраться опыта :-)
И да, я не претендую на то, что я сделал все правильно и не допустил ошибок, я лишь учусь как и мы все.
xSVPx
Лучше бы "выучить эксель". Потому как натягивание совы на глобус может войти в привычку.
Squoworode
Не, эксель - плохая альтернатива. Формулу можно записать только инлайновую, а привязывать код VBA на изменение ячейки - то ещё извращение. А в мобильном гейминге алгоритмы расчёта о-го-го...