CI/CD чынжырын түзүү жана Docker менен иштөөнү автоматташтыруу

Мен биринчи веб-сайттарымды 90-жылдардын аягында жазгам. Ал кезде аларды ишке киргизүү абдан оңой болчу. Кээ бир жалпы хостингде Apache сервери бар болчу, сиз FTP аркылуу бул серверге ушул сыяктуу нерселерди жазып кирсеңиз болот ftp://ftp.example.com. Андан кийин атыңызды жана паролуңузду киргизип, файлдарды серверге жүктөшүңүз керек болчу. Ар кандай убактар ​​болгон, ал кездегиге караганда баары жөнөкөй эле.

CI/CD чынжырын түзүү жана Docker менен иштөөнү автоматташтыруу

Андан берки эки он жылдыкта баары абдан өзгөрдү. Веб-сайттар татаалыраак болуп калды; алар өндүрүшкө чыгарардан мурун чогултулушу керек. Бир сервер жүк балансынын артында иштеген көптөгөн серверлерге айланды жана версияларды башкаруу системаларын колдонуу кадимки көрүнүшкө айланды.

Жеке долбоор үчүн менде атайын конфигурация бар болчу. Мен бир гана иш-аракетти аткаруу менен сайтты өндүрүшкө жайылтуу жөндөмү керектигин билчүмүн: филиалга код жазуу master GitHub боюнча. Мындан тышкары, мен кичинекей веб-тиркеменин иштешин камсыз кылуу үчүн, мен чоң Kubernetes кластерин башкарууну же Docker Swarm технологиясын колдонгум келбегенимди, же подъезддер, агенттер жана башка бардык түрлөрү бар серверлердин паркын колдогум келбегенин билчүмүн. татаалдыктар. Жумушту мүмкүн болушунча жеңилдетүү максатына жетүү үчүн мен CI/CD менен тааныш болушум керек болчу.

Эгерде сизде кичинекей долбоор болсо (бул учурда, Node.js долбоору) жана сиз репозиторийде сакталган нерселер өндүрүштө иштегенге дал келээрин камсыз кылуу менен бул долбоорду кантип автоматташтыруу керектигин билгиңиз келсе, анда мен Бул макала сизди кызыктырышы мүмкүн деп ойлойм.

Алдын ала шарттар

Бул макаланын окурманы буйрук сабы жана Bash скрипттерин жазуу жөнүндө негизги түшүнүккө ээ болушу күтүлүүдө. Мындан тышкары, ага эсептер керек болот Travis C.I. и Docker hub.

максаттары

Мен бул макаланы эч кандай шартсыз "окуу куралы" деп атоого болот деп айтпайм. Бул көбүрөөк документ, анда мен үйрөнгөн нерселерим жөнүндө айтып, бир автоматташтырылган өтүүдө аткарылган өндүрүшкө кодду сыноо жана жайылтуу үчүн мага ылайыктуу процессти сүрөттөйт.

Менин иш процессим ушуну менен аяктады.

Коддон башка бардык репозиторий бутагына жарыяланган код үчүн master, төмөнкү иш-аракеттер жүзөгө ашырылат:

  • Travis CI боюнча долбоор башталат.
  • Бардык бирдик, интеграция жана аягына чейин сыноолор жүргүзүлөт.

Түшүнгөн код үчүн гана master, төмөндөгүлөр аткарылат:

  • Жогоруда айтылгандардын баары, кошумча ...
  • Учурдагы коддун, орнотуулардын жана чөйрөнүн негизинде Докер сүрөтүн түзүү.
  • Сүрөттү Docker Hub'га жайгаштыруу.
  • Өндүрүш серверине туташуу.
  • Docker Hub'дан серверге сүрөт жүктөлүүдө.
  • Учурдагы контейнерди токтотуу жана жаңы сүрөттүн негизинде жаңысын баштоо.

Эгер сиз Docker, сүрөттөр жана контейнерлер жөнүндө такыр эч нерсе билбесеңиз, кабатыр болбоңуз. Мен сага анын баарын айтып берем.

CI/CD деген эмне?

CI/CD аббревиатурасы "үзгүлтүксүз интеграция/үзгүлтүксүз жайылтуу" дегенди билдирет.

▍Үзгүлтүксүз интеграция

Үзгүлтүксүз интеграция - бул иштеп чыгуучулар долбоордун негизги булак кодунун репозиторийине (адатта филиалга) милдеттенме алган процесс. master). Ошол эле учурда коддун сапаты автоматташтырылган тестирлөө аркылуу камсыздалат.

▍Үзгүлтүксүз жайылтуу

Үзгүлтүксүз жайылтуу - өндүрүшкө коддун тез-тез, автоматташтырылган жайгаштыруу. CI/CD аббревиатурасынын экинчи бөлүгү кээде "үзгүлтүксүз жеткирүү" деп жазылат. Бул негизинен "үзгүлтүксүз жайылтуу" менен бирдей, бирок "үзгүлтүксүз жеткирүү" долбоорду жайылтуу процессин баштоодон мурун өзгөртүүлөрдү кол менен ырастоо зарылдыгын билдирет.

баштоо

Мунун баарын үйрөнгөн колдонмо деп аталат TakeNote. Бул мен иштеп жаткан веб-долбоор, жазып алуу үчүн иштелип чыккан. Алгач жасаганга аракет кылдым JAMStack-проект, же жөн гана сервери жок алдыңкы тиркеме, ал сунуш кылган стандарттуу хостинг жана долбоорду жайылтуу мүмкүнчүлүктөрүнөн пайдалануу үчүн Netlify. Тиркеменин татаалдыгы өскөн сайын, мен анын сервер бөлүгүн түзүшүм керек болчу, бул мен автоматташтырылган интеграция жана долбоорду автоматташтырылган жайылтуу үчүн өзүмдүн стратегиямды түзүшүм керек дегенди билдирет.

Менин учурда, тиркеме Node.js чөйрөсүндө иштеген, бир беттик React тиркемесин тейлеген жана коопсуз сервер тарабында API колдогон Экспресс сервер. Бул архитектура табууга болот стратегияны ээрчийт бул Толук стектин аутентификациясынын колдонмосу.

менен кеңештим другом, ал автоматташтыруу боюнча адис жана андан бардыгы мен каалагандай иштеши үчүн эмне кылышым керектигин сурады. Ал мага ушул макаланын Максаттар бөлүмүндө баяндалган автоматташтырылган иш процесси кандай болушу керектиги жөнүндө түшүнүк берди. Бул максаттарга ээ болуу мен Dockerди кантип колдонууну түшүнүшүм керектигин билдирген.

ютуб

Docker - бул контейнерлештирүү технологиясынын аркасында, Docker платформасынын өзү ар кандай чөйрөдө иштесе дагы, колдонмолорду оңой бөлүштүрүүгө, жайылтууга жана бир чөйрөдө иштетүүгө мүмкүндүк берген курал. Биринчиден, мен Docker буйрук сабынын куралдарына (CLI) колумду алышым керек болчу. көрсөтмөлөрү Docker орнотуу колдонмосун так жана түшүнүктүү деп айтууга болбойт, бирок андан сиз биринчи орнотуу кадамын жасоо үчүн Docker Desktop (Mac же Windows үчүн) жүктөп алышыңыз керек экенин биле аласыз.

Docker Hub болжол менен бирдей нерсе GitHub git репозиторийлери же реестр үчүн КЭУБ JavaScript пакеттери үчүн. Бул Docker сүрөттөрү үчүн онлайн репозиторий. Бул Docker Desktop менен туташып турат.

Ошентип, Docker менен баштоо үчүн, сиз эки нерсени кылышыңыз керек:

Андан кийин, Docker версиясын текшерүү үчүн төмөнкү буйрукту иштетүү менен Docker CLI иштеп жатканын текшере аласыз:

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 буйруктарынын жалпы баяндамасы.

команда

контекст

таасири

докер куруу

сүрөт

Докер файлынан сүрөт түзүү

докер теги

сүрөт

Сүрөттү тегдөө

ютуб сүрөттөрү

сүрөт

Сүрөттөрдү тизмелөө

докер чуркоо

контейнер

Сүрөттүн негизинде контейнерди иштетүү

докер түртүү

сүрөт

Сүрөттү реестрге жүктөө

докер тартуу

сүрөт

Реестрден сүрөт жүктөлүүдө

докер ps

контейнер

Контейнерлердин тизмеси

докер системасы prune

Сүрөт/контейнер

Колдонулбаган контейнерлерди жана сүрөттөрдү алып салуу

▍Dockerfile

Мен жергиликтүү өндүрүштүк тиркемени кантип иштетүүнү билем. Менде даяр React тиркемесин куруу үчүн иштелип чыккан Webpack конфигурациясы бар. Андан кийин менде портто Node.js негизиндеги серверди баштаган буйрук бар 5000. Бул төмөнкүдөй көрүнөт:

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

Белгилей кетчү нерсе, менде бул материал үчүн үлгү колдонмо жок. Бирок бул жерде, эксперименттер үчүн, каалаган жөнөкөй Node тиркемесин аткарат.

Контейнерди колдонуу үчүн Dockerге көрсөтмөлөрдү беришиңиз керек. Бул деп аталган файл аркылуу жасалат Dockerfile, долбоордун түпкү каталогунда жайгашкан. Бул файл, адегенде, түшүнүксүз көрүнөт.

Бирок анда камтылган нерсе атайын буйруктар менен иштөө чөйрөсүн орнотууга окшош нерсени гана сүрөттөйт. Бул жерде бул буйруктардын кээ бирлери:

  • FROM — Бул буйрук файлды баштайт. Ал контейнер курулган негизги сүрөттү көрсөтөт.
  • КӨЧҮРҮҮ — Файлдарды жергиликтүү булактан контейнерге көчүрүү.
  • 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> .

Бул буйрукту иштеткенден кийин, сиз 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 куралын орнотуу.
  • Өндүрүш серверин биздин кодду жүктөп алып, иштете тургандай кылып орнотуу.

Биздин учурда, биз колдонобуз Travis C.I.. сервер катары - DitgalOcean.

Белгилей кетсек, бул жерде сиз башка кызматтардын айкалышын колдоно аласыз. Мисалы, Travis CI ордуна, сиз CircleCI же Github аракеттерин колдоно аласыз. Ал эми DigitalOcean ордуна - AWS же Linode.

Биз Travis CI менен иштөөнү чечтик, менде бул кызматта конфигурацияланган бир нерсе бар. Ошондуктан, азыр мен аны ишке кантип даярдоо керектиги жөнүндө кыскача айтып берем.

Travis C.I.

Travis CI бул кодду сыноо жана жайылтуу куралы. Мен Travis CI орнотуунун татаалдыктарына киргим келбейт, анткени ар бир долбоор уникалдуу жана бул көп пайда алып келбейт. Бирок Travis CI колдонууну чечсеңиз, мен сизге баштоо үчүн негиздер жөнүндө айтып берем. Travis CI, CircleCI, Jenkins же башка нерсени тандайсызбы, окшош конфигурация ыкмалары бардык жерде колдонулат.

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 серверин конфигурациялайын деп жатам. Мен тил катары Node 12ди тандап алдым жана системага Dockerди колдонуу үчүн талап кылынган көз карандылыкты орнотууну айттым.

Тизмеде жазылгандардын баары .travis.yml, эгерде башкасы көрсөтүлбөсө, бардык тартуу сурамдары репозиторийдин бардык бутактарына жасалганда аткарылат. Бул пайдалуу функция, анткени бул биз репозиторийге келген бардык кодду сынай алабыз дегенди билдирет. Бул коддун филиалга жазууга даяр экендигин билүүгө мүмкүндүк берет. master, жана ал долбоорду куруу процессин бузабы. Бул глобалдык конфигурацияда мен бардыгын локалдык түрдө орнотуп, Webpack dev серверин фондо иштетем (бул менин иш процессимдин өзгөчөлүгү) жана тесттерди өткөрөм.

Эгерде сиз репозиторийиңизде тестти камтыган бейджиктер көрсөтүлүшүн кааласаңыз, бул жерде Бул маалыматты чогултуу жана көрсөтүү үчүн сиз Jest, Travis CI жана комбинезондорду колдонуу боюнча кыска нускамаларды таба аласыз.

Ошентип, бул жерде файлдын мазмуну .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 туташуусун орнотуу сыяктуу жайгаштыруу скриптинин айрым деталдарынан кыйналдым. Бирок, бактыга жараша, менин жигитим башка көптөгөн нерселер сыяктуу эле баш менен абдан жакшы. Ал мага бул сценарийди жазууга жардам берди.

Ошентип, скрипттин биринчи бөлүгү сүрөттү Docker Hubга жүктөө. Муну жасоо абдан оңой. Мен колдонгон белгилөө схемасы, эгер бар болсо, 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ди бир жолку кол менен ишке киргизүүнү талап кылат. Мен Dockerди орнотуу үчүн Ubuntu 18.04 колдондум, андыктан сиз да ушундай кылуу үчүн 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

Кээ бир нерселерге көңүл буруш керек

Travis 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

Ушундай эле ыкманы туташуу орнотууда купуя ачкыч менен колдонсо болот, анткени серверге кирүү үчүн купуя ачкыч керек болушу мүмкүн. Ачкыч менен иштөөдө, сиз жөн гана анын Travis CI чөйрө өзгөрмөсүндө коопсуз сакталышын жана ал эч жерде көрсөтүлбөшүн камсыз кылышыңыз керек.

Дагы бир белгилей кетүүчү нерсе, сиз бүтүндөй жайылтуу скриптин бир сап катары иштетишиңиз керек болушу мүмкүн, мисалы - менен doctl. Бул кошумча күч-аракетти талап кылышы мүмкүн.

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

TLS/SSL жана Load Balancing

Мен жогоруда айтылгандардын баарын кылгандан кийин, акыркы көйгөй серверде 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 менен иштөөнү автоматташтыруу

Source: www.habr.com

Комментарий кошуу