Ħolqien ta 'katina CI/CD u awtomatizzazzjoni tax-xogħol ma' Docker

Ktibt l-ewwel websajts tiegħi fl-aħħar tas-snin 90. Dakinhar kien faċli ħafna li tpoġġihom f'kundizzjoni tajba. Kien hemm server Apache fuq xi shared hosting, tista' tidħol f'dan is-server permezz tal-FTP billi tikteb xi ħaġa simili ftp://ftp.example.com. Imbagħad kellek iddaħħal ismek u l-password u ttella’ l-fajls fis-server. Kien hemm żminijiet differenti, dak kollu kien aktar sempliċi minn issa.

Ħolqien ta 'katina CI/CD u awtomatizzazzjoni tax-xogħol ma' Docker

Fl-għoxrin sena minn dakinhar, kollox inbidel ħafna. Il-websajts saru aktar kumplessi; iridu jiġu mmuntati qabel ma jiġu rilaxxati fil-produzzjoni. Server wieħed sar ħafna servers li jaħdmu wara load balancers, u l-użu ta 'sistemi ta' kontroll tal-verżjoni sar komuni.

Għall-proġett personali tiegħi kelli konfigurazzjoni speċjali. U kont naf li kelli bżonn il-ħila li niskjera s-sit fil-produzzjoni billi nwettaq azzjoni waħda biss: nikteb kodiċi għal fergħa master fuq GitHub. Barra minn hekk, kont naf li sabiex niżgura t-tħaddim tal-applikazzjoni żgħira tiegħi tal-web, ma ridtx niġġestixxi raggruppament kbir ta 'Kubernetes, jew nuża t-teknoloġija Docker Swarm, jew inżomm flotta ta' servers b'miżwed, aġenti u kull xorta ta 'oħrajn. kumplessitajiet. Sabiex nikseb l-għan li x-xogħol isir faċli kemm jista 'jkun, kelli bżonn insir familjari ma' CI/CD.

Jekk għandek proġett żgħir (f'dan il-każ, proġett Node.js) u tixtieq tkun taf kif tawtomatizza l-iskjerament ta' dan il-proġett, filwaqt li tiżgura li dak maħżun fir-repożitorju jaqbel eżatt ma' dak li jaħdem fil-produzzjoni, allura jien taħseb li jista 'jkun interessat f'dan l-artikolu.

Prerekwiżiti

Il-qarrej ta 'dan l-artikolu huwa mistenni li jkollu fehim bażiku tal-linja tal-kmand u jikteb skripts Bash. Barra minn hekk, se jkollu bżonn kontijiet Travis C.I. и Ċentru tad-Docker.

Għanijiet

Mhux se ngħid li dan l-artikolu jista 'jissejjaħ bla kundizzjoni "tutorja". Dan huwa aktar dokument li fih nitkellem dwar dak li tgħallimt u niddeskrivi l-proċess li jixraqli għall-ittestjar u l-iskjerament tal-kodiċi għall-produzzjoni, imwettaq f'pass wieħed awtomatizzat.

Dan huwa dak li l-fluss tax-xogħol tiegħi spiċċa.

Għal kodiċi stazzjonati fi kwalunkwe fergħa tar-repożitorju ħlief master, jitwettqu l-azzjonijiet li ġejjin:

  • Jibda l-proġett li jibni fuq Travis CI.
  • It-testijiet kollha tal-unità, tal-integrazzjoni u minn tarf sa tarf huma mwettqa.

Biss għall-kodiċi li jaqa 'fih master, isir dan li ġej:

  • Dak kollu msemmi hawn fuq, flimkien ma...
  • Bini ta 'immaġni Docker ibbażata fuq il-kodiċi, is-settings u l-ambjent attwali.
  • L-iskjerament tal-immaġni għal Docker Hub.
  • Konnessjoni mas-server tal-produzzjoni.
  • Tlugħ ta' immaġni minn Docker Hub għas-server.
  • Twaqqaf il-kontenitur attwali u tibda waħda ġdida bbażata fuq l-immaġni l-ġdida.

Jekk ma taf assolutament xejn dwar Docker, stampi u kontenituri, tinkwetax. Jien ngħidlek kollox dwarha.

X'inhu CI/CD?

L-abbrevjazzjoni CI/CD tirreferi għal "integrazzjoni kontinwa/skjerament kontinwu."

▍Integrazzjoni kontinwa

L-integrazzjoni kontinwa hija proċess li fih l-iżviluppaturi jimpenjaw ruħhom għar-repożitorju ewlieni tal-kodiċi tas-sors tal-proġett (ġeneralment fergħa master). Fl-istess ħin, il-kwalità tal-kodiċi hija żgurata permezz ta 'ttestjar awtomatizzat.

▍Skjerament kontinwu

L-iskjerament kontinwu huwa l-iskjerament frekwenti u awtomatizzat tal-kodiċi fil-produzzjoni. It-tieni parti tal-akronimu CI/CD kultant tiġi spjegata bħala "kunsinna kontinwa." Dan huwa bażikament l-istess bħal "skjerament kontinwu", iżda "twassil kontinwu" jimplika l-ħtieġa li jiġu kkonfermati manwalment il-bidliet qabel ma jibda l-proċess ta 'skjerament tal-proġett.

Getting Started

L-app li użajt biex nitgħallem dan kollu tissejjaħ Ħu Nota. Dan huwa proġett tal-web li qed naħdem fuqu, iddisinjat biex jieħu noti. Għall-ewwel ippruvajt nagħmel JAMSstack-proġett, jew sempliċiment applikazzjoni front-end mingħajr server, sabiex tieħu vantaġġ mill-kapaċitajiet standard ta' hosting u skjerament ta' proġetti li toffri Netlify. Hekk kif il-kumplessità tal-applikazzjoni kibret, kelli bżonn noħloq il-parti tas-server tagħha, li fisser li jkolli bżonn nifformula l-istrateġija tiegħi stess għall-integrazzjoni awtomatizzata u l-iskjerament awtomatizzat tal-proġett.

Fil-każ tiegħi, l-applikazzjoni hija server Express li jaħdem fl-ambjent Node.js, li jservi applikazzjoni React b'paġna waħda u li jappoġġa API sigura min-naħa tas-server. Din l-arkitettura ssegwi l-istrateġija li tista 'tinstab fiha dan Gwida sħiħa tal-awtentikazzjoni tal-munzell.

I kkonsultat ma ħabib, li huwa espert tal-awtomazzjoni, u staqsieh x'għandi bżonn nagħmel biex kollox jaħdem kif ridt. Huwa tani l-idea ta’ kif għandu jidher fluss tax-xogħol awtomatizzat, deskritt fit-taqsima Għanijiet ta’ dan l-artikolu. Li jkolli dawn l-għanijiet fisser li kelli bżonn nifhem kif nuża Docker.

Docker

Docker hija għodda li, bis-saħħa tat-teknoloġija tal-kontejners, tippermetti li l-applikazzjonijiet jiġu distribwiti, skjerati u mħaddma faċilment fl-istess ambjent, anke jekk il-pjattaforma Docker nnifisha taħdem f'ambjenti differenti. L-ewwel, kelli bżonn nagħmel idejja fuq l-għodod tal-linja tal-kmand Docker (CLI). Istruzzjonijiet Il-gwida għall-installazzjoni ta 'Docker ma tistax tissejjaħ ċara u tinftiehem ħafna, iżda minnha tista' titgħallem li biex tieħu l-ewwel pass ta 'installazzjoni, trid tniżżel Docker Desktop (għall-Mac jew il-Windows).

Docker Hub huwa bejn wieħed u ieħor l-istess ħaġa bħal GitHub għal repożitorji git, jew reġistru npm għal pakketti JavaScript. Dan huwa repożitorju onlajn għall-immaġini Docker. Dan huwa dak li jgħaqqad Docker Desktop.

Allura, sabiex tibda ma 'Docker, trid tagħmel żewġ affarijiet:

Wara dan, tista 'tiċċekkja jekk id-Docker CLI tkunx qed taħdem billi tħaddem il-kmand li ġej biex tiċċekkja l-verżjoni Docker:

docker -v

Sussegwentement, idħol fid-Docker Hub billi ddaħħal l-isem tal-utent u l-password tiegħek meta mitlub:

docker login

Biex tuża Docker, trid tifhem il-kunċetti ta 'immaġini u kontenituri.

▍Immaġini

Immaġini hija xi ħaġa bħal blueprint li fiha struzzjonijiet għall-assemblaġġ tal-kontenitur. Din hija stampa immutabbli tas-sistema tal-fajls u l-issettjar tal-applikazzjoni. L-iżviluppaturi jistgħu faċilment jaqsmu immaġini.

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

Dan il-kmand joħroġ tabella bl-intestatura li ġejja:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Sussegwentement se nħarsu lejn xi eżempji ta 'kmandi fl-istess format - l-ewwel hemm kmand b'kumment, u mbagħad eżempju ta' x'jista' joħroġ.

▍Kontenituri

Kontenitur huwa pakkett eżekutibbli li fih dak kollu meħtieġ biex titħaddem applikazzjoni. Applikazzjoni b'dan l-approċċ dejjem taħdem l-istess, irrispettivament mill-infrastruttura: f'ambjent iżolat u fl-istess ambjent. Il-punt huwa li każijiet ta 'l-istess immaġni huma mnedija f'ambjenti differenti.

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

▍Tags

Tikketta hija indikazzjoni ta 'verżjoni speċifika ta' immaġini.

▍Referenza rapida għall-kmandi Docker

Hawn ħarsa ġenerali lejn xi kmandi Docker użati b'mod komuni.

Team

Kuntest

Действие

docker build

Immaġni

Bini ta 'immaġni minn Dockerfile

tag docker

Immaġni

Tikkettar tal-immaġni

Docker images

Immaġni

Elenkar immaġini

docker run

Kontenitur

Tmexxi kontenitur ibbażat fuq immaġni

imbotta docker

Immaġni

Tlugħ ta' immaġni fir-reġistru

docker pull

Immaġni

Tagħbija ta' immaġni mir-reġistru

docker ps

Kontenitur

Elenkar ta' kontenituri

pruna sistema docker

Immaġni/Kontenitur

Tneħħija ta' kontenituri u stampi mhux użati

▍Dockerfile

Naf kif imexxi applikazzjoni ta' produzzjoni lokalment. Għandi konfigurazzjoni Webpack iddisinjata biex nibni applikazzjoni React lesta. Sussegwentement, għandi kmand li jibda server ibbażat fuq Node.js fuq il-port 5000. Jidher bħal dan:

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

Għandu jiġi nnutat li m'għandix applikazzjoni eżempju għal dan il-materjal. Iżda hawn, għall-esperimenti, kwalunkwe applikazzjoni sempliċi Node se tagħmel.

Sabiex tuża l-kontenitur, ikollok bżonn tagħti istruzzjonijiet lil Docker. Dan isir permezz ta 'fajl imsejjaħ Dockerfile, li jinsab fid-direttorju tal-għeruq tal-proġett. Dan il-fajl, għall-ewwel, jidher pjuttost inkomprensibbli.

Imma dak li fih jiddeskrivi biss, bi kmandi speċjali, xi ħaġa simili għat-twaqqif ta 'ambjent tax-xogħol. Hawn huma xi wħud minn dawn il-kmandi:

  • MINN — Dan il-kmand jibda fajl. Jispeċifika l-immaġni bażi li fuqha huwa mibni l-kontenitur.
  • KOPJA — Tikkopja fajls minn sors lokali għal kontenitur.
  • XOGĦOL DIR — L-issettjar tad-direttorju tax-xogħol għall-kmandi li ġejjin.
  • RUN - Mexxi kmandi.
  • ESPOŻI — Issettjar tal-port.
  • PUNT TA' DĦUL — Indikazzjoni tal-kmand li għandu jiġi esegwit.

Dockerfile jista' jidher xi ħaġa bħal din:

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

Skont l-immaġni bażi li tagħżel, jista 'jkollok bżonn tinstalla dipendenzi addizzjonali. Il-fatt hu li xi immaġini bażi (bħal Node Alpine Linux) huma maħluqa bil-għan li jagħmluhom kemm jista 'jkun kompatti. Bħala riżultat, jistgħu ma jkollhomx xi wħud mill-programmi li tistenna.

▍Il-bini, it-tikkettar u t-tmexxija tal-kontenitur

L-assemblaġġ lokali u t-tnedija tal-kontenitur huwa wara li għandna Dockerfile, il-kompiti huma pjuttost sempliċi. Qabel ma timbotta l-immaġni għal Docker Hub, trid tittestjaha lokalment.

▍ Assemblea

L-ewwel trid tiġbor immaġni, billi tispeċifika isem u, b'għażla, tikketta (jekk tikketta ma tkunx speċifikata, is-sistema awtomatikament tassenja tikketta lill-immaġni latest).

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

Wara li tmexxi dan il-kmand, tista 'tara Docker jibni l-immaġni.

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

Il-bini jista 'jieħu ftit minuti - kollox jiddependi fuq kemm għandek dipendenzi. Ladarba l-bini tkun kompluta, tista 'tmexxi l-kmand docker images u ħares lejn id-deskrizzjoni tal-immaġni l-ġdida tiegħek.

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

▍Tnedija

L-immaġni ġiet maħluqa. Dan ifisser li tista 'tmexxi kontenitur ibbażat fuqu. Minħabba li nixtieq inkun kapaċi jaċċessa l-applikazzjoni li taħdem fil-kontenitur fi localhost:5000, jien, fuq in-naħa tax-xellug tal-par 5000:5000 fil-kmand li jmiss installat 5000. Fuq in-naħa tal-lemin hemm il-port tal-kontejners.

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

Issa li l-kontenitur huwa maħluq u qed jaħdem, tista 'tuża l-kmand docker ps biex tħares lejn informazzjoni dwar dan il-kontenitur (jew tista' tuża l-kmand docker ps -a, li turi informazzjoni dwar il-kontenituri kollha, mhux biss dawk li jaħdmu).

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

Jekk issa tmur fl-indirizz localhost:5000 — tista' tara paġna ta' applikazzjoni li taħdem li tidher eżattament l-istess bħall-paġna ta' applikazzjoni li taħdem f'ambjent ta' produzzjoni.

▍Taggjar u pubblikazzjoni

Sabiex nużaw waħda mill-immaġini maħluqa fuq is-server tal-produzzjoni, jeħtieġ li nkunu nistgħu tniżżel din l-immaġni minn Docker Hub. Dan ifisser li l-ewwel trid toħloq repożitorju għall-proġett fuq Docker Hub. Wara dan, ikollna post fejn nistgħu nibagħtu l-immaġni. L-immaġini jeħtieġ li tingħata isem ġdid sabiex isimha jibda bl-isem tal-utent tagħna Docker Hub. Dan għandu jkun segwit mill-isem tar-repożitorju. Kwalunkwe tikketta tista 'titqiegħed fl-aħħar ta' l-isem. Hawn taħt hemm eżempju ta 'l-ismijiet ta' immaġini bl-użu ta 'din l-iskema.

Issa tista 'tibni l-immaġni b'isem ġdid u tmexxi l-kmand docker push biex timbottaha għar-repożitorju ta' 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

Jekk kollox imur tajjeb, l-immaġni tkun disponibbli fuq Docker Hub u tista 'faċilment tittella' fuq is-server jew trasferita lil żviluppaturi oħra.

Il-passi li jmiss

Sa issa vverifikajna li l-applikazzjoni, fil-forma ta’ kontenitur Docker, qed taħdem lokalment. Aħna tellajna l-kontenitur fuq Docker Hub. Dan kollu jfisser li diġà għamilna progress tajjeb ħafna lejn l-għan tagħna. Issa rridu nsolvu żewġ mistoqsijiet oħra:

  • Twaqqif ta 'għodda CI għall-ittestjar u l-iskjerament tal-kodiċi.
  • Twaqqif tas-server tal-produzzjoni sabiex ikun jista' tniżżel u jħaddem il-kodiċi tagħna.

Fil-każ tagħna, nużaw Travis C.I.. Bħala server - DitigalOcean.

Ta’ min jinnota li hawnhekk tista’ tuża kombinazzjoni oħra ta’ servizzi. Pereżempju, minflok Travis CI, tista 'tuża CircleCI jew Github Actions. U minflok DigitalOcean - AWS jew Linode.

Iddeċidejna li naħdmu ma' Travis CI, u diġà għandi xi ħaġa kkonfigurata f'dan is-servizz. Għalhekk, issa se nitkellem fil-qosor dwar kif tippreparaha għax-xogħol.

Travis C.I.

Travis CI hija għodda għall-ittestjar u l-iskjerament tal-kodiċi. Ma nixtieqx nidħol fl-intricacies tat-twaqqif ta 'Travis CI, peress li kull proġett huwa uniku, u dan mhux se jġib ħafna benefiċċju. Imma nkopri l-affarijiet bażiċi biex tibda jekk tiddeċiedi li tuża Travis CI. Kemm jekk tagħżel Travis CI, CircleCI, Jenkins, jew xi ħaġa oħra, metodi ta 'konfigurazzjoni simili se jintużaw kullimkien.

Biex tibda b'Travis CI, mur fuq websajt tal-proġett u toħloq kont. Imbagħad integra Travis CI mal-kont GitHub tiegħek. Meta twaqqaf is-sistema, ikollok bżonn tispeċifika r-repożitorju li bih trid awtomat ix-xogħol u tippermetti aċċess għaliha. (Jien nuża GitHub, imma jien ċert li Travis CI jista 'jintegra ma' BitBucket, u GitLab, u servizzi simili oħra).

Kull darba li jinbeda Travis CI, is-server jiġi mniedi, billi jesegwixxi l-kmandi speċifikati fil-fajl tal-konfigurazzjoni, inkluż l-iskjerament tal-fergħat tar-repożitorju korrispondenti.

▍Iċ-ċiklu tal-ħajja tax-xogħol

Fajl tal-konfigurazzjoni Travis CI imsejjaħ .travis.yml u maħżuna fid-direttorju tal-għeruq tal-proġett, jappoġġja l-kunċett ta 'avvenimenti ċiklu tal-ħajja ħidmiet. Dawn l-avvenimenti huma elenkati fl-ordni li fihom iseħħu:

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

▍Ittestjar

Fil-fajl tal-konfigurazzjoni ser nikkonfigura s-server lokali Travis CI. Għażilt in-Node 12 bħala l-lingwa u għedt lis-sistema biex tinstalla d-dipendenzi meħtieġa biex tuża Docker.

Dak kollu li huwa elenkat fih .travis.yml, se jiġu eżegwiti meta t-talbiet kollha tal-ġibda jsiru lill-fergħat kollha tar-repożitorju, sakemm ma jkunx speċifikat mod ieħor. Din hija karatteristika utli għaliex dan ifisser li nistgħu nittestjaw il-kodiċi kollu li jidħol fir-repożitorju. Dan iħallik tkun taf jekk il-kodiċi huwiex lest biex jinkiteb lill-fergħa. master, u jekk hux se jkisser il-proċess tal-bini tal-proġett. F'din il-konfigurazzjoni globali, ninstalla kollox lokalment, inħaddem is-server dev Webpack fl-isfond (din hija karatteristika tal-fluss tax-xogħol tiegħi), u nmexxi testijiet.

Jekk trid li r-repożitorju tiegħek juri badges li jindikaw il-kopertura tat-test, hawn Tista' ssib struzzjonijiet qosra dwar l-użu ta' Jest, Travis CI u Coveralls biex tiġbor u turi din l-informazzjoni.

Allura hawnhekk huwa l-kontenut tal-fajl .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

Dan huwa fejn jispiċċaw l-azzjonijiet li jitwettqu għall-fergħat kollha tar-repożitorju u għal talbiet ta 'ġibda.

▍Skjerament

Ibbażat fuq is-suppożizzjoni li t-testijiet awtomatizzati kollha tlestew b'suċċess, nistgħu, li hija fakultattiva, niskjeraw il-kodiċi fis-server tal-produzzjoni. Peress li rridu nagħmlu dan biss għall-kodiċi mill-fergħa master, aħna nagħtu lis-sistema istruzzjonijiet xierqa fis-settings tal-iskjerament. Qabel ma tipprova tuża l-kodiċi li se nħarsu lejh li jmiss fil-proġett tiegħek, nixtieq inwissik li jrid ikollok skript attwali msejjaħ għall-iskjerament.

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

L-iskrittura tal-iskjerament issolvi żewġ problemi:

  • Ibni, ittikketta u ibgħat l-immaġni lil Docker Hub billi tuża għodda CI (fil-każ tagħna, Travis CI).
  • Tagħbija tal-immaġni fuq is-server, twaqqaf il-kontenitur il-qadim u tibda waħda ġdida (fil-każ tagħna, is-server jaħdem fuq il-pjattaforma DigitalOcean).

L-ewwel, trid twaqqaf proċess awtomatiku għall-bini, it-tikkettar u l-imbuttar tal-immaġni lejn Docker Hub. Dan kollu huwa simili ħafna għal dak li diġà għamilna manwalment, ħlief li neħtieġu strateġija għall-assenjazzjoni ta 'tags uniċi għal stampi u awtomatizzazzjoni tal-logins. Kelli diffikultà b'xi dettalji tal-iskrittura tal-iskjerament, bħal strateġija ta 'tikkettar, login, kodifikazzjoni taċ-ċavetta SSH, stabbiliment tal-konnessjoni SSH. Iżda fortunatament l-għarus tiegħi huwa tajjeb ħafna bil-bash, bħal ma 'ħafna affarijiet oħra. Huwa għeni nikteb din l-iskrittura.

Għalhekk, l-ewwel parti tal-iskrittura qed ittella 'l-immaġni fuq Docker Hub. Dan huwa pjuttost faċli li tagħmel. L-iskema ta 'tagging li użajt tinvolvi li tikkombina git hash u git tag, jekk teżisti waħda. Dan jiżgura li t-tikketta hija unika u tagħmilha aktar faċli li tiġi identifikata l-assemblaġġ li fuqha hija bbażata. DOCKER_USERNAME и DOCKER_PASSWORD huma varjabbli tal-ambjent tal-utent li jistgħu jiġu stabbiliti bl-użu tal-interface Travis CI. Travis CI se jipproċessa dejta sensittiva awtomatikament sabiex ma taqax f'idejn ħżiena.

Hawnhekk hawn l-ewwel parti tal-iskrittura 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}

X'se tkun it-tieni parti tal-iskrittura jiddependi għal kollox fuq liema host qed tuża u kif il-konnessjoni magħha hija organizzata. Fil-każ tiegħi, peress li nuża Digital Ocean, nuża l-kmandi biex nikkonnettja mas-server doctl. Meta taħdem ma 'AWS, se tintuża l-utilità aws, u l-bqija.

It-twaqqif tas-server ma kienx partikolarment diffiċli. Allura, waqqaft qtar ibbażat fuq l-immaġni bażi. Għandu jiġi nnutat li s-sistema li għażilt teħtieġ installazzjoni manwali ta 'darba ta' Docker u tnedija manwali ta 'darba ta' Docker. Jien użajt Ubuntu 18.04 biex ninstalla Docker, allura jekk qed tuża wkoll Ubuntu biex tagħmel l-istess, tista 'sempliċement issegwi din gwida sempliċi.

Mhux qed nitkellem hawn dwar kmandi speċifiċi għas-servizz, peress li dan l-aspett jista 'jvarja ħafna f'każijiet differenti. Se nagħti biss pjan ġenerali ta' azzjoni li għandu jitwettaq wara li nikkonnettja permezz ta' SSH mas-server li fuqu se jiġi skjerat il-proġett:

  • Irridu nsibu l-kontenitur li qed jaħdem bħalissa u nwaqqfuh.
  • Imbagħad għandek bżonn tniedi kontenitur ġdid fl-isfond.
  • Ikollok bżonn issettja l-port lokali tas-server għal 80 - dan jippermettilek tidħol fis-sit f'indirizz simili example.com, mingħajr ma tispeċifika l-port, aktar milli tuża indirizz simili example.com:5000.
  • Fl-aħħarnett, għandek bżonn tħassar il-kontenituri u l-immaġini qodma kollha.

Hawnhekk hawn il-kontinwazzjoni tal-iskrittura.

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

Xi affarijiet li tagħti attenzjoni għalihom

Huwa possibbli li meta tikkonnettja mas-server permezz ta' SSH minn Travis CI, tara twissija li tipprevjenik milli tkompli bl-installazzjoni peress li s-sistema tistenna r-rispons tal-utent.

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

Tgħallimt li ċavetta string tista 'tiġi kodifikata f'base64 sabiex issalvaha f'forma li fiha tista' tinħadem magħha b'mod konvenjenti u affidabbli. Fl-istadju tal-installazzjoni, tista 'tiddekodifika ċ-ċavetta pubblika u tiktebha f'fajl known_hosts sabiex teħles mill-iżball ta 'hawn fuq.

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

Fil-prattika, dan il-kmand jista' jidher bħal dan:

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

U hawn x'jipproduċi - string kodifikata base64:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Hawn hu l-kmand imsemmi hawn fuq

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

L-istess approċċ jista 'jintuża ma' ċavetta privata meta tiġi stabbilita konnessjoni, peress li jista 'jkollok bżonn ċavetta privata biex taċċessa s-server. Meta taħdem maċ-ċavetta, għandek bżonn biss li tiżgura li hija maħżuna b'mod sigur f'varjabbli tal-ambjent Travis CI u li ma tintwera imkien.

Ħaġa oħra li għandek tinnota hija li jista 'jkollok bżonn tmexxi l-iskript tal-iskjerament kollu bħala linja waħda, pereżempju - ma doctl. Dan jista 'jeħtieġ xi sforz żejjed.

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

TLS/SSL u Ibbilanċjar tat-Tagħbija

Wara li għamilt dak kollu msemmi hawn fuq, l-aħħar problema li ltqajt magħha kienet li s-server ma kellux SSL. Peress li nuża server Node.js, sabiex nisforza СЂР ° Р ± отР° ть reverse proxy Nginx u Let's Encrypt, għandek bżonn tinker ħafna.

Verament ma ridtx nagħmel din il-konfigurazzjoni SSL kollha manwalment, għalhekk ħloqt biss load balancer u rreġistrajt id-dettalji tiegħu fid-DNS. Fil-każ ta 'DigitalOcean, pereżempju, il-ħolqien ta' ċertifikat awto-ffirmat li jiġġedded awtomatikament fuq il-load balancer hija proċedura sempliċi, ħielsa u veloċi. Dan l-approċċ għandu l-benefiċċju miżjud li jagħmilha faċli ħafna li twaqqaf SSL fuq servers multipli li jaħdmu wara load balancer jekk meħtieġ. Dan jippermetti lis-servers infushom li ma "jaħsbu" xejn dwar SSL, iżda fl-istess ħin jużaw il-port bħas-soltu 80. Allura t-twaqqif ta 'SSL fuq load balancer huwa ħafna aktar faċli u aktar konvenjenti minn metodi alternattivi ta' twaqqif ta 'SSL.

Issa tista 'tagħlaq il-portijiet kollha fuq is-server li jaċċettaw konnessjonijiet deħlin - ħlief il-port 80, użati biex jikkomunikaw mal-balancer tat-tagħbija, u l-port 22 għal SSH. Bħala riżultat, tentattiv biex jaċċessa direttament is-server fuq kwalunkwe portijiet minbarra dawn it-tnejn se jfalli.

Riżultati ta '

Wara li għamilt dak kollu li tkellimt dwaru f'dan il-materjal, la l-pjattaforma Docker u lanqas il-kunċetti ta 'ktajjen CI/CD awtomatizzati ma beżgħuni aktar. Kont kapaċi nwaqqaf katina ta' integrazzjoni kontinwa, li matulha l-kodiċi jiġi ttestjat qabel ma jidħol fil-produzzjoni u l-kodiċi jiġi skjerat awtomatikament fuq is-server. Dan kollu għadu relattivament ġdid għalija, u jien ċert li hemm modi kif intejjeb il-fluss tax-xogħol awtomatizzat tiegħi u nagħmilha aktar effiċjenti. Mela jekk għandek xi ideat dwar din il-kwistjoni, jekk jogħġbok għarrafni. me taf. Nispera li dan l-artikolu għenek fl-isforzi tiegħek. Irrid nemmen li wara li qrajtu, tgħallimt kemm tgħallimt jien waqt li kont qed insib dak kollu li tkellimt fih.

PS Fil-tagħna suq hemm immaġini Docker, li jistgħu jiġu installati fi klikk waħda. Tista' tiċċekkja l-operat tal-kontenituri fuq VPS. Il-klijenti l-ġodda kollha jingħataw 3 ijiem ta 'ttestjar mingħajr ħlas.

Għeżież qarrejja! Tuża teknoloġiji CI/CD fil-proġetti tiegħek?

Ħolqien ta 'katina CI/CD u awtomatizzazzjoni tax-xogħol ma' Docker

Sors: www.habr.com

Żid kumment