JavaRush /Блоги Java /Random-TG /Мо ҷобаҷогузории барномаҳоро амалӣ менамоем - "Лоиҳаи Jav...
Roman Beekeeper
Сатҳи

Мо ҷобаҷогузории барномаҳоро амалӣ менамоем - "Лоиҳаи Java аз A то Я"

Дар гурӯҳ нашр шудааст
Салом ба ҳама. Мо силсилаи мақолаҳоро оид ба навиштани лоиҳаи шумо идома медиҳем. "Лоиҳаи Java аз A то Я": Амалисозии ҷобаҷогузории барномаҳо - 1

Шохаҳоро ҷудо кунед

Муҳим он аст, ки барои гум нашудан дар фorалҳо ва тартиби онҳо дар анбор, ман тасмим гирифтам, ки онҳоро бо илова кардани префикси STEP_{number} номгузорӣ кунам . Масалан, мо ба гайр аз фorали асосй се фorал дорем:
  • JRTB-0
  • JRTB-2
  • JRTB-3
Шумо фавран намефаҳмед, ки кадоме аз он бояд пас аз он равад. Пас, ман онҳоро ба таври зерин номгузорӣ мекунам:
  • STEP_1_JRTB-0 - қадами аввал
  • STEP_2_JRTB-2 - қадами дуюм
  • STEP_3_JRTB-3 - қадами сеюм
Ва ғайра барои мақолаҳои оянда. Барои тағир додани номи фorалҳо, ба саҳифаи репозиторий равед , қуттии фorалҳоро пайдо кунед , онро пайравӣ кунед: "Лоиҳаи Java аз A то Я": Амалисозии ҷобаҷогузории барномаҳо - 2Дар зери ҳар як фorал, қаламро клик кунед ва номи фorалро тағир диҳед: "Лоиҳаи Java аз A то Я": Амалисозии ҷобаҷогузории барномаҳо - 3Ва дар натиҷа мо ба даст меорем: Дар омади гап, ҳар касе, ки ба канали телеграмм"Лоиҳаи Java аз A то Я": Амалисозии ҷобаҷогузории барномаҳо - 4 обуна шудааст, пайдо кард. дарҳол маълум шуд, ки ман фorалҳоро тағир додам.

Як каме дар бораи Docker

Docker чист? Хулоса, ин асбобест, ки шумо метавонед бо ёрии он шумо метавонед барномаҳоро зуд ва бехатар ҷойгир кунед (ҷойгир кунед), барои онҳо инфрасохтори пӯшидае эҷод кунед, ки танҳо барои онҳо зарур аст. Ҳоло ҳам мушкил аст, ман мефаҳмам. Умуман, Docker-ро метавон ҳамчун платформаи рушд фаҳмид, ки дар он шумо метавонед зуд ва самаранок кор кунед. Docker-ро метавон ҳамчун барномае фаҳмид, ки дар server кор мекунад. Ин барнома дорои қобorяти нигоҳ доштани контейнерҳо бо барномаҳо мебошад. Контейнер чист? Ин инфрасохтори алоҳидаест, ки шумо метавонед ба он ҳама чизи лозимаро илова кунед. Масалан, барои як барномаи Java ба мо JRE лозим аст, то барномаро иҷро кунад, контейнер дорои ин аст, ба мо як нармафзори дигар лозим аст - мо метавонем инро илова кунем. Ё шояд ба мо Linux ва контейнери сервлети Tomcat лозим аст. Ин корро низ кардан мумкин аст. Контейнерҳо дар асоси тасвир сохта мешаванд: яъне ин қолаби мушаххасест, ки ҳама чизро барои сохтани контейнери Docker дар бар мегирад. Ин тасвирро чӣ гуна бояд эҷод кард? Дар ҳолати мо, мо бояд дар решаи лоиҳа як Dockerfile эҷод кунем, ки он чизеро дар контейнер тавсиф мекунад. Азбаски мо намехоҳем, ки аломати ботро дар ягон ҷо фош кунем, мо маҷбур мешавем, ки ҳар дафъае, ки барномаро ҷойгир кардан мехоҳем, ба интиқоли он муроҷиат кунем. Шумо метавонед бештар дар бораи ин мавзӯъ дар ин ҷо ва инҷо бихонед .

Мо JRTB-13 менависем

Мо бояд як раванди ҷойгиркунии зуд ва осонро барои замимаи мо ба server таъсис диҳем. Яъне барои мошине, ки 24/7 кор мекунад. Биёед Докерро ҳамчун асос гирем. Аммо дар рӯйхати мо ягон вазифае нест, ки барои илова кардани ин функсия масъул бошад. Ҳангоми эҷоди он чӣ гуна ман онро пазмон шудам. Мушкил нест, мо ҳоло онро эҷод мекунем. Мо ба ҷадвали эҷоди масъала дар GitHub меравем ва дархости хусусиятро интихоб мекунем: "Лоиҳаи Java аз A то Я": Амалисозии ҷобаҷогузории барномаҳо - 5Тавсифи вазифа, меъёрҳои қабули онро илова кунед, ба кадом лоиҳа тааллуқ доштани ин масъаларо таъин кунед ва шумо метавонед як шумораи нав эҷод кунед: "Лоиҳаи Java аз A то Я": Амалисозии ҷобаҷогузории барномаҳо - 6Акнун, барои нишон додани он, ки вазифа иҷро шудааст барои кор қабул карда шудааст, ҳолати супоришро аз Иҷро дар идома дорад: "Лоиҳаи Java аз A то Я": Амалисозии ҷобаҷогузории барномаҳо - 7Ин мақолаи душвор хоҳад буд. Агар шумо ягон мушкилот дошта бошед, дар шарҳҳо нависед: Ман то ҳадди имкон ба онҳо назорат мекунам ва ҷавоб медиҳам. Ин як дастгирии хурди муштариён хоҳад буд: D

Эҷоди файли Docker

Файли докер чист? Барои Docker, ин скрипт (дастурҳои қадам ба қадам) дар бораи чӣ гуна сохтани тасвир барои контейнери Docker мебошад. Барои он ки замимаи мо кор кунад, ба мо JDK, versionи 11 лозим аст. Яъне, мо бояд тасвири докери JDK 11-ро пайдо кунем ва онро ба тасвири худ илова кунем. Ин як чизест, ки чӣ гуна мо вобастагӣ ба хотира илова мекунем. Барои ин Docker DockerHub дорад . Барои зеркашии тасвирҳо ба таври маҳаллӣ, шумо бояд дар он ҷо сабти ном кунед. Пас аз бақайдгирӣ, биёед JDK11-ро ҷустуҷӯ кунем. Аз он чизе ки ман ёфтам, ин контейнер аст: acceptopenjdk/openjdk11 . Тавсифи ин контейнер дорои он чизест, ки барои файли докер лозим аст:
FROM adoptopenjdk/openjdk11:ubi
RUN mkdir /opt/app
COPY japp.jar /opt/app
CMD ["java", "-jar", "/opt/app/japp.jar"]
Биёед папкаеро ислоҳ кунем, ки аз он файли jar-ро мегирем. Мо онро дар папкаи мақсаднок пас аз иҷро кардани вазифаи maven бастаи mvn дорем. Пеш аз иҷрои ҳамаи ин, дар асоси шохаи асосии навшуда, мо барои вазифаи худ як нав эҷод мекунем: STEP_4_JRTB-13 . Акнун шумо метавонед кор кунед. Дар решаи лоиҳа, файлеро бидуни васеъшавии Dockerfile эҷод кунед ва дар дохor он зеринро илова кунед:
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Сатри аввал ин аст, ки тасвир ба он чизе асос меёбад - acceptopenjdk/openjdk11. Сатри дуюм барои илова кардани аргумент ба тасвир бо номи JAR_FILE, ки дар ҷузвдони мақсаднок ҷойгир аст. Ғайр аз он, папкаи ҷорӣ аз рӯи ҷойгиршавии Dockerfile муайян карда мешавад. Сатри сеюм - зарфи лоиҳаи моро ба тасвири докер нусхабардорӣ кунед. Сатри охирин аслан массиверо дар бар мегирад, ки аз фармони терминал сохта шудааст, ки бо фосила ҷудо карда шудааст. Яъне, дар охир инҳо иҷро мешаванд: “java -jar /app.jar” Барои махфӣ нигоҳ доштани аломати бот, ҳангоми оғоз кардани контейнер ба мо лозим меояд, ки ду тағирёбанда - номи бот ва аломати онро гузаронем. Барои ин, мо дархостеро менависем, ки бояд лоиҳаи моро бо тағирёбандаҳо оғоз кунад. Ва чӣ тавр бояд кард? Шумо бояд онро Google кунед: дар ин ҷо истиноди аввал бо тавсифи муқаррарӣ аст. Мо чӣ кор кардан мехоҳем? Мо дар файли application.properties ду тағирёбанда дорем, ки дар он ҷо муайян мекунем:
  • bot.username
  • bot.token
Ман мехоҳам як контейнери докерро идора кунам ва ҳар дафъа арзиши худро дар он ҷо гузаронам, то касе ин арзишҳоро набинад. Ман медонам, ки дар SpringBoot, тағирёбандаҳои муҳити зист, ки ҳангоми оғоз кардани лоиҳаи jar муқаррар карда мешаванд, аз онҳое, ки дар файли application.properties доранд, бартарӣ хоҳанд дошт. Барои интиқол додани тағирёбанда дар дархост, шумо бояд сохтори зеринро илова кунед: -D{номи тағирёбанда}=”{арзиши тағирёбанда}” . Мо қавсҳои ҷингиларо илова намекунем;) Мо дархосте мегирем, ки замимаи моро бо арзишҳои пешакӣ муайяншуда оғоз мекунад - ном ва аломати бот: java -jar -Dbot.username="test.javarush.community_bot" -Dbot. token=”dfgkdjfglkdjfglkdjfgk” *.jar Акнун мо бояд ин тағирёбандаҳоро дар дохor контейнери докер гузаронем. Ин як тағирёбандаи муҳити зист аст. Барои таъмини он, ки дар оянда базаи мо бо замимаи мо бемалол ва бе мушкилот кор кунад, мо docker-compose-ро истифода мебарем. Ин як воситаи алоҳидаест, ки дар он шумо метавонед кор, оғозёбӣ ва вобастагии байни контейнерҳоро ташкил кунед. Ба ибораи дигар, он як замимаи болои Docker барои идоракунии контейнерҳои як инфрасохтор мебошад. Илова бар ин, пеш аз ба кор даровардани docker-compose, мо бояд боварӣ дошта бошем, ки мо ҳама тағиротҳои codeро аз server хориҷ кардаем, барномаро сохтаем ва versionи кӯҳнаро қатъ кардем. Барои ин мо скрипти bash-ро истифода мебарем. Вой... Хамааш мушкил ба назар мерасад, ман розиям. Аммо кор бо насби ҷобаҷогузории барнома ҳамеша як раванди дилгиркунанда ва мураккаб аст. Аз ин рӯ, мо нақшаи хеле хуб дорем:
  1. Биёед скрипти bash -ро иҷро кунем.
  2. Скрипти bash docker-compose -ро иҷро мекунад.
  3. Docker-compose як контейнери докерро бо замимаи мо оғоз мекунад.
  4. Контейнери Docker замимаи моро иҷро мекунад.
Ва акнун мо бояд боварӣ ҳосил кунем, ки ду тағирёбанда - номи бот ва аломати он - аз нуқтаи 1 ба нуқтаи 4 мегузаранд. Ва то ин ки ин ду тағирёбанда ҳангоми оғоз кардани замимаи java мо истифода шаванд. Биёед аз охир ба аввал меравем. Мо аллакай медонем, ки барои оғоз кардани jarnik кадом фармонро иҷро кардан лозим аст. Аз ин рӯ, мо Dockerfile-ро тавре танзим мекунем, ки он қабули ду тағирёбандаро ёд гирад ва онҳоро ба дархост интиқол диҳад. Барои ин, биёед файли Docker-ро ба шакли зерин кам кунем:
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}", "-jar", "/app.jar"]
Шумо мебинед, ки мо ду сатр илова кардем ва ENTRYPOINT-ро нав кардем. Хатҳо:
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
тағирёбандаҳоро дар дохor файли рамзгузор эълон кунед. Бо нобаёнӣ онҳо арзиши муайян доранд. Агар ҳангоми сохтани тасвир аз ин файли докер, тағирёбандаҳои муҳити зист бо чунин номҳо интиқол дода шаванд, арзишҳо гуногун хоҳанд буд. Ва дар ENTRYPOINT мо чанд унсури дигарро илова кардем, ки ин тағирёбандаҳои муҳити зистро мехонанд:
"-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}"
Дар ин ҷо шумо мебинед, ки дар дохor сатр бо истифода аз сохтори ${}, арзишҳои BOT_NAME ва BOT_TOKEN гузаронида мешаванд. Минбаъд, мо бояд омӯзем, ки чӣ гуна қабул ва интиқол додани ин тағирёбандаҳо ба docker-compose.

docker-compose.yml эҷод кунед

Хуб мебуд, ки шумо дар бораи формати YAML алоҳида хонед, вагарна мақола аллакай бо ҷаҳиш ва ҳудуд афзоиш меёбад. Барои мо, ин танҳо тавсифи дигари тағирёбандаҳои навъи .properties аст. Танҳо дар хосиятҳо он тавассути нуқта навишта мешавад, аммо дар YAML ин каме зеботар иҷро карда мешавад. Масалан, хамин тавр. Ду тағирёбанда дар .properties: javarush.telegram.bot.name=ivan javarush.telegram.bot.token=pupkin Аммо дар .yaml (ҳамон .yml) он чунин хоҳад буд:
javarush:
	telegram:
		bot:
		  name: ivan
		  token: pupkin
Варианти дуюм зеботар ва фаҳмотар аст. Ҷойҳо бояд маҳз ҳамон тавре ки дар боло нишон дода шудаанд, бошанд. Биёед, application.properties ва application.yml-и худро бо кадом роҳ тарҷума кунем. Аввал шумо бояд онро эҷод кунед. Дар решаи лоиҳа, файли docker-compose.yml эҷод кунед ва дар он ҷо зеринро нависед:
version: '3.1'

services:
 jrtb:
   build:
     context: .
   environment:
     - BOT_NAME=${BOT_NAME}
     - BOT_TOKEN=${BOT_TOKEN}
   restart: always
Сатри аввал versionи docker-compose мебошад. хидматҳо: мегӯяд, ки ҳамаи сатрҳои зерин пас аз ин (кӯчонида мешаванд) ба хидматҳое, ки мо танзим карда истодаем, ишора мекунанд. Мо то ҳол танҳо яке аз инҳоро дорем - барномаи java бо номи jrtb . Ва аллакай дар зери он тамоми танзимоти он хоҳад буд. Масалан, сохтани: контекст: . мегӯяд, ки мо Dockerfile-ро дар ҳамон феҳристи docker-compose.yml ҷустуҷӯ хоҳем кард. Аммо бахш : Муҳити зист масъул хоҳад буд, ки мо тағирёбандаҳои муҳити заруриро ба Dockerfile интиқол диҳем. Танҳо он чизе ки ба мо лозим аст. Аз ин рӯ, мо тағирёбандаҳоро дар зер мегузорем. Docker-compose онҳоро дар тағирёбандаҳои муҳити кории server ҷустуҷӯ мекунад. Биёед онҳоро ба скрипти bash илова кунем.

Эҷоди скриптҳои bash

Қадами охирин эҷоди скрипти bash аст. Дар решаи лоиҳа файле бо номи start.sh эҷод кунед ва дар он ҷо зеринро нависед:
#!/bin/bash

# Pull new changes
git pull

# Prepare Jar
mvn clean
mvn package

# Ensure, that docker-compose stopped
docker-compose stop

# Add environment variables
export BOT_NAME=$1
export BOT_TOKEN=$2

# Start new deployment
docker-compose up --build -d
Сатри аввал барои ҳама скриптҳои bash лозим аст: он бе он кор намекунад. Ва он гоҳ - танҳо маҷмӯи фармонҳо дар терминал, ки бояд иҷро карда шаванд. Ман дар ҳар як фармон шарҳҳо илова кардам, то он бояд равшан бошад. Ягона чизе, ки ман мехоҳам шарҳ диҳам, ин аст, ки $1 ва $2 чӣ маъно дорад. Ин ду тағирёбанда мебошанд, ки ҳангоми ба кор андохтани скрипти bash интиқол дода мешаванд. Бо истифода аз фармони содирот, онҳо ба тағирёбандаҳои server илова карда мешаванд ва дар docker-compose хонда мешаванд. Ин барои Ubuntu кор мекунад, эҳтимол барои Windows нест, аммо ман боварӣ надорам. Акнун шумо бояд скрипти stop.sh -ро илова кунед, ки корро қатъ мекунад. Он дорои якчанд сатрҳо хоҳад буд:
#!/bin/bash

# Ensure, that docker-compose stopped
docker-compose stop

# Ensure, that the old application won't be deployed again.
mvn clean
Дар ин ҷо мо docker-compose-ро қатъ мекунем ва лоиҳаи jarnik-ро, ки аз замони охирин сохта шуда буд, тоза мекунем. Мо инро барои он мекунем, ки лоиҳаи мо дақиқ аз нав сохта шавад. Пешгӯиҳо буданд, бинобар ин ман илова мекунам) Дар натиҷа, мо бо 4 файли нав ба даст меорем:
  • Dockerfile - файл барои эҷоди тасвири замимаи мо;
  • docker-compose.yml - файл бо танзимот дар бораи чӣ гуна мо контейнерҳои худро оғоз мекунем;
  • start.sh - скрипти bash барои ҷойгиркунии замимаи мо;
  • stop.sh скрипти bash аст, ки барномаи моро қатъ мекунад.
Мо инчунин versionи замимаи худро аз 0.2.0-SNAPSHOT ба 0.3.0-SNAPSHOT навсозӣ мекунем. Биёед тавсифи versionи навро ба RELEASE_NOTES илова кунем ва он чизеро, ки дар он ҷо буд, каме ислоҳ кунем:
# Эзоҳҳои нашр ## 0.3.0-SNAPSHOT * JRTB-13: раванди густариши иловашуда ба лоиҳа ## 0.2.0-SNAPSHOT * JRTB-3: Намунаи фармон барои коркарди фармонҳои Telegram Bot ## 0.1.0-SNAPSHOT * JRTB -2: боти телеграммаи ноустувор илова карда шуд * JRTB-0: иловашуда лоиҳаи скелети SpringBoot
Ва дар README мо як параграфи наверо илова мекунем, ки чӣ тавр ҷойгир кардани замимаи моро тавсиф мекунад:
## Ҷойгиркунӣ Раванди ҷобаҷогузорӣ то ҳадди имкон осон: Нармафзори зарурӣ: - терминал барои иҷро кардани скриптҳои bash - docker - docker-compose барои ҷойгиркунии барнома, гузариш ба фorали лозимӣ ва иҷро кардани скрипти bash: $ bash start.sh ${bot_username} ${bot_token } Ҳамааш ҳамин.
Албатта, ҳама чиз бо забони англисӣ навишта шудааст. Одатан, дар фorали навтаъсиси мо STEP_4_JRTB-13 мо ӯҳдадории навро бо ном эҷод мекунем: JRTB-13: раванди густаришро тавассути docker амалӣ кунед ва онро пахш кунед. Ман ба таври муфассал дар бораи чизҳое, ки дар мақолаҳои қаблӣ тавсиф карда будам, бас мекунам. Ман барои такрор кардани ҳамон чизе намебинам. Ба гайр аз ин, онхое, ки ин корро худашон фахмида, ба чо овардаанд, ягон саволе нахохад дошт. Ин ман дар бораи чӣ гуна эҷод кардани фorали нав, чӣ гуна эҷод кардани ӯҳдадорӣ, чӣ гуна ба анбор тела додан лозим аст.

Хатти поён

Имрӯз ман як тонна маълумоти навро нишон додам, ки бояд бодиққат баррасӣ ва бо хониши иловагӣ васеъ карда шаванд. Муҳимтар аз ҳама: бо ёрии фармони ЯК (!!!) ҳама чизи зарурӣ барои ҷойгиркунии замимаи мо анҷом дода мешавад. Ин хеле аҷиб аст, ки ман ҳатто ба шумо гуфта наметавонам. Бале, ба ман лозим омад, ки дар ҳуҷҷатҳои Docker вақти муносиб сарф кунам, то бифаҳмам, ки чӣ гуна тағирёбандаҳоро дуруст интиқол додан мумкин аст. Минбаъд боти телеграмма ҳамеша дар versionи охирини фorали асосӣ кор хоҳад кард . Истинод ба bot telegram. Имрӯз ҳеҷ гуна истинод ба маводҳое нахоҳад буд, ки хондан хуб аст: масъулият ба дӯши шумост. Шумо бояд ҷустуҷӯи маълумотро ёд гиред. Ҳар касе, ки ба канали телеграми ман обуна шудааст, қариб дарҳол дар бораи ҷойгиркунии бот огоҳ шуд. Дӯстон, лоиҳа ба шумо маъқул аст? Ба ӯ ситора деҳ ! Бо ин роҳ он маъмултар мешавад ва шумораи бештари одамон метавонанд дар бораи он маълумот гиранд ва аз он ибрат гиранд. Мисли маъмул, ман пешниҳод мекунам, ки дар GitHub сабти ном шавам ва ба ҳисоби худ пайравӣ кунам , то ин силсила ва дигар лоиҳаҳои худро, ки дар он ҷо кор мекунам, пайгирӣ кунам. Ҳоло мо омодаем, ки пойгоҳи додаҳоро пайваст кунем. Мақолаи навбатӣ дарозтар хоҳад буд ва дар он мо ҳама чизро барои кор бо базаи маълумот анҷом медиҳем. Ҳама тавсифҳо дар JRTB-1 мебошанд .

Рӯйхати ҳамаи маводҳои силсила дар аввали ин мақола аст.

Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION