Эҷоди занҷири CI/CD ва автоматикунонии кор бо Docker

Ман аввалин вебсайтҳои худро дар охири солҳои 90 навиштам. Дар он вакт ба кор андохтани онхо хеле осон буд. Дар баъзе хостинги муштарак сервери Apache мавҷуд буд, шумо метавонед тавассути FTP тавассути навиштани чизе ба ин сервер ворид шавед ftp://ftp.example.com. Пас шумо бояд ном ва пароли худро ворид кунед ва файлҳоро ба сервер бор кунед. Замонаҳои гуногун буданд, ҳама чиз он вақт аз ҳозир соддатар буд.

Эҷоди занҷири CI/CD ва автоматикунонии кор бо Docker

Дар давоми ду дахсола аз он вакт хама чиз хеле тагьир ёфт. Вебсайтҳо мураккабтар шудаанд; онҳо бояд пеш аз ба истеҳсолот баровардан ҷамъ карда шаванд. Як сервери ягона ба серверҳои сершуморе табдил ёфт, ки дар паси мувозинатҳои сарборӣ кор мекунанд ва истифодаи системаҳои идоракунии версияҳо маъмулӣ шуд.

Барои лоиҳаи шахсии ман конфигуратсияи махсус доштам. Ва ман медонистам, ки ба ман қобилияти ҷойгиркунии сайт дар истеҳсолот бо иҷрои танҳо як амал лозим аст: навиштани код ба филиал master дар GitHub. Илова бар ин, ман медонистам, ки барои таъмини кори веб-барномаи хурди худ ман намехостам кластери азими Kubernetes-ро идора кунам, ё технологияи Docker Swarm-ро истифода барам ё парки серверҳоро бо pods, агентҳо ва ҳама навъҳои дигар нигоҳ дошта бошам. мураккабиҳо. Барои ноил шудан ба ҳадафи то ҳадди имкон осон кардани кор, ба ман лозим омад, ки бо CI/CD шинос шавам.

Агар шумо як лоиҳаи хурд дошта бошед (дар ин ҳолат, лоиҳаи Node.js) ва шумо мехоҳед бидонед, ки чӣ гуна автоматикунонии ҷобаҷогузории ин лоиҳаро донед, дар ҳоле ки боварӣ ҳосил кунед, ки он чизе, ки дар анбор нигоҳ дошта мешавад, ба он чизе, ки дар истеҳсолот кор мекунад, мувофиқат мекунад, пас ман фикр кунед, ки шумо шояд ба ин мақола таваҷҷӯҳ кунед.

Шарти пешакӣ

Интизор меравад, ки хонандаи ин мақола дар бораи сатри фармон ва навиштани скриптҳои Bash фаҳмиши асосӣ дошта бошад. Илова бар ин, ба ӯ ҳисобҳо лозим аст Травис CI и Маркази докерӣ.

Мақсадҳо

Ман намегӯям, ки ин мақоларо бечунучаро "дарсӣ" номидан мумкин аст. Ин бештар ҳуҷҷатест, ки дар он ман дар бораи чизҳои омӯхтаам сӯҳбат мекунам ва равандеро тавсиф мекунам, ки ба ман барои озмоиш ва ҷобаҷогузории код дар истеҳсолот мувофиқ аст, ки дар як гузариш автоматӣ иҷро карда мешавад.

Ин аст он чизе ки ҷараёни кори ман анҷом ёфт.

Барои коде, ки ба ягон филиали репозиторий фиристода шудааст, ба истиснои master, амалҳои зерин иҷро карда мешаванд:

  • Сохтани лоиҳа дар Travis CI оғоз меёбад.
  • Ҳама озмоишҳои воҳид, ҳамгироӣ ва ниҳоӣ анҷом дода мешаванд.

Танҳо барои коде, ки ба он дохил мешавад master, амалҳои зерин иҷро карда мешаванд:

  • Ҳама чизҳои дар боло зикршуда, илова бар он ...
  • Сохтани тасвири Docker дар асоси коди ҷорӣ, танзимот ва муҳити зист.
  • Ҷойгир кардани тасвир дар Docker Hub.
  • Пайвастшавӣ ба сервери истеҳсолӣ.
  • Бор кардани тасвир аз Docker Hub ба сервер.
  • Қатъи контейнери ҷорӣ ва оғоз кардани контейнери нав дар асоси тасвири нав.

Агар шумо дар бораи Docker, тасвирҳо ва контейнерҳо комилан чизе надонед, хавотир нашавед. Ман дар бораи он ҳама чизро ба шумо мегӯям.

CI/CD чист?

Ихтисораи CI/CD маънои "интегратсияи муттасил/таъмини пайваста" -ро дорад.

▍Интегратсияи муттасил

Интегратсияи доимӣ равандест, ки дар он таҳиягарон ба анбори асосии коди сарчашмаи лоиҳа (одатан филиал) ӯҳдадор мешаванд. master). Дар баробари ин, сифати код тавассути санҷиши автоматӣ таъмин карда мешавад.

▍ Ҷойгиркунии доимӣ

Ҷойгиркунии доимӣ ин ҷойгиркунии зуд-зуд ва автоматии код дар истеҳсолот мебошад. Қисми дуюми ихтисороти CI/CD баъзан ҳамчун “таҳвили муттасил” навишта мешавад. Ин аслан ба “таҳвили муттасил” монанд аст, аммо “таҳвили муттасил” зарурати ба таври дастӣ тасдиқ кардани тағиротро пеш аз оғози раванди густариши лоиҳа дар назар дорад.

саршавӣ

Барномае, ки ман ҳама инро меомӯзам, ном дорад NoteNote. Ин лоиҳаи вебест, ки ман дар болои он кор карда истодаам ва барои сабти қайдҳо пешбинӣ шудааст. Дар аввал ман кӯшиш кардам, ки кунам JAMStack-лоиҳа ё танҳо як барномаи пешрафтаи бе сервер, бо мақсади истифода бурдани имкониятҳои стандартии хостинг ва густариши лоиҳа, ки он пешниҳод мекунад Netlify. Вақте ки мураккабии барнома афзоиш ёфт, ба ман лозим омад, ки қисми сервери онро эҷод кунам, ки ин маънои онро дошт, ки ман бояд стратегияи худро барои ҳамгироии худкор ва густариши автоматии лоиҳа таҳия кунам.

Дар ҳолати ман, барнома сервери экспресс аст, ки дар муҳити Node.js кор мекунад, ба як барномаи React-саҳифа хидмат мекунад ва API-и бехатари серверро дастгирӣ мекунад. Ин меъморӣ стратегияеро, ки дар он пайдо кардан мумкин аст, пайравӣ мекунад ин Дастури пурраи аутентификатсияи стек.

бо маслихат кардам дустон, ки мутахассиси автоматика аст ва аз ӯ пурсид, ки ман чӣ кор кунам, то ҳама он тавре ки ман мехостам кор кунад. Вай ба ман ғояе дод, ки ҷараёни кори автоматӣ бояд чӣ гуна бошад, ки дар бахши Ҳадафҳои ин мақола оварда шудааст. Доштани ин ҳадафҳо маънои онро дошт, ки ман бояд фаҳмам, ки чӣ тавр Docker истифода кунам.

Доктор

Docker асбобест, ки ба шарофати технологияи контейнеризатсия имкон медиҳад, ки барномаҳо ба осонӣ тақсим карда шаванд, ҷойгир карда шаванд ва дар як муҳит кор кунанд, ҳатто агар худи платформаи Docker дар муҳитҳои гуногун кор кунад. Аввалан, ба ман лозим буд, ки дастҳои худро ба асбобҳои сатри фармони Docker (CLI) гирам. Дастур Дастури насби Docker-ро хеле возеҳ ва фаҳмо номидан мумкин нест, аммо аз он шумо метавонед фаҳмед, ки барои гузоштани қадами аввалини насб, шумо бояд Desktop Docker-ро (барои Mac ё Windows) зеркашӣ кунед.

Docker Hub тақрибан ҳамон чизест GitHub барои анбори git, ё реестр данд барои бастаҳои JavaScript. Ин як анбори онлайн барои тасвирҳои Docker аст. Ин аст он чизе ки Docker Desktop ба он пайваст мешавад.

Ҳамин тавр, барои оғози кор бо Docker, шумо бояд ду чизро иҷро кунед:

Пас аз ин, шумо метавонед санҷед, ки оё Docker CLI кор мекунад, бо иҷро кардани фармони зерин барои тафтиши версияи Docker:

docker -v

Баъдан, ба Docker Hub бо ворид кардани номи корбар ва гузарвожаи худ ҳангоми пурсиш:

docker login

Барои истифодаи Docker, шумо бояд мафҳумҳои тасвирҳо ва контейнерҳоро фаҳмед.

▍Тасвирҳо

Тасвир чизе монанди нақшаест, ки дорои дастурҳо оид ба васл кардани контейнер мебошад. Ин як акси тағирнопазири системаи файлии барнома ва танзимот аст. Таҳиягарон метавонанд тасвирҳоро ба осонӣ мубодила кунанд.

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

Ин фармон ҷадвалро бо сарлавҳаи зерин мебарорад:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Минбаъд мо якчанд намунаҳои фармонҳоро дар ҳамон формат дида мебароем - аввал фармон бо шарҳ мавҷуд аст ва баъд намунаи он чизе ки он метавонад бароварда шавад.

▍Контейнерҳо

Контейнер як бастаи иҷрошаванда аст, ки ҳама чизро барои иҷро кардани барнома дар бар мегирад. Барнома бо ин равиш, новобаста аз инфрасохтор, ҳамеша якхела кор мекунад: дар муҳити ҷудошуда ва дар ҳамон муҳит. Гап дар он аст, ки намунаҳои як тасвир дар муҳитҳои гуногун оғоз карда мешаванд.

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

▍Барчаспҳо

Тег нишонаи версияи мушаххаси тасвир аст.

▍Истифодаи зуд ба фармонҳои Docker

Ин аст шарҳи баъзе фармонҳои маъмулан Docker.

гурӯҳ

Мавзӯъ

таъсир

сохтани докер

Image

Сохтани тасвир аз файли Docker

теги докер

Image

Барчаспкунии тасвир

тасвирҳо

Image

Рӯйхати тасвирҳо

давидан докер

Контейнер

Иҷро кардани контейнер дар асоси тасвир

такони докер

Image

Бор кардани тасвир ба реестр

кашидани докер

Image

Боркунии тасвир аз феҳрист

докер ps

Контейнер

Рӯйхати контейнерҳо

системаи докерӣ қоқ

Тасвир/контейнер

Хориҷ кардани контейнерҳо ва тасвирҳои истифоданашуда

▍Файли Docker

Ман медонам, ки чӣ гуна як барномаи истеҳсолиро дар маҳаллӣ иҷро кунам. Ман конфигуратсияи Webpack дорам, ки барои сохтани як замимаи тайёри React тарҳрезӣ шудааст. Баъдан, ман фармоне дорам, ки сервери Node.js-ро дар порт оғоз мекунад 5000. Чунин ба назар мерасад:

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

Бояд қайд кард, ки ман барои ин мавод аризаи намунавӣ надорам. Аммо дар ин ҷо, барои таҷрибаҳо, ҳама гуна барномаи оддии Node кор хоҳад кард.

Барои истифодаи контейнер, шумо бояд ба Docker дастур диҳед. Ин тавассути файли номдор анҷом дода мешавад Dockerfile, ки дар феҳристи решаи лоиҳа ҷойгир аст. Ин файл, дар аввал, хеле нофаҳмо менамояд.

Аммо он чизе, ки дар он мавҷуд аст, танҳо бо фармонҳои махсус чизеро тавсиф мекунад, ки ба ташкили муҳити корӣ монанд аст. Инҳоянд баъзе аз ин фармонҳо:

  • Аз ФР — Ин фармон файлро оғоз мекунад. Он тасвири асосиро, ки дар он контейнер сохта шудааст, муайян мекунад.
  • НУСХА — Нусхабардории файлҳо аз манбаи маҳаллӣ ба контейнер.
  • КОРДИР — Муқаррар кардани директорияи корӣ барои фармонҳои зерин.
  • 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> .

Пас аз иҷро кардани ин фармон, шумо метавонед Docker сохтани тасвирро тамошо кунед.

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 Hub эҷод кунед. Пас аз ин, мо ҷойе хоҳем дошт, ки мо метавонем тасвирро фиристем. Тасвир бояд тағир дода шавад, то номи он бо номи корбарии 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 ба таври маҳаллӣ кор мекунад. Мо контейнерро ба Docker Hub бор кардем. Хамаи ин чунин маъно дорад, ки мо ба суи максади худ аллакай хеле хуб пеш рафтаем. Акнун мо бояд ду саволи дигарро ҳал кунем:

  • Ташкили асбоби CI барои санҷиш ва ҷойгиркунии код.
  • Танзими сервери истеҳсолӣ, то ки он коди моро зеркашӣ ва иҷро кунад.

Дар ҳолати мо, мо истифода мебарем Травис CI. Ҳамчун сервер - Дитигал Уқёнуси.

Бояд қайд кард, ки дар ин ҷо шумо метавонед маҷмӯи дигари хидматҳоро истифода баред. Масалан, ба ҷои Travis CI, шумо метавонед CircleCI ё Github Actions -ро истифода баред. Ва ба ҷои DigitalOcean - AWS ё Linode.

Мо тасмим гирифтем, ки бо Travis CI кор кунем ва ман аллакай чизеро дар ин хидмат танзим кардаам. Аз ин рӯ, ҳоло ман дар бораи чӣ гуна ба кор омода кардани он мухтасар гап мезанам.

Травис CI

Travis CI абзорест барои санҷиш ва ҷойгиркунии код. Ман намехоҳам ба нозукиҳои таъсиси Travis CI дохил шавам, зеро ҳар як лоиҳа беназир аст ва ин фоидаи зиёд нахоҳад овард. Аммо ман асосҳоро мефаҳмам, то шуморо оғоз кунад, агар шумо қарор диҳед, ки Travis CI -ро истифода баред. Новобаста аз он ки шумо Travis CI, CircleCI, Ҷенкинс ё чизи дигареро интихоб мекунед, усулҳои конфигуратсияи шабеҳ дар ҳама ҷо истифода мешаванд.

Барои оғози кор бо Travis CI, равед лоиҳаи сайт ва ҳисоб эҷод кунед. Пас Travis CI-ро бо ҳисоби GitHub-и худ ҳамгиро кунед. Ҳангоми насб кардани система ба шумо лозим меояд, ки анбореро, ки бо он коратонро автоматӣ кардан мехоҳед ва дастрасӣ ба он имконпазир кунед, муайян кунед. (Ман 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

▍Санҷиш

Дар файли конфигуратсия ман сервери маҳаллии Travis CI-ро танзим мекунам. Ман гиреҳи 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

Дар ин ҷо амалҳое, ки барои ҳама шохаҳои анбор ва дархостҳои кашидан иҷро мешаванд, ба охир мерасад.

▍ Ҷойгиркунӣ

Дар асоси тахмине, ки ҳама санҷишҳои автоматикунонидашуда бомуваффақият анҷом ёфтаанд, мо метавонем, ки ихтиёрӣ аст, кодро дар сервери истеҳсолӣ ҷойгир кунем. Азбаски мо мехоҳем ин корро танҳо барои коди филиал иҷро кунем master, мо дар танзимоти ҷойгиркунӣ ба система дастурҳои мувофиқ медиҳем. Пеш аз он ки шумо кодеро истифода баред, ки мо дар оянда дар лоиҳаи худ баррасӣ хоҳем кард, ман мехоҳам шуморо огоҳ кунам, ки шумо бояд скрипти воқеие дошта бошед, ки барои ҷойгиркунӣ даъват карда мешавад.

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

Скрипти густариш ду мушкилотро ҳал мекунад:

  • Бо истифода аз асбоби CI (дар ҳолати мо, Travis CI) тасвирро созед, нишон диҳед ва ба Docker Hub фиристед.
  • Боркунии тасвир дар сервер, қатъ кардани контейнери кӯҳна ва оғози нав (дар ҳолати мо, сервер дар платформаи DigitalOcean кор мекунад).

Аввалан, шумо бояд як раванди худкорро барои сохтан, нишонгузорӣ ва тела додани тасвир ба Docker Hub насб кунед. Ин ҳама ба он чизе, ки мо аллакай дастӣ кардаем, хеле монанд аст, ба истиснои он ки мо ба стратегияи таъини барчаспҳои беназир ба тасвирҳо ва автоматикунонии воридшавӣ ниёз дорем. Ман бо баъзе тафсилоти скрипти густариш, ба монанди стратегияи барчасп, воридшавӣ, рамзгузории калиди SSH, таъсиси пайвасти SSH душворӣ кашидам. Аммо хушбахтона, дӯстдухтари ман мисли бисёр чизҳои дигар бо bash хеле хуб аст. Вай ба ман дар навиштани ин скрипт кӯмак кард.

Ҳамин тавр, қисми якуми скрипт тасвирро ба Docker Hub бор мекунад. Ин корро кардан хеле осон аст. Схемаи барчаспгузорие, ки ман истифода кардам, омезиши git hash ва git теги, агар мавҷуд бошад, дар бар мегирад. Ин кафолат медиҳад, ки тег беназир аст ва муайян кардани маҷлисеро, ки дар он асос ёфтааст, осонтар мекунад. DOCKER_USERNAME и DOCKER_PASSWORD тағйирёбандаҳои муҳити корбар мебошанд, ки онҳоро бо истифода аз интерфейси Travis CI танзим кардан мумкин аст. Travis CI маълумоти ҳассосро ба таври худкор коркард мекунад, то он ба дасти нодуруст наафтад.

Дар ин ҷо қисми якуми скрипт аст 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}

Қисми дуюми скрипт комилан аз он вобаста аст, ки шумо кадом ҳостро истифода мебаред ва пайвастшавӣ бо он чӣ гуна ташкил карда шудааст. Дар ҳолати ман, азбаски ман Digital Ocean -ро истифода мебарам, ман фармонҳоро барои пайваст шудан ба сервер истифода мебарам доктл. Ҳангоми кор бо AWS, утилита истифода мешавад aws, ва ғайра.

Насб кардани сервер махсусан душвор набуд. Ҳамин тавр, ман дар асоси тасвири асосӣ қатрае насб кардам. Бояд қайд кард, ки системаи интихобкардаи ман насби якдафъаинаи дастии Docker ва оғози якдафъаинаи дастии Docker-ро талаб мекунад. Ман Ubuntu 18.04-ро барои насб кардани Docker истифода кардам, бинобар ин, агар шумо низ Ubuntu-ро барои ҳамин кор истифода баред, шумо метавонед танҳо пайравӣ кунед ин дастури оддӣ.

Ман дар ин ҷо дар бораи фармонҳои мушаххаси хидмат ҳарф намезанам, зеро ин ҷанба метавонад дар ҳолатҳои гуногун хеле фарқ кунад. Ман танҳо як нақшаи умумии амалеро медиҳам, ки пас аз пайвастшавӣ тавассути 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

Баъзе чизҳое, ки бояд ба онҳо диққат диҳед

Мумкин аст, ки вақте ки шумо ба сервер тавассути SSH аз Travis CI пайваст мешавед, шумо огоҳие хоҳед дид, ки шуморо аз идомаи насб пешгирӣ мекунад, зеро система посухи корбарро интизор мешавад.

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

Ҳамин равишро метавон бо калиди махфӣ ҳангоми барқарор кардани пайваст истифода бурд, зеро шояд барои дастрасӣ ба сервер калиди хусусӣ лозим аст. Ҳангоми кор бо калид, шумо танҳо бояд боварӣ ҳосил кунед, ки он дар як тағирёбандаи муҳити Travis CI бехатар нигоҳ дошта мешавад ва он дар ҳеҷ ҷо намоиш дода намешавад.

Чизи дигаре, ки бояд қайд кард, он аст, ки ба шумо лозим меояд, ки тамоми скрипти густаришро ҳамчун як сатр иҷро кунед, масалан - бо doctl. Ин метавонад кӯшиши иловагӣ талаб кунад.

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

TLS/SSL ва мувозинати сарборӣ

Пас аз он ки ман ҳама чизҳои дар боло зикршударо иҷро кардам, мушкили охирине, ки ман дучор шудам, ин буд, ки сервер SSL надошт. Азбаски ман истифода сервери Node.js, бо мақсади маҷбур ба кор медарояд прокси баръакси Nginx ва Let's Encrypt, ба шумо лозим аст, ки бисёр кор кунед.

Ман аслан намехостам ҳамаи ин конфигуратсияи SSL-ро дастӣ иҷро кунам, аз ин рӯ ман танҳо мувозинати сарборӣ сохтам ва тафсилоти онро дар DNS сабт кардам. Дар мавриди DigitalOcean, масалан, эҷоди шаҳодатномаи худкор навсозӣ дар мувозинаткунандаи сарборӣ як тартиби содда, ройгон ва зуд аст. Ин равиш бартариҳои иловагие дорад, ки он насб кардани SSL-ро дар серверҳои сершуморе, ки дар ҳолати зарурӣ паси мувозинати сарборӣ кор мекунанд, хеле осон мекунад. Ин ба худи серверҳо имкон медиҳад, ки дар бораи SSL умуман "фикр накунанд", аммо дар айни замон портро ҳамчун маъмул истифода баранд. 80. Ҳамин тавр, насб кардани SSL дар мувозинати сарборӣ нисбат ба усулҳои алтернативии танзими SSL хеле осонтар ва қулайтар аст.

Акнун шумо метавонед ҳамаи портҳоро дар сервер, ки пайвастҳои воридотӣ қабул мекунанд, пӯшед - ба истиснои порт 80, барои муошират бо мувозинати сарборӣ ва порт истифода мешавад 22 барои SSH. Дар натиҷа, кӯшиши дастрасӣ ба сервер дар ҳама портҳои ғайр аз ин ду ноком мешавад.

Натиҷаҳо

Пас аз он ки ман ҳама чизеро, ки дар ин мавод гуфтам, иҷро кардам, на платформаи Docker ва на мафҳумҳои занҷирҳои автоматии CI/CD маро дигар тарсонданд. Ман тавонистам як занҷири пайвастаи муттаҳидсозиро таъсис диҳам, ки дар давоми он код пеш аз он ки ба истеҳсолот ворид шавад, санҷида мешавад ва код ба таври худкор дар сервер ҷойгир карда мешавад. Ин ҳама барои ман то ҳол нисбатан нав аст ва ман боварӣ дорам, ки роҳҳои беҳтар кардани ҷараёни кори худкор ва самараноктар кардани он вуҷуд доранд. Пас, агар шумо дар ин бора ягон фикре дошта бошед, лутфан ба ман хабар диҳед. ман бидонед. Ман умедворам, ки ин мақола ба шумо дар кӯшишҳои худ кӯмак кард. Ман мехоҳам бовар кунам, ки пас аз хондани он, шумо ҳамон чизеро, ки ман фаҳмидам, омӯхтаед, ки ҳама чизеро, ки дар бораи он гуфтам, фаҳмидам.

PS Дар мо бозор тасвир вуҷуд дорад Доктор, ки онро бо як клик насб кардан мумкин аст. Шумо метавонед кори контейнерҳоро дар VPS. Ба ҳама муштариёни нав 3 рӯзи санҷиш ройгон дода мешавад.

Хонандагони азиз! Оё шумо дар лоиҳаҳои худ технологияҳои CI/CD-ро истифода мебаред?

Эҷоди занҷири CI/CD ва автоматикунонии кор бо Docker

Манбаъ: will.com

Илова Эзоҳ