Afirandina zincîreyek CI/CD û xebata otomatîkî ya bi Docker re

Min malperên xwe yên yekem di dawiya salên 90-an de nivîsand. Wê hingê pir hêsan bû ku wan bixe nav rêza xebatê. Li ser hin mêvandariyek hevpar serverek Apache hebû, hûn dikarin bi riya FTP-ê têkevin vê serverê bi nivîsandina tiştek mîna ftp://ftp.example.com. Dûv re pêdivî bû ku hûn nav û şîfreya xwe têkevin û pelan li serverê bar bikin. Demên cuda hebûn, wê demê her tişt ji niha sadetir bû.

Afirandina zincîreyek CI/CD û xebata otomatîkî ya bi Docker re

Di van du deh salên şûnda, her tişt gelek guherî. Malper tevlihevtir bûne; berî ku werin hilberandin divê werin berhev kirin. Yek serverek yekane bû gelek serverên ku li pişt hevsengên barkirinê dixebitin, û karanîna pergalên kontrolkirina guhertoyê gelemperî bû.

Ji bo projeya xweya kesane min vesazkirinek taybetî hebû. Û min zanibû ku min pêdivî bi şiyana belavkirina malperê di hilberînê de bi pêkanîna tenê yek kiryarê heye: nivîsandina kodê li şaxekê master li ser GitHub. Wekî din, min zanibû ku ji bo ku ez xebitandina serîlêdana xweya piçûktir a tevnvîsê piştrast bikim, min nexwest ku komek mezin a Kubernetes îdare bikim, an teknolojiya Docker Swarm bikar bînim, an fîloya pêşkêşkeran bi pods, ajans û her cûreyên din biparêze. tevliheviyên. Ji bo ku ez bigihîjim armanca ku kar bi qasî ku pêkan hêsan bikim, hewce bû ku ez bi CI/CD-ê re bibim nas.

Ger projeyek weya piçûk hebe (di vê rewşê de, projeyek Node.js) û hûn dixwazin zanibin ka meriv çawa bicîhkirina vê projeyê bixweber dike, di heman demê de piştrast dike ku tiştê ku di depoyê de tê hilanîn tam bi ya ku di hilberînê de dixebite li hev dike, wê hingê ez bifikirin ku hûn dikarin di vê gotarê de eleqedar bibin.

Pêdiviyên pêşîn

Tê payîn ku xwendevanê vê gotarê xwediyê têgihîştina bingehîn a rêzika fermanê û nivîsandina tîpên Bash be. Wekî din, ew ê hewceyê hesaban be Travis C.I. и Navenda docker.

Armancên

Ez ê nebêjim ku ev gotar bê şert û merc dikare wekî "tutorial" were gotin. Ev bêtir belgeyek e ku tê de ez li ser tiştên ku min fêr bûne diaxivim û pêvajoya ku ji bo ceribandin û bicîhkirina kodê ji hilberînê re, ku di yek derbasbûna otomatîkî de hatî çêkirin, minasib e, vedibêjim.

Ya ku xebata min bi dawî bû ev e.

Ji bo koda ku li her şaxek depoyê hatî şandin ji bilî master, çalakiyên jêrîn têne kirin:

  • Projeya avakirina li ser Travis CI dest pê dike.
  • Hemî yekîne, yekbûn û ceribandinên dawî-bi-dawî têne kirin.

Tenê ji bo koda ku dikeve nav master, jêrîn tê kirin:

  • Her tiştê ku li jor hatî destnîşan kirin, plus ...
  • Avakirina wêneyek Docker li ser bingeha kod, mîheng û hawîrdora heyî.
  • Sazkirina wêneyê li Docker Hub.
  • Girêdana bi servera hilberînê.
  • Barkirina wêneyek ji Docker Hub li serverê.
  • Rawestandina konteynera heyî û destpêkirina yek nû li ser bingeha wêneya nû.

Heke hûn di derbarê Docker, wêne û konteyneran de bi tevahî tiştek nizanin, xem nekin. Ez ê her tiştî ji we re bibêjim.

CI/CD çi ye?

Kurtenivîsa CI/CD ji bo "entegrasyona domdar / belavkirina domdar" radiweste.

▍Continuous integration

Yekbûna domdar pêvajoyek e ku tê de pêşdebiran bi depoya koda çavkaniya sereke ya projeyê (bi gelemperî şaxek master). Di heman demê de, kalîteya kodê bi ceribandina otomatîkî ve tête peyda kirin.

▍Pêkanîna domdar

Dabeşkirina domdar, birêkûpêk, otomatîzekirina kodê di hilberînê de ye. Beşa duyemîn a kurteya CI/CD carinan wekî "radestkirina domdar" tê nivîsandin. Ev di bingeh de heman "dabeşkirina domdar" e, lê "radestkirina domdar" tê vê wateyê ku berî destpêkirina pêvajoya bicîhkirina projeyê pêdivî ye ku bi destan guhertinan piştrast bikin.

Destpêkirin

Sepana ku min bikar anî ji bo fêrbûna van hemîyan tê gotin TakeNote. Ev projeyek webê ye ku ez li ser dixebitim, ji bo tomarkirinê hatî çêkirin. Di destpêkê de min hewl da ku bikim JAMStack-proje, an tenê serîlêdanek pêşîn a bê server, ji bo ku sûd ji kapasîteyên standard ên mêvandariyê û bicîhkirina projeyê ya ku ew pêşkêşî dike bikar bîne. netlify. Her ku tevliheviya serîlêdanê mezin bû, min hewce kir ku beşa servera wê biafirînim, ku tê vê wateyê ku ez ê hewce bikim ku stratejiya xwe ji bo entegrasyona otomatîkî û bicîhkirina otomatîkî ya projeyê formule bikim.

Di doza min de, serîlêdan serverek Express e ku di hawîrdora Node.js de dixebite, serîlêdanek React-a yek-rûpelî xizmet dike û API-ya server-aliyê ewledar piştgirî dike. Ev mîmarî stratejiya ku tê de tê dîtin dişopîne dayîn Rêbernameya piştrastkirina stackê ya tevahî.

Min pê re şêwir kir heval, ku pisporê otomasyonê ye, û jê pirsî ku ez çi hewce dikim ku ez bikim ku ew hemî awayê ku min dixwest bixebite. Wî fikra min da ku divê karûbarek otomatîkî çawa xuya bike, ku di beşa Armancên vê gotarê de hatî destnîşan kirin. Hebûna van armancan tê vê wateyê ku ez hewce bûm ku fêhm bikim ka meriv çawa Docker bikar tîne.

Docker

Docker amûrek e ku, bi saya teknolojiya konteynirkirinê, dihêle ku serîlêdan bi hêsanî di heman hawîrdorê de werin belav kirin, bicîh kirin û bimeşînin, hetta ku platforma Docker bixwe di hawîrdorên cûda de dimeşîne. Pêşîn, min hewce kir ku destên xwe bigihînim amûrên xeta fermanê ya Docker (CLI). Instructions Rêbernameya sazkirinê ya Docker nikare pir zelal û têgihîştî were gotin, lê ji wê hûn dikarin fêr bibin ku ji bo ku hûn gava yekem sazkirinê bavêjin, hûn hewce ne ku Docker Desktop (ji bo Mac an Windows) dakêşin.

Docker Hub hema hema heman tişt e GitHub ji bo depoyên git, an qeydê npm ji bo pakêtên JavaScript. Ev depoyek serhêl ji bo wêneyên Docker e. Ya ku Docker Desktop pê ve girêdide ev e.

Ji ber vê yekê, ji bo ku hûn bi Docker re dest pê bikin, hûn hewce ne ku du tiştan bikin:

Piştî vê yekê, hûn dikarin kontrol bikin ka Docker CLI bi xebitandina fermana jêrîn dixebitin ku guhertoya Docker kontrol bikin:

docker -v

Dûv re, gava ku jê tê pirsîn, têkevin Docker Hub-ê bi têketina navê bikarhêner û şîfreya xwe:

docker login

Ji bo ku Docker bikar bînin, divê hûn têgehên wêne û konteyneran fam bikin.

▍Wêne

Wêneyek tiştek mîna nexşeyek e ku rêwerzên ji bo komkirina konteynerê vedihewîne. Ev wêneyek neguhêrbar a pergala pelan û mîhengên serîlêdanê ye. Pêşdebir dikarin bi hêsanî wêneyan parve bikin.

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

Ev ferman dê tabloyek bi sernavê jêrîn derxe:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Dûv re em ê li çend nimûneyên fermanan di heman formatê de binihêrin - pêşî fermanek bi şîroveyek heye, û dûv re mînakek ku ew dikare çi derxe.

▍Containers

Konteynir paketek îcrakar e ku her tiştê ku ji bo meşandina serîlêdanê hewce dike vedihewîne. Serlêdanek bi vê nêzîkbûnê dê her dem bi heman rengî bixebite, bêyî binesaziyê: li hawîrdorek veqetandî û di heman hawîrdorê de. Mesele ev e ku mînakên heman wêneyê di hawîrdorên cûda de têne destpêkirin.

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

▍ Tags

Etîketek nîşana guhertoyek taybetî ya wêneyek e.

▍Navnîşanek bilez a fermanên Docker

Li vir nêrînek li ser hin fermanên Docker-ê yên ku bi gelemperî têne bikar anîn hene.

tîma

Context

tesîr

docker build

Wêne

Avakirina wêneyek ji Dockerfile

docker tag

Wêne

Nîşankirina wêneyê

wêneyên docker

Wêne

Lîsteya wêneyan

docker run

Container

Rêvekirina konteynerek li ser bingeha wêneyek

docker push

Wêne

Barkirina wêneyek ji bo qeydkirinê

docker pull

Wêne

Barkirina wêneyek ji qeydê

docker ps

Container

Lîsteya konteynir

pergala docker prune

Wêne/Konteyner

Rakirina konteynir û wêneyên neyên bikar anîn

Dockerfile

Ez dizanim ka meriv çawa serîlêdanek hilberînê li herêmî dimeşîne. Min mîhengek Webpack heye ku ji bo avakirina serîlêdanek amade-amade ya React hatî çêkirin. Dûv re, fermanek min heye ku serverek bingehîn a Node.js li ser portê dest pê dike 5000. Ev wisa xuya dike:

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

Divê were zanîn ku ji bo vê materyalê serîlêdanek min a nimûne tune. Lê li vir, ji bo ceribandinan, her serîlêdana Node ya hêsan dê bike.

Ji bo ku hûn konteynerê bikar bînin, hûn ê hewce bikin ku rêwerzan bidin Docker. Ev bi rêya pelê bi navê Dockerfile, di pelrêça root ya projeyê de cih digire. Ev pel, di destpêkê de, têra xwe nayê fam kirin.

Lê tiştê ku tê de tenê, bi fermanên taybetî, tiştek mîna sazkirina jîngehek xebatê vedibêje. Li vir çend ji van fermanan hene:

  • JI - Ev ferman pelek dest pê dike. Ew wêneya bingehîn a ku konteynir li ser hatî çêkirin diyar dike.
  • KOPÎ - Kopîkirina pelan ji çavkaniyek herêmî li konteynerek.
  • WORKDIR - Sazkirina pelrêça xebatê ji bo emrên jêrîn.
  • RUN - Ferman bimeşînin.
  • SEKINANDIN - Mîhengên portê.
  • ENTRYPOINT - Nîşana fermana ku tê kirin.

Dockerfile dibe ku tiştek mîna vê xuya bike:

# Загрузить базовый образ
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

Bi wêneya bingehîn a ku hûn hilbijêrin ve girêdayî, dibe ku hûn hewce ne ku pêwendiyên din saz bikin. Rastî ev e ku hin wêneyên bingehîn (mîna Node Alpine Linux) bi mebesta çêkirina wan bi qasî ku gengaz têne çêkirin têne afirandin. Wekî encamek, dibe ku ew hin bernameyên ku hûn hêvî dikin nebin.

▍ Avakirin, nîşankirin û xebitandina konteynerê

Civîna herêmî û destpêkirina konteynerê piştî me ye Dockerfile, kar pir hêsan in. Berî ku hûn wêneyê berbi Docker Hub ve bikişînin, hûn hewce ne ku wê li herêmî ceribandin.

▍Assembly

Pêşî hûn hewce ne ku berhev bikin wêneyek, diyarkirina navek û, vebijarkî, tagek (eger tagek neyê diyar kirin, pergal dê bixweber tagek li wêneyê bide latest).

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

Piştî xebitandina vê fermanê, hûn dikarin temaşe bikin ku Docker wêneyê ava dike.

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

Dibe ku çêkirin du hûrdeman bigire - ew hemî bi çend girêdanên we ve girêdayî ye. Dema ku avakirin qediya, hûn dikarin fermanê bimeşînin docker images û li danasîna wêneya xweya nû binêrin.

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

▍ Destpêkirin

Wêne hatiye çêkirin. Ev tê vê wateyê ku hûn dikarin li ser bingeha wê konteynerek bimeşînin. Ji ber ku ez dixwazim bikaribim bigihîjim serlêdana ku di konteynerê de tê xebitandin localhost:5000, ez, li milê çepê yê cotê 5000:5000 di fermana paşîn de hatî saz kirin 5000. Li aliyê rastê porta konteynerê ye.

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

Naha ku konteynir hate afirandin û xebitandin, hûn dikarin fermanê bikar bînin docker ps li agahdariya li ser vê konteynerê binêre (an jî hûn dikarin fermanê bikar bînin docker ps -a, ku agahdariya li ser hemî konteyneran nîşan dide, ne tenê yên xebitandinê).

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

Ger hûn niha biçin navnîşanê localhost:5000 - hûn dikarin rûpelek serîlêdana xebitandinê ya ku tam wekî rûpela serîlêdanek ku di hawîrdora hilberînê de dixebite bibînin bibînin.

▍Naşankirin û weşandin

Ji bo ku em yek ji wêneyên hatine afirandin li ser servera hilberînê bikar bînin, divê em karibin vê wêneyê ji Docker Hub dakêşin. Ev tê vê wateyê ku hûn pêşî hewce ne ku ji bo projeyê li ser Docker Hub depoyek biafirînin. Piştî vê yekê, cîhek me heye ku em dikarin wêneyê bişînin. Pêdivî ye ku wêne were guheztin da ku navê wê bi navê bikarhênerê meya Docker Hub dest pê bike. Ev divê bi navê depoyê li pey. Her etîketek dikare li dawiya navî were danîn. Li jêr mînakek binavkirina wêneyan bi karanîna vê nexşeyê ye.

Naha hûn dikarin wêneyê bi navek nû ava bikin û fermanê bimeşînin docker push da ku wê bişînin depoya 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

Ger her tişt baş biçe, wêne dê li ser Docker Hub peyda bibe û bi hêsanî dikare li serverê were barkirin an ji pêşdebirên din re were veguheztin.

Gavên din

Heya nuha me piştrast kir ku serîlêdan, di forma konteynirek Docker de, li herêmî dimeşîne. Me konteynir li Docker Hub barkiriye. Ev hemû tê wê wateyê ku me ji niha ve ber bi armanca xwe ve pêşkeftinek pir baş kiriye. Niha divê em du pirsên din çareser bikin:

  • Sazkirina amûrek CI-yê ji bo ceribandin û bicîhkirina kodê.
  • Sazkirina servera hilberînê da ku ew koda me dakêşîne û bixebite.

Di rewşa me de, em bikar tînin Travis C.I.. Wek server - DitigalOcean.

Divê were zanîn ku li vir hûn dikarin tevliheviyek din a karûbaran bikar bînin. Mînakî, li şûna Travis CI, hûn dikarin Çalakiyên CircleCI an Github bikar bînin. Û li şûna DigitalOcean - AWS an Linode.

Me biryar da ku em bi Travis CI re bixebitin, û min jixwe tiştek di vê karûbarê de hatî mîheng kirin. Ji ber vê yekê, niha ez ê bi kurtasî li ser awayê amadekirina wê ji bo xebatê biaxivim.

Travis C.I.

Travis CI amûrek ji bo ceribandin û bicîhkirina kodê ye. Ez naxwazim biçim nav tevliheviyên sazkirina Travis CI, ji ber ku her proje yekta ye, û ev ê zêde feydeyê nede. Lê heke hûn biryar bidin ku Travis CI-ê bikar bînin ez ê bingehên bingehîn vegirim da ku hûn dest pê bikin. Ma hûn Travis CI, CircleCI, Jenkins, an tiştek din hilbijêrin, dê rêbazên vesazkirinê yên bi vî rengî li her derê werin bikar anîn.

Ji bo ku hûn bi Travis CI re dest pê bikin, biçin malpera projeyê û hesabek çêbikin. Dûv re Travis CI bi hesabê xweya GitHub re yek bikin. Dema ku pergalê saz bikin, hûn ê hewce bikin ku depoya ku hûn dixwazin kar pê re otomatîk bikin û gihîştina wê çalak bikin diyar bikin. (Ez GitHub bikar tînim, lê ez piştrast im ku Travis CI dikare bi BitBucket, û GitLab, û karûbarên din ên mîna hev re yek bike).

Her gava ku Travis CI dest pê dike, serverek tê destpêkirin ku emrên ku di pelê vesazkirinê de hatine destnîşan kirin, di nav de bicîhkirina şaxên depoya têkildar jî dimeşîne.

▍Çerxa jiyana kar

Pelê veavakirina Travis CI tê gotin .travis.yml û di pelrêça root ya projeyê de hilanîn, têgeha bûyeran piştgirî dike çerxa jiyanê erkên. Ev bûyer bi rêza ku diqewimin têne navnîş kirin:

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

▍Testing

Di pelê veavakirinê de ez ê servera Travis CI ya herêmî mîheng bikim. Min Node 12 wekî ziman hilbijart û ji pergalê re got ku girêdanên ku ji bo karanîna Docker hewce ne saz bike.

Her tiştê ku tê de tête navnîş kirin .travis.yml, dê dema ku hemî daxwazên kişandinê ji hemî şaxên depoyê re bêne kirin, heya ku wekî din neyê destnîşankirin. Ev taybetmendiyek bikêr e ji ber ku ev tê vê wateyê ku em dikarin hemî kodên ku di nav depoyê de têne ceribandin. Ev dihêle hûn bizanin ka kod amade ye ku ji şaxê re were nivîsandin. master, û gelo ew ê pêvajoya avakirina projeyê bişkîne. Di vê veavakirina gerdûnî de, ez her tiştî bi herêmî saz dikim, servera dev Webpack li paşîn dimeşîne (ev taybetmendiyek xebata min e), û ceribandinan dimeşîne.

Ger hûn dixwazin depoya we nîşaneyên ku vegirtina ceribandinê destnîşan dikin nîşan bide, vir Hûn dikarin rêwerzên kurt ên li ser karanîna Jest, Travis CI û Coveralls bibînin ku vê agahiyê berhev bikin û nîşan bidin.

Ji ber vê yekê naveroka pelê li vir e .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

Li vir kiryarên ku ji bo hemî şaxên depoyê û ji bo daxwazên kişandinê têne kirin bi dawî dibin.

± Deployment

Li ser bingeha texmîna ku hemî ceribandinên otomatîkî bi serfirazî qediyan, em dikarin, ku vebijarkî ye, kodê li servera hilberînê bicîh bikin. Ji ber ku em dixwazin vê yekê tenê ji bo koda ji şaxê bikin master, em di mîhengên bicihkirinê de rêwerzên guncan didin pergalê. Berî ku hûn hewl bidin ku koda ku em ê di projeya we de paşê lê binihêrin bikar bînin, ez dixwazim we hişyar bikim ku divê hûn skrîptek rastîn a ku ji bo bicîhkirinê tê gotin hebe.

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

Skrîpta sazkirinê du pirsgirêkan çareser dike:

  • Bi karanîna amûrek CI (di doza me de, Travis CI) wêneyê ji Docker Hub re ava bikin, nîşan bikin û bişînin.
  • Barkirina wêneyê li ser serverê, sekinandina konteynera kevn û destpêkirina yek nû (di doza me de, server li ser platforma DigitalOcean dimeşe).

Pêşîn, hûn hewce ne ku pêvajoyek otomatîkî ji bo avakirin, nîşankirin û kişandina wêneyê li Docker Hub saz bikin. Ev hemî pir dişibihe ya ku me berê bi destan kiriye, ji bilî ku ji me re stratejiyek ji bo danîna tagên bêhempa li wêneyan û têketinên otomatîkî hewce dike. Min bi hin hûrguliyên skrîpta bicîhkirinê re, wek stratejiya nîşankirinê, têketinê, şîfrekirina mifteya SSH, damezrandina girêdana SSH-ê re zehmetî kişand. Lê xwezî hevalê min bi bash re, wekî gelek tiştên din, pir baş e. Wî alîkariya min kir ku vê senaryoyê binivîsim.

Ji ber vê yekê, beşa yekem a skrîptê wêneyê li Docker Hub bar dike. Ev pir hêsan e ku meriv bike. Pîlana nîşankirinê ya ku min bikar anî tevlîhevkirina git hash û git tag, heke yek hebe, pêk tîne. Ev piştrast dike ku tag yekta ye û naskirina civîna ku li ser bingeha wê ye hêsantir dike. DOCKER_USERNAME и DOCKER_PASSWORD guhêrbarên hawîrdora bikarhêner in ku dikarin bi karanîna navbeynkariya Travis CI werin danîn. Travis CI dê bixweber daneyên hesas pêvajoyê bike da ku ew nekeve destên xelet.

Li vir beşa yekem a senaryoyê ye 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}

Dê beşa duyemîn a skrîptê çi be bi tevahî bi kîjan mêvandarê ku hûn bikar tînin ve girêdayî ye û pêwendiya wê çawa tê organîze kirin. Di doza min de, ji ber ku ez Okyanûsa dîjîtal bikar tînim, ez fermanan bikar tînim ku bi serverê ve girêbide doctl. Dema ku bi AWS-ê re dixebitin, dê karûbar were bikar anîn aws, wate ya vê çîye.

Sazkirina serverê bi taybetî ne dijwar bû. Ji ber vê yekê, min dilopek li ser bingeha wêneya bingehîn saz kir. Pêdivî ye ku were zanîn ku pergala ku min hilbijart pêdivî ye ku yek-car sazkirinek bi destan a Docker û destpêkirina yek-carî ya Docker-ê hewce bike. Min Ubuntu 18.04 bikar anî da ku Docker saz bike, ji ber vê yekê heke hûn jî Ubuntu bikar tînin da ku heman bikin, hûn dikarin tenê bişopînin ev rêberê sade.

Ez li vir li ser fermanên taybetî yên ji bo karûbarê nabêjim, ji ber ku ev aliyek dikare di rewşên cûda de pir cûda bibe. Ez ê tenê plansaziyek çalakiyê ya giştî bidim ku piştî girêdana bi SSH-ê bi servera ku dê proje li ser were bicîh kirin were kirin:

  • Pêdivî ye ku em konteynera ku niha dixebite bibînin û wê bidin sekinandin.
  • Dûv re hûn hewce ne ku di paşerojê de konteynirek nû bidin destpêkirin.
  • Hûn hewce ne ku porta herêmî ya serverê saz bikin 80 - ev ê bihêle ku hûn bi navnîşek mîna malperê têkevin malperê example.com, bêyî ku portê diyar bike, ji bilî karanîna navnîşek mîna example.com:5000.
  • Di dawiyê de, hûn hewce ne ku hemî konteynir û wêneyên kevn jêbirin.

Li vir berdewamiya senaryoyê ye.

# Найти 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

Hin tiştên ku bala xwe bidin

Mimkun e ku gava hûn ji Travis CI-ê bi SSH-ê ve bi serverê ve girêdidin, hûn ê hişyariyek bibînin ku dê pêşî li we bigire ku hûn sazkirinê bidomînin ji ber ku pergal dê li benda bersiva bikarhêner bimîne.

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)?

Ez fêr bûm ku bişkojek string dikare di base64 de were kod kirin da ku ew bi rengek ku tê de bi hêsanî û pêbawer were xebitandin were hilanîn. Di qonaxa sazkirinê de, hûn dikarin mifteya giştî deşîfre bikin û li pelek binivîsin known_hosts ji bo ku ji xeletiya jorîn xilas bibe.

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

Di pratîkê de, ev ferman dikare bi vî rengî xuya bike:

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

Û li vir tiştê ku ew hildiberîne - rêzikek kodkirî ya base64:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Li vir fermana ku li jor hatî destnîşan kirin e

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

Heman nêzîkatî dikare bi mifteyek taybetî re dema ku têkiliyek saz dike were bikar anîn, ji ber ku dibe ku hûn hewceyê mifteyek taybet be ku hûn bigihîjin serverê. Dema ku bi mifteyê re dixebitin, hûn tenê hewce ne ku pê ewle bin ku ew di guhêrbarek hawîrdorê ya Travis CI de bi ewlehî tête hilanîn û ew li cîhek nayê xuyang kirin.

Tiştek din a ku divê were zanîn ev e ku dibe ku hûn hewce ne ku hûn tevaya skrîpta vesazkirinê wekî yek rêzek bimeşînin, mînakî - bi doctl. Ev dibe ku hin hewldanên zêde hewce bike.

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

TLS / SSL û Balansa Barkirinê

Piştî ku min her tiştê ku li jor hatî behs kirin kir, pirsgirêka paşîn a ku ez pê re rû bi rû bûm ev bû ku server SSL tune. Ji ber ku ez serverek Node.js bikar tînim, da ku zorê bikim kar proxy berevajî Nginx û Werin em Şîfre bikin, hûn hewce ne ku pir zêde bikin.

Min bi rastî nexwest ku hemî vê veavakirina SSL-ê bi destan bikim, ji ber vê yekê min tenê balansek barkirinê çêkir û hûrguliyên wê di DNS-ê de tomar kir. Mînakî, di mijara DigitalOcean de, afirandina sertîfîkayek xwe----------------ê li ser balansa barkirinê pêvajoyek hêsan, belaş û bilez e. Vê nêzîkatiyê feydeyek lêzêde heye ku ew sazkirina SSL-ê li ser gelek serverên ku ger hewce be li pişt hevsengek barkirinê dimeşînin pir hêsan dike. Ev dihêle server bixwe ku qet li ser SSL-ê "nefikirin", lê di heman demê de portê wekî gelemperî bikar bînin. 80. Ji ber vê yekê sazkirina SSL-ê li ser balansek barkirinê ji rêbazên alternatîf ên sazkirina SSL-ê pir hêsantir û hêsantir e.

Naha hûn dikarin hemî portên li ser servera ku girêdanên hatinê qebûl dikin - ji bilî portê bigire 80, ji bo danûstandina bi balansa barkirinê, û portê re tê bikar anîn 22 ji bo SSH. Wekî encamek, hewildanek ku rasterast bigihîje serverê li ser her portên din ji bilî van her duyan dê têk biçe.

Encam

Piştî ku min her tiştê ku min di vê materyalê de behs kir kir, ne platforma Docker û ne jî têgehên zincîreyên otomatîkî yên CI/CD-ê êdî min ditirsandin. Min karî zincîrek entegrasyonê ya domdar saz bikim, di dema ku kod berî ku bikeve hilberînê tê ceribandin û kod bixweber li ser serverê tê bicîh kirin. Ev hemî ji min re hîn nû ye, û ez pê bawer im ku rê hene ku karûbarê xweya xweya otomatîkî baştir bike û wê jêhatîtir bike. Ji ber vê yekê heke hûn di vê mijarê de ramanên we hene, ji kerema xwe ji min re agahdar bikin. ji min re zanîn. Ez hêvî dikim ku ev gotar di hewildanên we de alîkariya we kir. Ez dixwazim bawer bikim ku piştî xwendina wê, hûn bi qasî ku ez fêr bûm dema ku her tiştê ku min di wê de behs kir fêm kir.

PS Vîdeo marketplace wêneyek heye Docker, ku dikare bi yek klîk were saz kirin. Hûn dikarin li ser operasyona konteynir kontrol bikin VPS. Hemî xerîdarên nû 3 rojên ceribandinê belaş têne dayîn.

Xwendevanên delal! Ma hûn di projeyên xwe de teknolojiyên CI/CD bikar tînin?

Afirandina zincîreyek CI/CD û xebata otomatîkî ya bi Docker re

Source: www.habr.com

Add a comment