CI/CD දාමයක් නිර්මාණය කිරීම සහ ඩොකර් සමඟ වැඩ ස්වයංක්‍රීය කිරීම

මම මගේ මුල්ම වෙබ් අඩවි ලිව්වේ 90 දශකයේ අගභාගයේදී. එකල ඒවා වැඩ පිළිවෙලට තැබීම ඉතා පහසු විය. සමහර හවුල් සත්කාරකත්වයේ Apache සේවාදායකයක් තිබුණි, ඔබට මෙවැනි දෙයක් ලිවීමෙන් FTP හරහා මෙම සේවාදායකයට ලොග් විය හැකිය. ftp://ftp.example.com. එවිට ඔබට ඔබගේ නම සහ මුරපදය ඇතුළත් කර සේවාදායකයට ගොනු උඩුගත කිරීමට සිදු විය. විවිධ කාලවල් තිබුණා, එදාට වඩා හැම දෙයක්ම සරලයි.

CI/CD දාමයක් නිර්මාණය කිරීම සහ ඩොකර් සමඟ වැඩ ස්වයංක්‍රීය කිරීම

එතැන් සිට ගත වූ දශක දෙක තුළ සියල්ල බොහෝ වෙනස් වී ඇත. වෙබ් අඩවි වඩාත් සංකීර්ණ වී ඇත; ඒවා නිෂ්පාදනයට මුදා හැරීමට පෙර එකලස් කළ යුතුය. එක් තනි සේවාදායකයක් load balancers පිටුපසින් ධාවනය වන බොහෝ සේවාදායකයන් බවට පත් වූ අතර අනුවාද පාලන පද්ධති භාවිතය සාමාන්‍ය දෙයක් බවට පත් විය.

මගේ පුද්ගලික ව්‍යාපෘතිය සඳහා මට විශේෂ වින්‍යාසයක් තිබුණි. එක් ක්‍රියාවක් පමණක් සිදු කිරීමෙන් නිෂ්පාදනයේ වෙබ් අඩවිය යෙදවීමේ හැකියාව මට අවශ්‍ය බව මම දැන සිටියෙමි: ශාඛාවකට කේතය ලිවීම master GitHub මත. ඊට අමතරව, මගේ කුඩා වෙබ් යෙදුමේ ක්‍රියාකාරිත්වය සහතික කිරීම සඳහා, මට විශාල Kubernetes පොකුරක් කළමනාකරණය කිරීමට හෝ Docker Swarm තාක්ෂණය භාවිතා කිරීමට හෝ Pods, නියෝජිතයන් සහ වෙනත් සියලු වර්ගවල සේවාදායක සමූහයක් පවත්වා ගැනීමට අවශ්‍ය නොවූ බව මම දැන සිටියෙමි. සංකීර්ණතා. කාර්යය හැකිතාක් පහසු කිරීමේ ඉලක්කය සපුරා ගැනීම සඳහා, මට CI/CD හුරුපුරුදු වීමට අවශ්‍ය විය.

ඔබට කුඩා ව්‍යාපෘතියක් තිබේ නම් (මෙම අවස්ථාවේදී, Node.js ව්‍යාපෘතියක්) සහ මෙම ව්‍යාපෘතියේ යෙදවීම ස්වයංක්‍රීය කරන්නේ කෙසේදැයි දැන ගැනීමට ඔබ කැමති නම්, ගබඩාවේ ගබඩා කර ඇති දේ නිෂ්පාදනයේ ක්‍රියා කරන දෙයට හරියටම ගැලපෙන බව සහතික කරන අතරම, මම ඔබ මෙම ලිපිය ගැන උනන්දු විය හැකි යැයි සිතන්න.

පූර්වාවශ්යතාවයන්

මෙම ලිපිය කියවන්නාට විධාන රේඛාව සහ Bash ස්ක්‍රිප්ට් ලිවීම පිළිබඳ මූලික අවබෝධයක් ලැබෙනු ඇතැයි අපේක්ෂා කෙරේ. ඊට අමතරව, ඔහුට ගිණුම් අවශ්ය වනු ඇත ට්‍රැවිස් සීඅයි и ඩෝකර් හබ්.

අරමුණු

මෙම ලිපිය කොන්දේසි විරහිතව "නිබන්ධනයක්" ලෙස හැඳින්විය හැකි බව මම නොකියමි. මෙය මා ඉගෙන ගත් දේ ගැන කතා කරන ලේඛනයක් වන අතර එක් ස්වයංක්‍රීය අවසරයකින් සිදු කරන ලද කේත පරීක්ෂා කිරීමට සහ නිෂ්පාදනයට යෙදවීමට මට ගැළපෙන ක්‍රියාවලිය විස්තර කරයි.

මගේ වැඩ ප්‍රවාහය අවසන් වූයේ මෙයයි.

හැර ඕනෑම ගබඩා ශාඛාවකට තැපැල් කරන ලද කේතය සඳහා master, පහත ක්‍රියා සිදු කරනු ලැබේ:

  • ට්‍රැවිස් සීඅයි හි ව්‍යාපෘතිය ගොඩනැගීම ආරම්භ වේ.
  • සියලුම ඒකක, ඒකාබද්ධ කිරීම සහ අන්තයේ සිට අවසානය දක්වා පරීක්ෂණ සිදු කරනු ලැබේ.

වැටෙන කේතය සඳහා පමණි master, පහත සඳහන් දේ සිදු කරනු ලැබේ:

  • ඉහත සඳහන් කළ සියල්ල, ඊට අමතරව ...
  • වත්මන් කේතය, සැකසුම් සහ පරිසරය මත පදනම්ව Docker රූපයක් ගොඩනැගීම.
  • රූපය Docker Hub වෙත යෙදවීම.
  • නිෂ්පාදන සේවාදායකයට සම්බන්ධ වීම.
  • Docker Hub වෙතින් සේවාදායකය වෙත රූපයක් උඩුගත කිරීම.
  • වත්මන් කන්ටේනරය නවතා නව රූපය මත පදනම්ව නව එකක් ආරම්භ කිරීම.

ඔබ ඩොකර්, පින්තූර සහ බහාලුම් ගැන සම්පූර්ණයෙන්ම කිසිවක් නොදන්නේ නම්, කරදර නොවන්න. මම ඔබට ඒ සියල්ල ගැන කියන්නම්.

CI/CD යනු කුමක්ද?

CI/CD යන කෙටි යෙදුම "අඛණ්ඩ ඒකාබද්ධ කිරීම/අඛණ්ඩ යෙදවීම" යන්නයි.

▍අඛණ්ඩ ඒකාබද්ධතාවය

අඛණ්ඩ අනුකලනය යනු ව්‍යාපෘතියේ ප්‍රධාන මූල කේත ගබඩාව (සාමාන්‍යයෙන් ශාඛාවක්) සඳහා සංවර්ධකයින් කැපවන ක්‍රියාවලියකි. master) ඒ අතරම, කේතයේ ගුණාත්මකභාවය ස්වයංක්‍රීය පරීක්ෂණ මගින් සහතික කෙරේ.

▍අඛණ්ඩ යෙදවීම

අඛණ්ඩ යෙදවීම යනු නිෂ්පාදනයට කේතය නිතර නිතර, ස්වයංක්‍රීයව යෙදවීමයි. CI/CD සංක්ෂිප්තයේ දෙවන කොටස සමහර විට "අඛණ්ඩ බෙදාහැරීම" ලෙස ලියා ඇත. මෙය මූලික වශයෙන් "අඛණ්ඩ යෙදවීම" හා සමාන වේ, නමුත් "අඛණ්ඩ බෙදාහැරීම" යන්නෙන් අදහස් කරන්නේ ව්‍යාපෘති යෙදවීමේ ක්‍රියාවලිය ආරම්භ කිරීමට පෙර වෙනස්කම් අතින් තහවුරු කිරීමේ අවශ්‍යතාවයයි.

ආරම්භ කිරීම

මම මේ ඔක්කොම ඉගෙන ගන්න පාවිච්චි කරපු ඇප් එකට කියන්නේ TakeNote. මෙය සටහන් කර ගැනීම සඳහා නිර්මාණය කර ඇති, මම වැඩ කරමින් සිටින වෙබ් ව්‍යාපෘතියකි. මුලදී මම කරන්න උත්සාහ කළා JAMStack-ප්‍රොජෙක්ට්, හෝ සර්වරයක් නොමැති ඉදිරිපස යෙදුමක්, එය පිරිනමන සම්මත සත්කාරක සහ ව්‍යාපෘති යෙදවීමේ හැකියාවන්ගෙන් ප්‍රයෝජන ගැනීම සඳහා නෙට්ලිෆයි. යෙදුමේ සංකීර්ණත්වය වර්ධනය වූ විට, මට එහි සේවාදායක කොටස නිර්මාණය කිරීමට අවශ්‍ය විය, එයින් අදහස් කළේ ව්‍යාපෘතිය ස්වයංක්‍රීයව ඒකාබද්ධ කිරීම සහ ස්වයංක්‍රීයව යෙදවීම සඳහා මගේම උපාය මාර්ගයක් සැකසීමට මට අවශ්‍ය වනු ඇති බවයි.

මගේ නඩුවේදී, යෙදුම Node.js පරිසරය තුළ ක්‍රියාත්මක වන එක්ස්ප්‍රස් සේවාදායකයකි, තනි පිටු ප්‍රතික්‍රියා යෙදුමක් සේවය කරන අතර ආරක්ෂිත සේවාදායක පැත්තේ API සඳහා සහය දක්වයි. මෙම ගෘහ නිර්මාණ ශිල්පය සොයා ගත හැකි උපාය මාර්ගය අනුගමනය කරයි ලබා දී ඇත සම්පූර්ණ තොග සත්‍යාපන මාර්ගෝපදේශය.

මම සමඟ සාකච්ඡා කළා මිතුරා, ස්වයංක්‍රීයකරණය පිළිබඳ විශේෂඥයෙක් වන අතර, මට අවශ්‍ය ආකාරයට සියල්ල ක්‍රියාත්මක කිරීමට මා කුමක් කළ යුතු දැයි ඔහුගෙන් ඇසුවා. මෙම ලිපියේ ඉලක්ක කොටසේ දක්වා ඇති ස්වයංක්‍රීය කාර්ය ප්‍රවාහයක් කෙබඳු විය යුතුද යන්න පිළිබඳ අදහස ඔහු මට ලබා දුන්නේය. මෙම ඉලක්ක තිබීමෙන් අදහස් වූයේ මට ඩොකර් භාවිතා කරන්නේ කෙසේදැයි සොයා ගැනීමට අවශ්‍ය වූ බවයි.

Docker

Docker යනු බහාලුම් තාක්‍ෂණයට ස්තූතිවන්ත වන මෙවලමක් වන අතර, Docker වේදිකාව විවිධ පරිසරවල ක්‍රියාත්මක වුවද, යෙදුම් පහසුවෙන් බෙදා හැරීමට, යෙදවීමට සහ එකම පරිසරයක ධාවනය කිරීමට ඉඩ සලසයි. පළමුව, මට ඩොකර් විධාන රේඛා මෙවලම් (CLI) මත මගේ දෑත් ලබා ගැනීමට අවශ්‍ය විය. උපදෙස් ඩොකර් ස්ථාපන මාර්ගෝපදේශය ඉතා පැහැදිලි සහ තේරුම්ගත හැකි ලෙස හැඳින්විය නොහැක, නමුත් එයින් ඔබට පළමු ස්ථාපන පියවර ගැනීමට නම්, ඔබ ඩොකර් ඩෙස්ක්ටොප් (මැක් හෝ වින්ඩෝස් සඳහා) බාගත කළ යුතු බව ඉගෙන ගත හැකිය.

Docker Hub යනු දළ වශයෙන් එකම දෙයකි GitHub git repositories හෝ registry සඳහා npm JavaScript පැකේජ සඳහා. මෙය ඩොකර් පින්තූර සඳහා සබැඳි ගබඩාවකි. Docker Desktop සම්බන්ධ වන්නේ මෙයයි.

එබැවින්, ඩොකර් සමඟ ආරම්භ කිරීම සඳහා, ඔබ දේවල් දෙකක් කළ යුතුය:

මෙයින් පසු, Docker අනුවාදය පරීක්ෂා කිරීමට පහත විධානය ක්‍රියාත්මක කිරීමෙන් ඔබට Docker CLI ක්‍රියා කරන්නේ දැයි පරීක්ෂා කළ හැකිය:

docker -v

ඊළඟට, අසන විට ඔබගේ පරිශීලක නාමය සහ මුරපදය ඇතුළත් කිරීමෙන් ඩොකර් හබ් වෙත ලොග් වන්න:

docker login

Docker භාවිතා කිරීමට, ඔබ රූප සහ බහාලුම්වල සංකල්ප තේරුම් ගත යුතුය.

▍රූප

රූපයක් යනු කන්ටේනරය එකලස් කිරීම සඳහා උපදෙස් අඩංගු සැලැස්මක් වැනි දෙයකි. මෙය යෙදුමේ ගොනු පද්ධතියේ සහ සැකසුම්වල වෙනස් කළ නොහැකි ඡායාරූපයකි. සංවර්ධකයින්ට පහසුවෙන් පින්තූර බෙදා ගත හැකිය.

# Вывод сведений обо всех образах
docker images

මෙම විධානය පහත ශීර්ෂය සහිත වගුවක් ප්‍රතිදානය කරයි:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

ඊළඟට අපි එකම ආකෘතියේ විධාන සඳහා උදාහරණ කිහිපයක් බලමු - පළමුව අදහස් දැක්වීමක් සහිත විධානයක් ඇත, පසුව එය ප්රතිදානය කළ හැකි දේ පිළිබඳ උදාහරණයක්.

▍කන්ටේනර්

බහාලුමක් යනු යෙදුමක් ක්‍රියාත්මක කිරීමට අවශ්‍ය සියල්ල අඩංගු ක්‍රියාත්මක කළ හැකි පැකේජයකි. මෙම ප්‍රවේශය සහිත යෙදුමක් යටිතල පහසුකම් නොසලකා සෑම විටම එකම ලෙස ක්‍රියා කරයි: හුදකලා පරිසරයක සහ එකම පරිසරයක. කාරණය වන්නේ එකම රූපයේ අවස්ථා විවිධ පරිසරයන් තුළ දියත් කිරීමයි.

# Перечисление всех контейнеров
docker ps -a
CONTAINER ID     IMAGE     COMMAND     CREATED     STATUS     PORTS     NAMES
---

▍ටැග්

ටැග් එකක් යනු රූපයක නිශ්චිත අනුවාදයක ඇඟවීමකි.

▍Docker විධාන සඳහා ඉක්මන් සඳහනක්

සාමාන්‍යයෙන් භාවිතා කරන Docker විධාන කිහිපයක් පිළිබඳ දළ විශ්ලේෂණයක් මෙන්න.

කණ්ඩායම

සන්දර්භය

ක්රියාත්මක

docker ගොඩනැගීම

රූපය

Dockerfile එකකින් රූපයක් ගොඩනැගීම

ඩොකර් ටැගය

රූපය

පින්තූර ටැග් කිරීම

ඩොකර් රූප

රූපය

පින්තූර ලැයිස්තුගත කිරීම

ඩොකර් ධාවනය

කන්ටේනර්

රූපයක් මත පදනම්ව කන්ටේනරයක් ධාවනය කිරීම

ඩොකර් තල්ලුව

රූපය

රෙජිස්ට්රි වෙත පින්තූරයක් උඩුගත කිරීම

docker අදින්න

රූපය

රෙජිස්ට්‍රියෙන් රූපයක් පූරණය කරමින්

ඩොක්ටර් PS

කන්ටේනර්

බහාලුම් ලැයිස්තුගත කිරීම

ඩොකර් පද්ධතිය කප්පාදු කිරීම

රූපය/කන්ටේනරය

භාවිතයට නොගත් බහාලුම් සහ පින්තූර ඉවත් කිරීම

▍Dockerfile

නිෂ්පාදන යෙදුමක් දේශීයව ධාවනය කරන්නේ කෙසේදැයි මම දනිමි. සූදානම් කළ ප්‍රතික්‍රියා යෙදුමක් තැනීමට නිර්මාණය කර ඇති Webpack වින්‍යාසයක් මා සතුව ඇත. මීළඟට, වරාය මත Node.js පදනම් කරගත් සේවාදායකයක් ආරම්භ කරන විධානයක් මා සතුව ඇත 5000. එය මෙසේ පෙනේ:

npm i         # установка зависимостей
npm run build # сборка React-приложения
npm run start # запуск Node-сервера

මෙම ද්රව්ය සඳහා උදාහරණ යෙදුමක් මා සතුව නොමැති බව සැලකිල්ලට ගත යුතුය. නමුත් මෙහිදී, අත්හදා බැලීම් සඳහා, ඕනෑම සරල Node යෙදුමක් සිදු කරනු ඇත.

කන්ටේනරය භාවිතා කිරීම සඳහා, ඔබ ඩොකර් වෙත උපදෙස් ලබා දිය යුතුය. කියන file එක හරහා තමයි මේක කරන්නේ Dockerfile, ව්යාපෘතියේ මූල නාමාවලියෙහි පිහිටා ඇත. මෙම ගොනුව, මුලදී, තරමක් තේරුම්ගත නොහැකි බව පෙනේ.

නමුත් එහි අඩංගු දේ විස්තර කරන්නේ විශේෂ විධානයන් සමඟ වැඩ කරන පරිසරයක් සැකසීමට සමාන දෙයක් පමණි. මෙන්න මෙම විධාන සමහරක්:

  • සිට — මෙම විධානය ගොනුවක් ආරම්භ කරයි. එය කන්ටේනරය ගොඩනගා ඇති මූලික රූපය සඳහන් කරයි.
  • COPY - දේශීය මූලාශ්‍රයකින් බහාලුමකට ගොනු පිටපත් කිරීම.
  • WORKDIR - පහත දැක්වෙන විධානයන් සඳහා වැඩ කරන නාමාවලිය සැකසීම.
  • RUN - විධාන ක්රියාත්මක කරන්න.
  • හෙළිදරව් කරන්න - වරාය සැකසුම්.
  • ඇතුල්වීමේ ස්ථානය - ක්රියාත්මක කළ යුතු විධානය පිළිබඳ ඇඟවීම.

Dockerfile මේ වගේ දෙයක් පෙනෙන්න පුළුවන්:

# Загрузить базовый образ
FROM node:12-alpine

# Скопировать файлы из текущей директории в директорию app/
COPY . app/

# Использовать app/ в роли рабочей директории
WORKDIR app/

# Установить зависимости (команда npm ci похожа npm i, но используется для автоматизированных сборок)
RUN npm ci --only-production

# Собрать клиентское React-приложение для продакшна
RUN npm run build

# Прослушивать указанный порт
EXPOSE 5000

# Запустить Node-сервер
ENTRYPOINT npm run start

ඔබ තෝරා ගන්නා මූලික රූපය අනුව, ඔබට අමතර පරායත්තතා ස්ථාපනය කිරීමට අවශ්‍ය විය හැක. කාරණය වන්නේ සමහර මූලික රූප (Node Alpine Linux වැනි) හැකිතාක් සංයුක්ත කිරීමේ අරමුණින් නිර්මාණය කර ඇති බවයි. ප්රතිඵලයක් වශයෙන්, ඔබ අපේක්ෂා කරන සමහර වැඩසටහන් ඔවුන් සතුව නොතිබිය හැකිය.

▍කන්ටේනරය තැනීම, ටැග් කිරීම සහ ධාවනය කිරීම

ප්‍රාදේශීය එකලස් කිරීම සහ කන්ටේනරය දියත් කිරීම අප සතුව ඇති පසුවය Dockerfile, කාර්යයන් තරමක් සරල ය. ඔබ රූපය Docker Hub වෙත තල්ලු කිරීමට පෙර, ඔබ එය දේශීයව පරීක්ෂා කළ යුතුය.

▍එකලස් කිරීම

මුලින්ම ඔබ එකතු කළ යුතුයි රූපයක්, නමක් සඳහන් කිරීම සහ, විකල්පයක් ලෙස, ටැගයක් (ටැගයක් නියම කර නොමැති නම්, පද්ධතිය ස්වයංක්‍රීයව රූපයට ටැගයක් පවරයි latest).

# Сборка образа
docker build -t <image>:<tag> .

මෙම විධානය ක්‍රියාත්මක කිරීමෙන් පසු, ඔබට ඩොකර් රූපය ගොඩනැගීම නැරඹිය හැකිය.

Sending build context to Docker daemon   2.88MB
Step 1/9 : FROM node:12-alpine
 ---> ...выполнение этапов сборки...
Successfully built 123456789123
Successfully tagged <image>:<tag>

ගොඩනැගීමට මිනිත්තු කිහිපයක් ගතවනු ඇත - ඒ සියල්ල රඳා පවතින්නේ ඔබට කොපමණ පරායත්තතා තිබේද යන්න මතය. ගොඩනැගීම අවසන් වූ පසු, ඔබට විධානය ක්‍රියාත්මක කළ හැකිය docker images සහ ඔබගේ නව රූපයේ විස්තරය බලන්න.

REPOSITORY          TAG               IMAGE ID            CREATED              SIZE
<image>             latest            123456789123        About a minute ago   x.xxGB

▍ දියත් කරන්න

රූපය නිර්මාණය කර ඇත. මෙයින් අදහස් කරන්නේ ඔබට එය මත පදනම්ව කන්ටේනරයක් ධාවනය කළ හැකි බවයි. මට අවශ්‍ය නිසා කන්ටේනරයේ ක්‍රියාත්මක වන යෙදුමට ප්‍රවේශ වීමට මට අවශ්‍යයි localhost:5000, මම, යුගලයේ වම් පැත්තේ 5000:5000 ඊළඟ විධානය තුළ ස්ථාපනය කර ඇත 5000. දකුණු පැත්තේ කන්ටේනර් වරායයි.

# Запуск с использованием локального порта 5000 и порта контейнера 5000
docker run -p 5000:5000 <image>:<tag>

දැන් කන්ටේනරය නිර්මාණය කර ක්රියාත්මක වන විට, ඔබට විධානය භාවිතා කළ හැකිය docker ps මෙම කන්ටේනරය පිළිබඳ තොරතුරු බැලීමට (හෝ ඔබට විධානය භාවිතා කළ හැක docker ps -a, ධාවනය වන ඒවා පමණක් නොව සියලුම බහාලුම් පිළිබඳ තොරතුරු පෙන්වයි).

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                    NAMES
987654321234        <image>             "/bin/sh -c 'npm run…"   6 seconds ago        Up 6 seconds                0.0.0.0:5000->5000/tcp   stoic_darwin

ඔබ දැන් ලිපිනයට ගියහොත් localhost:5000 - නිෂ්පාදන පරිසරයක ක්‍රියාත්මක වන යෙදුමක පිටුවට හරියටම සමාන වන ධාවන යෙදුමක පිටුවක් ඔබට දැකිය හැකිය.

▍ටැග් කිරීම සහ ප්‍රකාශනය කිරීම

නිෂ්පාදන සේවාදායකයේ සාදන ලද එක් රූපයක් භාවිතා කිරීම සඳහා, අපට මෙම රූපය ඩොකර් හබ් වෙතින් බාගත කිරීමට හැකි විය යුතුය. මෙයින් අදහස් කරන්නේ ඔබ මුලින්ම Docker Hub හි ව්‍යාපෘතිය සඳහා ගබඩාවක් සෑදිය යුතු බවයි. මෙයින් පසු, අපට රූපය යැවීමට හැකි ස්ථානයක් ලැබෙනු ඇත. රූපයේ නම අපගේ ඩොකර් හබ් පරිශීලක නාමයෙන් ආරම්භ වන පරිදි නැවත නම් කළ යුතුය. මෙය පසුව ගබඩාවේ නම සඳහන් කළ යුතුය. නම අවසානයේ ඕනෑම ටැග් එකක් තැබිය හැක. පහත දැක්වෙන්නේ මෙම යෝජනා ක්‍රමය භාවිතා කරමින් රූප නම් කිරීම සඳහා උදාහරණයකි.

දැන් ඔබට නව නමකින් රූපය ගොඩනඟා විධානය ක්‍රියාත්මක කළ හැකිය docker push එය Docker Hub ගබඩාවට තල්ලු කිරීමට.

docker build -t <username>/<repository>:<tag> .
docker tag <username>/<repository>:<tag> <username>/<repository>:latest
docker push <username>/<repository>:<tag>

# На практике это может выглядеть, например, так:
docker build -t user/app:v1.0.0 .
docker tag user/app:v1.0.0 user/app:latest
docker push user/app:v1.0.0

සෑම දෙයක්ම හොඳින් සිදුවුවහොත්, රූපය Docker Hub මත ලබා ගත හැකි අතර පහසුවෙන් සේවාදායකයට උඩුගත කිරීමට හෝ වෙනත් සංවර්ධකයින් වෙත මාරු කළ හැකිය.

ඊළඟ පියවර

මේ වන විට අපි ඩොකර් කන්ටේනරයක ස්වරූපයෙන් යෙදුම දේශීයව ක්‍රියාත්මක වන බව සත්‍යාපනය කර ඇත. අපි කන්ටේනරය Docker Hub වෙත උඩුගත කර ඇත. මේ සියල්ලෙන් අදහස් කරන්නේ අප දැනටමත් අපගේ ඉලක්කය කරා ඉතා හොඳ ප්‍රගතියක් ලබා ඇති බවයි. දැන් අපි තවත් ප්රශ්න දෙකක් විසඳිය යුතුයි:

  • කේතය පරීක්ෂා කිරීම සහ යෙදවීම සඳහා CI මෙවලමක් සැකසීම.
  • අපගේ කේතය බාගත කර ධාවනය කළ හැකි වන පරිදි නිෂ්පාදන සේවාදායකය සැකසීම.

අපගේ නඩුවේදී, අපි භාවිතා කරමු ට්‍රැවිස් සීඅයි. සේවාදායකයක් ලෙස - ඩිටිගල් සාගරය.

මෙහිදී ඔබට වෙනත් සේවාවන් සංයෝජනයක් භාවිතා කළ හැකි බව සැලකිල්ලට ගත යුතුය. උදාහරණයක් ලෙස, Travis CI වෙනුවට, ඔබට CircleCI හෝ Github ක්‍රියා භාවිතා කළ හැක. සහ DigitalOcean වෙනුවට - AWS හෝ Linode.

අපි ට්‍රැවිස් සීඅයි සමඟ වැඩ කිරීමට තීරණය කළ අතර, මම දැනටමත් මෙම සේවාව තුළ යමක් වින්‍යාස කර ඇත. එමනිසා, දැන් මම එය වැඩ සඳහා සූදානම් කරන්නේ කෙසේද යන්න ගැන කෙටියෙන් කතා කරමි.

ට්‍රැවිස් සීඅයි

ට්‍රැවිස් සීඅයි යනු කේත පරීක්ෂා කිරීම සහ යෙදවීම සඳහා වූ මෙවලමකි. ට්‍රැවිස් සීඅයි පිහිටුවීමේ සංකීර්ණතා වෙත යාමට මම කැමති නැත, මන්ද සෑම ව්‍යාපෘතියක්ම අද්විතීය වන අතර මෙය වැඩි ප්‍රතිලාභයක් ගෙන නොයනු ඇත. නමුත් ඔබ ට්‍රැවිස් සීඅයි භාවිතා කිරීමට තීරණය කරන්නේ නම් ඔබ ආරම්භ කිරීමට මූලික කරුණු මම ආවරණය කරමි. ඔබ Travis CI, CircleCI, Jenkins, හෝ වෙනත් යමක් තෝරා ගත්තද, සෑම තැනකම සමාන වින්‍යාස ක්‍රම භාවිතා කරනු ඇත.

Travis CI සමඟ ආරම්භ කිරීමට, යන්න යෝජනා ක්රම සහ ගිණුමක් සාදන්න. ඉන්පසු ඔබේ GitHub ගිණුම සමඟ Travis CI ඒකාබද්ධ කරන්න. පද්ධතිය සැකසීමේදී, ඔබට වැඩ ස්වයංක්‍රීය කිරීමට සහ එයට ප්‍රවේශය සක්‍රීය කිරීමට අවශ්‍ය ගබඩාව සඳහන් කිරීමට අවශ්‍ය වනු ඇත. (මම GitHub භාවිතා කරමි, නමුත් Travis CI හට BitBucket, සහ GitLab සහ වෙනත් සමාන සේවාවන් සමඟ ඒකාබද්ධ විය හැකි බව මට විශ්වාසයි).

Travis CI ආරම්භ කරන සෑම අවස්ථාවකම, සේවාදායකය දියත් කරනු ලැබේ, අනුරූප ගබඩා ශාඛා යෙදවීම ඇතුළුව වින්‍යාස ගොනුවේ දක්වා ඇති විධාන ක්‍රියාත්මක කරයි.

▍රැකියා ජීවන චක්‍රය

Travis CI වින්‍යාස ගොනුව ලෙස හැඳින්වේ .travis.yml සහ ව්යාපෘති මූල නාමාවලියෙහි ගබඩා කර ඇත, සිදුවීම් පිළිබඳ සංකල්පයට සහාය වේ ජීවන චක්රය කාර්යයන්. මෙම සිදුවීම් ඒවා සිදුවන අනුපිළිවෙලට ලැයිස්තුගත කර ඇත:

  • apt addons
  • cache components
  • before_install
  • install
  • before_script
  • script
  • before_cache
  • after_success или after_failure
  • before_deploy
  • deploy
  • after_deploy
  • after_script

▍පරීක්ෂා කිරීම

වින්‍යාස ගොනුව තුළ මම දේශීය ට්‍රැවිස් සීඅයි සේවාදායකය වින්‍යාස කිරීමට යන්නෙමි. මම භාෂාව ලෙස Node 12 තෝරාගෙන පද්ධතියට කිව්වා Docker භාවිතා කිරීමට අවශ්‍ය පරායත්තතා ස්ථාපනය කරන්න.

ලැයිස්තුගත කර ඇති සියල්ල .travis.yml, වෙනත් ආකාරයකින් දක්වා නොමැති නම්, ගබඩාවේ සියලුම ශාඛා වෙත සියලු ඇදීමේ ඉල්ලීම් සිදු කරන විට ක්‍රියාත්මක වනු ඇත. මෙය ප්‍රයෝජනවත් අංගයකි, එයින් අදහස් කරන්නේ අපට ගබඩාවට එන සියලුම කේත පරීක්ෂා කළ හැකි බවයි. මෙම කේතය ශාඛාව වෙත ලිවීමට සූදානම්ද යන්න ඔබට දන්වයි. master, සහ එය ව්‍යාපෘති ගොඩනැගීමේ ක්‍රියාවලිය බිඳ දමනවාද යන්න. මෙම ගෝලීය වින්‍යාසය තුළ, මම සෑම දෙයක්ම දේශීයව ස්ථාපනය කරමි, Webpack dev සේවාදායකය පසුබිමේ ධාවනය කරමි (මෙය මගේ කාර්ය ප්‍රවාහයේ ලක්ෂණයකි) සහ පරීක්ෂණ ධාවනය කරන්න.

ඔබේ ගබඩාවට පරීක්ෂණ ආවරණය දැක්වෙන ලාංඡන පෙන්වීමට අවශ්‍ය නම්, මෙහි මෙම තොරතුරු රැස් කිරීමට සහ ප්‍රදර්ශනය කිරීමට ඔබට Jest, Travis CI සහ Coveralls භාවිතා කිරීම පිළිබඳ කෙටි උපදෙස් සොයා ගත හැක.

එබැවින් ගොනුවේ අන්තර්ගතය මෙන්න .travis.yml:

# Установить язык
language: node_js

# Установить версию Node.js
node_js:
  - '12'

services:
  # Использовать командную строку Docker
  - docker

install:
  # Установить зависимости для тестов
  - npm ci

before_script:
  # Запустить сервер и клиент для тестов
  - npm run dev &

script:
  # Запустить тесты
  - npm run test

ගබඩාවේ සියලුම ශාඛා සඳහා සහ ඇදීමේ ඉල්ලීම් සඳහා සිදු කරන ක්‍රියා අවසන් වන්නේ මෙහිදීය.

▍ යෙදවීම

සියලුම ස්වයංක්‍රීය පරීක්ෂණ සාර්ථකව නිම කරන ලද උපකල්පනය මත පදනම්ව, අපට විකල්ප වශයෙන්, නිෂ්පාදන සේවාදායකයට කේතය යෙදවිය හැකිය. අපිට මේක කරන්න ඕන ශාඛාවෙන් එන code එකට විතරක් නිසා master, අපි යෙදවුම් සැකසුම් තුළ පද්ධතියට සුදුසු උපදෙස් ලබා දෙන්නෙමු. ඔබගේ ව්‍යාපෘතියේ අපි මීළඟට බලන කේතය භාවිතා කිරීමට ඔබ උත්සාහ කිරීමට පෙර, යෙදවීම සඳහා හැඳින්වෙන සැබෑ ස්ක්‍රිප්ට් එකක් ඔබ සතුව තිබිය යුතු බවට මම ඔබට අනතුරු ඇඟවීමට කැමැත්තෙමි.

deploy:
  # Собрать Docker-контейнер и отправить его на Docker Hub
  provider: script
  script: bash deploy.sh
  on:
    branch: master

යෙදවුම් පිටපත ගැටළු දෙකක් විසඳයි:

  • CI මෙවලමක් (අපගේ නඩුවේදී, ට්‍රැවිස් සීඅයි) භාවිතයෙන් ඩොකර් හබ් වෙත රූපය සාදන්න, ටැග් කරන්න සහ යවන්න.
  • සේවාදායකය මත රූපය පූරණය කිරීම, පැරණි බහාලුම් නතර කිරීම සහ නව එකක් ආරම්භ කිරීම (අපගේ නඩුවේදී, සේවාදායකය DigitalOcean වේදිකාව මත ධාවනය වේ).

පළමුව, ඔබ රූපය ගොඩනැගීම, ටැග් කිරීම සහ ඩොකර් හබ් වෙත තල්ලු කිරීම සඳහා ස්වයංක්‍රීය ක්‍රියාවලියක් සැකසිය යුතුය. පින්තූරවලට අනන්‍ය ටැග් ලබා දීම සහ ලොගින් ස්වයංක්‍රීය කිරීම සඳහා අපට උපාය මාර්ගයක් අවශ්‍ය වීම හැර, මේ සියල්ල අප දැනටමත් අතින් සිදු කර ඇති දේට බෙහෙවින් සමාන ය. මට යෙදවීමේ ස්ක්‍රිප්ටයේ සමහර විස්තර, එනම් ටැග් කිරීමේ උපාය, පිවිසීම, SSH යතුරු කේතනය, SSH සම්බන්ධතා පිහිටුවීම වැනි ගැටළු ඇති විය. නමුත් වාසනාවකට මෙන් මගේ පෙම්වතා වෙනත් බොහෝ දේ සමඟ බැෂ් සමඟ ඉතා දක්ෂයි. ඔහු මට මේ පිටපත ලියන්න උදව් කළා.

ඉතින්, ස්ක්‍රිප්ට් එකේ මුල් කොටස තමයි රූපය ඩොකර් හබ් එකට අප්ලෝඩ් කරන එක. මෙය කිරීම තරමක් පහසුය. මා භාවිතා කළ ටැග් කිරීමේ ක්‍රමයට git හැෂ් එකක් සහ git ටැගයක් තිබේ නම් ඒවා ඒකාබද්ධ කිරීම ඇතුළත් වේ. මෙම ටැගය අද්විතීය බව සහතික කරන අතර එය පදනම් වූ එකලස් කිරීම හඳුනා ගැනීම පහසු කරයි. DOCKER_USERNAME и DOCKER_PASSWORD ට්‍රැවිස් සීඅයි අතුරුමුහුණත භාවිතයෙන් සැකසිය හැකි පරිශීලක පරිසර විචල්‍ය වේ. ට්‍රැවිස් සීඅයි සංවේදී දත්ත වැරදි අතට නොවැටෙන පරිදි ස්වයංක්‍රීයව සකසනු ඇත.

මෙන්න පිටපතේ පළමු කොටස deploy.sh.

#!/bin/sh
set -e # Остановить скрипт при наличии ошибок

IMAGE="<username>/<repository>"                             # Образ Docker
GIT_VERSION=$(git describe --always --abbrev --tags --long) # Git-хэш и теги

# Сборка и тегирование образа
docker build -t ${IMAGE}:${GIT_VERSION} .
docker tag ${IMAGE}:${GIT_VERSION} ${IMAGE}:latest

# Вход в Docker Hub и выгрузка образа
echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
docker push ${IMAGE}:${GIT_VERSION}

ස්ක්‍රිප්ටයේ දෙවන කොටස කුමක් වේද යන්න සම්පූර්ණයෙන්ම රඳා පවතින්නේ ඔබ භාවිතා කරන්නේ කුමන ධාරකයද සහ එයට සම්බන්ධය සංවිධානය වී ඇති ආකාරය මතය. මගේ නඩුවේදී, මම ඩිජිටල් සාගරය භාවිතා කරන බැවින්, මම සේවාදායකයට සම්බන්ධ වීමට විධාන භාවිතා කරමි doctl. AWS සමඟ වැඩ කරන විට, උපයෝගීතාව භාවිතා කරනු ඇත aws, සහ යනාදි.

සේවාදායකය සැකසීම විශේෂයෙන් අපහසු නොවීය. ඉතින්, මම මූලික රූපය මත පදනම්ව බිංදුවක් සකස් කළා. මා තෝරා ගත් පද්ධතියට Docker එක් වරක් අතින් ස්ථාපනය කිරීම සහ Docker හි එක් වරක් අතින් දියත් කිරීම අවශ්‍ය බව සටහන් කළ යුතුය. මම ඩොකර් ස්ථාපනය කිරීමට උබුන්ටු 18.04 භාවිතා කළෙමි, එබැවින් ඔබත් එයම කිරීමට උබුන්ටු භාවිතා කරන්නේ නම්, ඔබට අනුගමනය කළ හැකිය. මේක සරල මාර්ගෝපදේශය.

මෙම අංගය විවිධ අවස්ථා වලදී බොහෝ සෙයින් වෙනස් විය හැකි බැවින්, සේවාව සඳහා නිශ්චිත විධාන ගැන මම මෙහි කතා නොකරමි. ව්‍යාපෘතිය යොදවනු ලබන සේවාදායකයට SSH හරහා සම්බන්ධ වූ පසු සිදු කළ යුතු සාමාන්‍ය ක්‍රියාකාරී සැලැස්මක් මම ලබා දෙන්නෙමි:

  • දැනට දුවන කන්ටේනරය හොයාගෙන නවත්තන්න ඕන.
  • එවිට ඔබට පසුබිමේ නව බහාලුමක් දියත් කළ යුතුය.
  • ඔබට සේවාදායකයේ ප්‍රාදේශීය වරාය සැකසීමට අවශ්‍ය වනු ඇත 80 - මෙය ඔබට වැනි ලිපිනයකින් අඩවියට ඇතුළු වීමට ඉඩ සලසයි example.com, වැනි ලිපිනයක් භාවිතා කරනවාට වඩා, වරාය සඳහන් නොකර example.com:5000.
  • අවසාන වශයෙන්, ඔබ සියලු පැරණි බහාලුම් සහ පින්තූර මකා දැමිය යුතුය.

මෙහි පිටපතේ අඛණ්ඩ පැවැත්මයි.

# Найти ID работающего контейнера
CONTAINER_ID=$(docker ps | grep takenote | cut -d" " -f1)

# Остановить старый контейнер, запустить новый, очистить систему
docker stop ${CONTAINER_ID}
docker run --restart unless-stopped -d -p 80:5000 ${IMAGE}:${GIT_VERSION}
docker system prune -a -f

අවධානය යොමු කළ යුතු කරුණු කිහිපයක්

ඔබ ට්‍රැවිස් CI වෙතින් SSH හරහා සේවාදායකයට සම්බන්ධ වූ විට, පද්ධතිය පරිශීලකයාගේ ප්‍රතිචාරය සඳහා රැඳී සිටින බැවින් ස්ථාපනය දිගටම කරගෙන යාම වළක්වන අනතුරු ඇඟවීමක් ඔබට පෙනෙනු ඇත.

The authenticity of host '<hostname> (<IP address>)' can't be established.
RSA key fingerprint is <key fingerprint>.
Are you sure you want to continue connecting (yes/no)?

තන්තු යතුරක් පහසුවෙන් සහ විශ්වාසදායක ලෙස ක්‍රියා කළ හැකි ආකාරයෙන් එය සුරැකීම සඳහා Base64 හි කේතනය කළ හැකි බව මම ඉගෙන ගතිමි. ස්ථාපන අදියරේදී, ඔබට පොදු යතුර විකේතනය කර ගොනුවකට ලිවිය හැකිය known_hosts ඉහත දෝෂයෙන් මිදීම සඳහා.

echo <public key> | base64 # выводит <публичный ключ, закодированный в base64>

ප්රායෝගිකව, මෙම විධානය මේ ආකාරයෙන් පෙනෙනු ඇත:

echo "123.45.67.89 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+M7Q== [email protected]" | base64

එය නිපදවන දේ මෙන්න - base64 කේතනය කරන ලද තන්තුවක්:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

මෙන්න ඉහත සඳහන් කළ විධානය

install:
  - echo < публичный ключ, закодированный в base64> | base64 -d >> $HOME/.ssh/known_hosts

සේවාදායකයට ප්‍රවේශ වීමට ඔබට පුද්ගලික යතුරක් අවශ්‍ය විය හැකි බැවින් සම්බන්ධතාවයක් ස්ථාපනය කිරීමේදී එකම ප්‍රවේශය පුද්ගලික යතුරක් සමඟ භාවිතා කළ හැකිය. යතුර සමඟ වැඩ කරන විට, එය ට්‍රැවිස් සීඅයි පරිසර විචල්‍යයක ආරක්ෂිතව ගබඩා කර ඇති බවත් එය කොතැනකවත් නොපෙන්වන බවත් සහතික කළ යුතුය.

සටහන් කළ යුතු තවත් දෙයක් නම්, ඔබට සම්පූර්ණ යෙදවුම් ස්ක්‍රිප්ට් එක පේළියක් ලෙස ධාවනය කිරීමට අවශ්‍ය විය හැකිය, උදාහරණයක් ලෙස - සමඟ doctl. මෙයට අමතර වෑයමක් අවශ්‍ය විය හැකිය.

doctl compute ssh <droplet> --ssh-command "все команды будут здесь && здесь"

TLS/SSL සහ පැටවුම් තුලනය

මම ඉහත සඳහන් කළ සියල්ල කළ පසු, මට අවසන් වරට මුහුණ දීමට සිදු වූ ගැටළුව නම් සේවාදායකයේ SSL නොමැති වීමයි. බල කිරීම සඳහා මම Node.js සේවාදායකයක් භාවිතා කරන බැවින් වැඩ කිරීමට ප්‍රතිලෝම ප්‍රොක්සි Nginx සහ අපි එන්ක්‍රිප්ට් කරමු, ඔබට බොහෝ දේ ටින්කර් කළ යුතුය.

මට ඇත්තටම මේ සියලුම SSL වින්‍යාසය අතින් සිදු කිරීමට අවශ්‍ය නොවීය, එබැවින් මම load balancer එකක් සාදා එහි විස්තර DNS හි සටහන් කළෙමි. උදාහරණයක් ලෙස DigitalOcean සම්බන්ධයෙන් ගත් කල, load balancer මත ස්වයංක්‍රීයව අලුත් කරන ස්වයං අත්සන් සහතිකයක් නිර්මාණය කිරීම සරල, නිදහස් සහ වේගවත් ක්‍රියා පටිපාටියකි. මෙම ප්‍රවේශයට අමතර ප්‍රතිලාභයක් ඇත, එය අවශ්‍ය නම් ලෝඩ් බැලන්සර් පිටුපසින් ක්‍රියාත්මක වන බහු සේවාදායක මත SSL පිහිටුවීම ඉතා පහසු කරයි. මෙය SSL ගැන කිසිසේත්ම "සිතීමට" සේවාදායකයන්ට ඉඩ නොදෙන නමුත් ඒ සමඟම සුපුරුදු පරිදි වරාය භාවිතා කරයි. 80. එබැවින් SSL පිහිටුවීමේ විකල්ප ක්‍රමවලට වඩා load balancer එකක SSL පිහිටුවීම ඉතා පහසු සහ පහසු වේ.

දැන් ඔබට ලැබෙන සම්බන්ධතා පිළිගන්නා සේවාදායකයේ සියලුම වරායන් වසා දැමිය හැක - වරාය හැර 80, load balancer සහ port සමඟ සන්නිවේදනය කිරීමට භාවිතා කරයි 22 SSH සඳහා. මෙහි ප්‍රතිඵලයක් වශයෙන්, මෙම දෙක හැර වෙනත් ඕනෑම වරායක සේවාදායකය වෙත සෘජුවම ප්‍රවේශ වීමට දරන උත්සාහය අසාර්ථක වනු ඇත.

ප්රතිඵල

මම මෙම ද්‍රව්‍යයේ කතා කළ සෑම දෙයක්ම කළ පසු, ඩොකර් වේදිකාව හෝ ස්වයංක්‍රීය CI/CD දාම පිළිබඳ සංකල්ප මා තවදුරටත් බිය ගන්වන්නේ නැත. අඛණ්ඩ ඒකාබද්ධතා දාමයක් සැකසීමට මට හැකි විය, එම කාලය තුළ කේතය නිෂ්පාදනයට යාමට පෙර පරීක්ෂා කරනු ලබන අතර කේතය ස්වයංක්‍රීයව සේවාදායකයේ යොදවනු ලැබේ. මේ සියල්ල මට තවමත් සාපේක්ෂව අලුත් වන අතර, මගේ ස්වයංක්‍රීය කාර්ය ප්‍රවාහය වැඩිදියුණු කිරීමට සහ එය වඩාත් කාර්යක්ෂම කිරීමට ක්‍රම ඇති බව මට විශ්වාසයි. එබැවින් මෙම කාරණය සම්බන්ධයෙන් ඔබට කිසියම් අදහසක් ඇත්නම්, කරුණාකර මට දන්වන්න. මට දන්නවා. ඔබගේ උත්සාහයන් සඳහා මෙම ලිපිය ඔබට උපකාරී වනු ඇතැයි මම බලාපොරොත්තු වෙමි. මට විශ්වාස කරන්න ඕන ඒක කියෙව්වට පස්සෙ මම ඒකෙ කතා කරපු හැමදෙයක්ම හොයල බලද්දි මම ඉගෙන ගත්ත තරම් ඔයා ඉගෙන ගත්ත කියල.

ප්රාදේශීය සභා අපේ වෙළඳපොළ රූපයක් තිබේ Docker, එක් ක්ලික් කිරීමකින් ස්ථාපනය කළ හැක. ඔබට බහාලුම්වල ක්‍රියාකාරිත්වය පරීක්ෂා කළ හැකිය VPS. සියලුම නව ගනුදෙනුකරුවන්ට දින 3ක පරීක්ෂණ නොමිලේ ලබා දේ.

හිතවත් පා readers කයින්! ඔබ ඔබේ ව්‍යාපෘතිවල CI/CD තාක්ෂණය භාවිතා කරනවාද?

CI/CD දාමයක් නිර්මාණය කිරීම සහ ඩොකර් සමඟ වැඩ ස්වයංක්‍රීය කිරීම

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න