In CI / CD-ketting oanmeitsje en wurk automatisearje mei Docker

Ik skreau myn earste websiden yn 'e lette jierren '90. Doe wie it hiel maklik om se yn wurking te bringen. D'r wie in Apache-tsjinner op guon dielde hosting, jo kinne jo oanmelde by dizze server fia FTP troch soksawat te skriuwen ftp://ftp.example.com. Dan moasten jo jo namme en wachtwurd ynfiere en de bestannen uploade nei de tsjinner. Der wiene oare tiden, alles wie doe ienfâldiger as no.

In CI / CD-ketting oanmeitsje en wurk automatisearje mei Docker

Yn de twa desennia sûnt doe is alles in protte feroare. Websiden binne komplekser wurden; se moatte wurde gearstald foardat se yn produksje wurde frijlitten. Ien inkele tsjinner waard in protte servers dy't efter load balancers rinne, en it gebrûk fan ferzjekontrôlesystemen waard gewoan.

Foar myn persoanlik projekt hie ik in spesjale konfiguraasje. En ik wist dat ik de mooglikheid nedich hie om de side yn produksje yn te setten troch mar ien aksje út te fieren: koade skriuwe nei in branch master op GitHub. Derneist wist ik dat om de wurking fan myn lytse webapplikaasje te garandearjen, ik gjin enoarm Kubernetes-kluster woe beheare, of Docker Swarm-technology brûke, of in float fan servers ûnderhâlde mei pods, aginten en allerhanne oare kompleksiteiten. Om it doel te berikken om it wurk sa maklik mooglik te meitsjen, moast ik bekend wurde mei CI/CD.

As jo ​​in lyts projekt hawwe (yn dit gefal, in Node.js-projekt) en jo wolle witte hoe't jo de ynset fan dit projekt automatisearje kinne, wylst jo derfoar soargje dat wat yn 'e repository is opslein krekt oerienkomt mei wat wurket yn produksje, dan ik tink dat jo miskien wêze ynteressearre yn dit artikel.

Betingsten

De lêzer fan dit artikel wurdt ferwachte dat se in basisbegryp hawwe fan 'e kommandorigel en it skriuwen fan Bash-skripts. Dêrneist sil hy rekkens nedich wêze Travis C.I. и Docker hub.

Objektiven

Ik sil net sizze dat dit artikel sûnder betingsten in "tutorial" kin wurde neamd. Dit is mear in dokumint wêryn ik praat oer wat ik haw leard en beskriuw it proses dat by my past foar it testen en ynsetten fan koade nei produksje, útfierd yn ien automatisearre pas.

Dit is wat myn workflow úteinlik wie.

Foar koade pleatst nei eltse repository branch útsein master, wurde de folgjende aksjes útfierd:

  • It projekt boud op Travis CI begjint.
  • Alle ienheid, yntegraasje en ein-oan-ein tests wurde útfierd.

Allinne foar koade dy't falt yn master, wurdt it folgjende útfierd:

  • Alles hjirboppe neamd, plus ...
  • Bouwe in Docker-ôfbylding basearre op 'e hjoeddeistige koade, ynstellings en omjouwing.
  • De ôfbylding ynsette nei Docker Hub.
  • Ferbining mei de produksje tsjinner.
  • It opladen fan in ôfbylding fan Docker Hub nei de server.
  • De hjoeddeistige kontener stopje en in nije begjinne op basis fan de nije ôfbylding.

As jo ​​​​absolút neat witte oer Docker, ôfbyldings en konteners, meitsje jo gjin soargen. Ik sil jo der alles oer fertelle.

Wat is CI/CD?

De ôfkoarting CI/CD stiet foar "continuous integration/continuous deployment."

▍ Trochrinnende yntegraasje

Trochrinnende yntegraasje is in proses wêryn ûntwikkelders har ynsette foar it haadboarnekoaderepository fan it projekt (meastentiids in branch master). Tagelyk wurdt de kwaliteit fan 'e koade garandearre troch automatisearre testen.

▍ Trochrinnende ynset

Trochrinnende ynset is de faak, automatisearre ynset fan koade yn produksje. It twadde diel fan 'e CI / CD-akronym wurdt soms skreaun as "trochgeande levering." Dit is yn prinsipe itselde as "trochgeande ynset", mar "trochgeande levering" ymplisearret de needsaak om wizigingen manuell te befêstigjen foardat it projektynsetproses begjint.

Om te begjinnen

De app dy't ik brûkte om dit alles te learen hjit TakeNote. Dit is in webprojekt wêr't ik oan wurkje, ûntworpen om oantekeningen te meitsjen. Earst besocht ik te dwaan JAMStack-projekt, of gewoan in front-end-applikaasje sûnder in server, om te profitearjen fan de standert hosting- en projektynsetmooglikheden dy't it biedt Netify. As de kompleksiteit fan 'e applikaasje groeide, moast ik syn serverdiel oanmeitsje, wat betsjutte dat ik myn eigen strategy soe moatte formulearje foar automatisearre yntegraasje en automatisearre ynset fan it projekt.

Yn myn gefal is de applikaasje in Express-tsjinner dy't rint yn 'e Node.js-omjouwing, dy't in React-applikaasje op ien side tsjinnet en in feilige server-side API stipet. Dizze arsjitektuer folget de strategy dy't te finen is yn dizze Folsleine stack autentikaasjegids.

Ik rieplachte mei freon, dy't in automatisearringsekspert is, en frege him wat ik dwaan moast om it allegear te wurkjen sa't ik woe. Hy joech my it idee fan hoe't in automatisearre workflow der útsjen moat, sketst yn 'e seksje Doelen fan dit artikel. Dizze doelen hawwe betsjutte dat ik moast útfine hoe't ik Docker koe brûke.

Havenarbeider

Docker is in ark dat, tanksij kontenerisaasjetechnology, applikaasjes maklik yn deselde omjouwing kinne wurde ferdield, ynset en útfiere, sels as it Docker-platfoarm sels yn ferskate omjouwings rint. Earst moast ik de Docker kommandorigel-ark (CLI) yn hannen krije. Ynstruksjes De Docker-ynstallaasjegids kin net heul dúdlik en begryplik wurde neamd, mar derfan kinne jo leare dat jo Docker Desktop moatte downloade om de earste ynstallaasjestap te nimmen (foar Mac of Windows).

Docker Hub is sawat itselde ding as GitHub foar git repositories, as registry npm foar JavaScript-pakketten. Dit is in online repository foar Docker-ôfbyldings. Dit is wêrmei Docker Desktop ferbynt.

Dus, om te begjinnen mei Docker, moatte jo twa dingen dwaan:

Hjirnei kinne jo kontrolearje oft de Docker CLI wurket troch it folgjende kommando út te fieren om de Docker-ferzje te kontrolearjen:

docker -v

Meld jo dan oan by Docker Hub troch jo brûkersnamme en wachtwurd yn te fieren as frege:

docker login

Om Docker te brûken, moatte jo de begripen fan ôfbyldings en konteners begripe.

▍Ofbyldings

In ôfbylding is wat as in blauprint dy't ynstruksjes befettet foar it gearstallen fan de kontener. Dit is in ûnferoarlike momintopname fan it bestânsysteem en ynstellings fan 'e applikaasje. Untwikkelders kinne maklik ôfbyldings diele.

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

Dit kommando sil in tabel útfiere mei de folgjende koptekst:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Folgjende sille wy sjogge nei guon foarbylden fan kommando's yn itselde formaat - earst is d'r in kommando mei in opmerking, en dan in foarbyld fan wat it kin útfiere.

▍Containers

In kontener is in útfierber pakket dat alles befettet dat nedich is om in applikaasje út te fieren. In applikaasje mei dizze oanpak sil altyd itselde wurkje, nettsjinsteande de ynfrastruktuer: yn in isolearre omjouwing en yn deselde omjouwing. It punt is dat eksimplaren fan deselde ôfbylding wurde lansearre yn ferskate omjouwings.

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

▍Tags

In tag is in oantsjutting fan in spesifike ferzje fan in ôfbylding.

▍In rappe ferwizing nei Docker-kommando's

Hjir is in oersjoch fan guon faak brûkte Docker-kommando's.

team

Kontekst

effekt

docker bouwe

Ofbylding

It bouwen fan in ôfbylding fan in Dockerfile

docker tag

Ofbylding

Ofbylding tagging

docker ôfbyldings

Ofbylding

Listing ôfbyldings

docker run

Kontener

It útfieren fan in kontener basearre op in ôfbylding

docker druk

Ofbylding

It opladen fan in ôfbylding nei it register

docker trek

Ofbylding

It laden fan in ôfbylding út it register

docker ps

Kontener

Listing containers

docker systeem prune

Ofbylding / kontener

Net brûkte konteners en ôfbyldings fuortsmite

▍ Dockerfile

Ik wit hoe't jo in produksjeapplikaasje lokaal útfiere. Ik haw in Webpack-konfiguraasje ûntworpen om in klearmakke React-applikaasje te bouwen. Folgjende, ik haw in kommando dat begjint in Node.js basearre tsjinner op de haven 5000. It sjocht der sa út:

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

It moat opmurken wurde dat ik gjin foarbyldapplikaasje haw foar dit materiaal. Mar hjir, foar eksperiminten, sil elke ienfâldige Node-applikaasje dwaan.

Om de kontener te brûken, moatte jo ynstruksjes jaan oan Docker. Dit wurdt dien fia in triem neamd Dockerfile, leit yn 'e root-map fan it projekt. Dit bestân liket earst frij ûnbegryplik.

Mar wat it befettet beskriuwt allinich, mei spesjale kommando's, wat te fergelykjen mei it opsetten fan in wurkomjouwing. Hjir binne guon fan dizze kommando's:

  • FAN - Dit kommando begjint in bestân. It spesifisearret de basisôfbylding wêrop de kontener is boud.
  • KOPY - Bestannen kopiearje fan in lokale boarne nei in kontener.
  • WORKDIR - De wurkmap ynstelle foar de folgjende kommando's.
  • DRAVE - Opdrachten útfiere.
  • BLOOTSTELLING - Port ynstellings.
  • YNGONGSPUNT - Yndikaasje fan it út te fieren kommando.

Dockerfile kin der sa útsjen:

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

Ofhinklik fan 'e basisôfbylding dy't jo kieze, moatte jo miskien ekstra ôfhinklikens ynstallearje. It feit is dat guon basisôfbyldings (lykas Node Alpine Linux) binne makke mei it doel om se sa kompakt mooglik te meitsjen. As gefolch hawwe se miskien net guon fan 'e programma's dy't jo ferwachtsje.

▍ De kontener bouwe, taggje en útfiere

Lokale gearkomste en lansearring fan de kontener is na wy hawwe Dockerfile, de taken binne frij simpel. Foardat jo de ôfbylding nei Docker Hub drukke, moatte jo it lokaal testje.

▍ Gearstalling

Earst moatte jo sammelje in byld, in namme opjaan en, opsjoneel, in tag (as in tag net oantsjutte is, sil it systeem automatysk in tag oan de ôfbylding tawize latest).

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

Nei it útfieren fan dit kommando kinne jo sjen dat Docker de ôfbylding bouwe.

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

De bou kin in pear minuten duorje - it hinget allegear ôf fan hoefolle ôfhinklikens jo hawwe. As de bou foltôge is, kinne jo it kommando útfiere docker images en sjoch nei de beskriuwing fan jo nije ôfbylding.

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

▍Start

It byld is makke. Dit betsjut dat jo op basis dêrfan in kontener útfiere kinne. Om't ik wol tagong krije ta de applikaasje dy't yn 'e kontener rint by localhost:5000, my, oan de linker kant fan it pear 5000:5000 yn it folgjende kommando ynstalleare 5000. Oan de rjochterkant is de container haven.

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

No't de kontener oanmakke en rint, kinne jo it kommando brûke docker ps om ynformaasje oer dizze kontener te besjen (of jo kinne it kommando brûke docker ps -a, dy't ynformaasje toant oer alle konteners, net allinich rinnende).

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

As jo ​​no nei it adres gean localhost:5000 - jo kinne in side sjen fan in rinnende applikaasje dy't krekt itselde sjocht as de side fan in applikaasje dy't rint yn in produksjeomjouwing.

▍Tagging en publisearje

Om ien fan 'e makke ôfbyldings op' e produksjetsjinner te brûken, moatte wy dizze ôfbylding kinne downloade fan Docker Hub. Dit betsjut dat jo earst in repository moatte oanmeitsje foar it projekt op Docker Hub. Hjirnei sille wy in plak hawwe wêr't wy de ôfbylding kinne stjoere. De ôfbylding moat omneamd wurde sadat de namme begjint mei ús Docker Hub brûkersnamme. Dit moat wurde folge troch de namme fan it repository. Elke tag kin oan 'e ein fan' e namme pleatst wurde. Hjirûnder is in foarbyld fan nammen fan ôfbyldings mei dit skema.

No kinne jo de ôfbylding bouwe mei in nije namme en it kommando útfiere docker push om it nei it Docker Hub-repository te triuwen.

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

As alles goed giet, sil de ôfbylding beskikber wêze op Docker Hub en kin maklik wurde upload nei de server of oerdroegen oan oare ûntwikkelders.

Folgjende stappen

Wy hawwe no ferifiearre dat de applikaasje, yn 'e foarm fan in Docker-container, lokaal rint. Wy hawwe de kontener opladen nei Docker Hub. Dit alles betsjut dat wy al hiel goede foarútgong makke hawwe nei ús doel. No moatte wy noch twa fragen oplosse:

  • It ynstellen fan in CI-ark foar it testen en ynsetten fan koade.
  • De produksjetsjinner ynstelle sadat it ús koade kin downloade en útfiere.

Yn ús gefal brûke wy Travis C.I.. As tsjinner - DitigalOcean.

Dêrby moat opmurken wurde dat hjir kinne jo brûke in oare kombinaasje fan tsjinsten. Bygelyks, ynstee fan Travis CI, kinne jo CircleCI of Github Actions brûke. En ynstee fan DigitalOcean - AWS of Linode.

Wy besletten om te wurkjen mei Travis CI, en ik haw al wat konfigurearre yn dizze tsjinst. Dêrom, no sil ik koart prate oer hoe't jo it tariede foar wurk.

Travis C.I.

Travis CI is in ark foar it testen en ynsetten fan koade. Ik soe net graach yngean op 'e intricacies fan it opsetten fan Travis CI, om't elk projekt unyk is, en dit sil net folle foardiel bringe. Mar ik sil de basis dekke om jo te begjinnen as jo beslute om Travis CI te brûken. Oft jo Travis CI, CircleCI, Jenkins, of wat oars kieze, ferlykbere konfiguraasjemetoaden sille oeral brûkt wurde.

Om te begjinnen mei Travis CI, gean nei projekt webside en meitsje in akkount. Yntegrearje dan Travis CI mei jo GitHub-akkount. By it ynstellen fan it systeem moatte jo it repository opjaan wêrmei jo wurk automatisearje wolle en tagong ta it ynskeakelje. (Ik brûk GitHub, mar ik bin der wis fan dat Travis CI kin yntegrearje mei BitBucket, en GitLab, en oare ferlykbere tsjinsten).

Elke kear as Travis CI wurdt starte, wurdt de tsjinner lansearre, it útfieren fan de kommando's spesifisearre yn it konfiguraasjetriem, ynklusyf it ynsetten fan de oerienkommende repository-tûken.

▍ Job libbenssyklus

Travis CI konfiguraasjetriem neamd .travis.yml en opslein yn it projekt root triemtafel, stipet it konsept fan eveneminten libbenssyklus taken. Dizze eveneminten wurde neamd yn 'e folchoarder wêryn't se foarkomme:

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

▍Test

Yn it konfiguraasjetriem sil ik de lokale Travis CI-tsjinner ynstelle. Ik selektearre Node 12 as de taal en fertelde it systeem om de ôfhinklikens te ynstallearjen dy't nedich binne om Docker te brûken.

Alles wat yn stiet .travis.yml, sil wurde útfierd as alle pull-oanfragen oan alle tûken fan 'e repository dien wurde, útsein as oars oanjûn. Dit is in nuttige funksje, om't it betsjut dat wy alle koade kinne testen dy't yn it repository komme. Dit lit jo witte as de koade klear is om te skriuwen nei de branch. master, En oft it it projektbouproses sil brekke. Yn dizze globale konfiguraasje ynstallearje ik alles lokaal, rinne de Webpack dev-tsjinner op 'e eftergrûn (dit is in funksje fan myn workflow), en tests útfiere.

As jo ​​​​wolle dat jo repository ikoanen foar testdekking werjaan, hjir Jo kinne koarte ynstruksjes fine oer it brûken fan Jest, Travis CI en Coveralls om dizze ynformaasje te sammeljen en wer te jaan.

Dus hjir is de ynhâld fan it bestân .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

Dit is wêr't de aksjes dy't wurde útfierd foar alle tûken fan 'e repository en foar pull-oanfragen einigje.

▍ Ynset

Op grûn fan de oanname dat alle automatisearre tests mei súkses foltôge, kinne wy, wat opsjoneel is, de koade ynsette nei de produksjetsjinner. Sûnt wy wolle dwaan dit allinnich foar koade út de branch master, jouwe wy it systeem passende ynstruksjes yn 'e ynsetynstellingen. Foardat jo besykje de koade te brûken wêr't wy neist sille sjen yn jo projekt, wol ik jo warskôgje dat jo in wirklik skript moatte hawwe dat wurdt neamd foar ynset.

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

It ynsetskript lost twa problemen op:

  • Bou, tagje en stjoer de ôfbylding nei Docker Hub mei in CI-ark (yn ús gefal, Travis CI).
  • It laden fan de ôfbylding op 'e server, stopje de âlde kontener en begjinne in nije (yn ús gefal rint de server op it DigitalOcean-platfoarm).

Earst moatte jo in automatysk proses ynstelle foar it bouwen, taggen en triuwe de ôfbylding nei Docker Hub. Dit is allegear heul gelyk oan wat wy al hân hawwe dien, útsein dat wy in strategy nedich binne foar it tawizen fan unike tags oan ôfbyldings en it automatisearjen fan logins. Ik hie muoite mei guon details fan de ynset skript, lykas tagging strategy, login, SSH kaai kodearring, SSH ferbining fêstiging. Mar gelokkich is myn freon tige goed mei bash, lykas mei in protte oare dingen. Hy holp my dit skript te skriuwen.

Dat, it earste diel fan it skript is it uploaden fan de ôfbylding nei Docker Hub. Dit is frij maklik te dwaan. It taggingskema dat ik brûkte omfettet it kombinearjen fan in git-hash en in git-tag, as ien bestiet. Dit soarget derfoar dat de tag unyk is en makket it makliker om de gearstalling te identifisearjen wêrop it is basearre. DOCKER_USERNAME и DOCKER_PASSWORD binne brûkersomjouwingsfariabelen dy't ynsteld wurde kinne mei de Travis CI-ynterface. Travis CI sil gefoelige gegevens automatysk ferwurkje, sadat se net yn 'e ferkearde hannen falle.

Hjir is it earste diel fan it skript 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}

Wat it twadde diel fan it skript sil wêze hinget folslein ôf fan hokker host jo brûke en hoe't de ferbining dêrmei is organisearre. Yn myn gefal, om't ik Digital Ocean brûke, brûk ik de kommando's om te ferbinen mei de tsjinner doctl. By it wurkjen mei AWS sil it hulpprogramma brûkt wurde aws, ensafuorthinne.

It ynstellen fan de tsjinner wie net bysûnder dreech. Dat, ik set in droplet op basearre op it basisôfbylding. It moat opmurken wurde dat it systeem dat ik keas in ienmalige hânlieding ynstallaasje fan Docker fereasket en in ienmalige hânlieding fan Docker. Ik brûkte Ubuntu 18.04 om Docker te ynstallearjen, dus as jo ek Ubuntu brûke om itselde te dwaan, kinne jo gewoan folgje dit ienfâldige gids.

Ik praat hjir net oer spesifike kommando's foar de tsjinst, om't dit aspekt yn ferskate gefallen sterk kin ferskille. Ik sil gewoan in algemien plan fan aksje jaan dat moat wurde útfierd nei it ferbinen fia SSH nei de server wêrop it projekt sil wurde ynset:

  • Wy moatte de kontener fine dy't op it stuit rint en stopje.
  • Dan moatte jo in nije kontener op 'e eftergrûn starte.
  • Jo moatte de lokale poarte fan de tsjinner ynstelle op 80 - dit lit jo de side ynfiere op in adres lykas example.com, sûnder de poarte op te jaan, ynstee fan in adres te brûken lykas example.com:5000.
  • Uteinlik moatte jo alle âlde konteners en ôfbyldings wiskje.

Hjir is de fuortsetting fan it skript.

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

Guon dingen om omtinken te jaan

It is mooglik dat as jo ferbine mei de tsjinner fia SSH fan Travis CI, sille jo in warskôging sjen dy't jo foarkomme dat jo trochgean mei de ynstallaasje, om't it systeem sil wachtsje op it antwurd fan 'e brûker.

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

Ik learde dat in tekenrige kaai kin wurde kodearre yn base64 om it op te slaan yn in foarm wêryn it maklik en betrouber kin wurde wurke mei. Yn it ynstallaasjestadium kinne jo de iepenbiere kaai ûntsiferje en skriuwe nei in bestân known_hosts om de boppesteande flater kwyt te reitsjen.

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

Yn 'e praktyk kin dit kommando der sa útsjen:

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

En hjir is wat it produsearret - in base64 kodearre tekenrige:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Hjir is it hjirboppe neamde kommando

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

Deselde oanpak kin brûkt wurde mei in privee kaai by it oprjochtsjen fan in ferbining, om't jo miskien wol in privee kaai nedich hawwe om tagong te krijen ta de tsjinner. As jo ​​​​wurkje mei de kaai, moatte jo gewoan soargje dat it feilich wurdt opslein yn in Travis CI-omjouwingsfariabele en dat it net oeral werjûn wurdt.

In oar ding om op te merken is dat jo miskien it hiele ynsetskript as ien rigel moatte útfiere, bygelyks - mei doctl. Dit kin wat ekstra ynspannings nedich wêze.

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

TLS / SSL en Load Balancing

Neidat ik dien alles hjirboppe neamde, it lêste probleem ik tsjinkaam wie dat de tsjinner hie gjin SSL. Sûnt ik brûk in Node.js tsjinner, om te twingen wurk reverse proxy Nginx en Let's Encrypt, jo moatte in protte tinke.

Ik woe wirklik net al dizze SSL-konfiguraasje mei de hân dwaan, dus ik makke gewoan in loadbalancer en registrearre de details yn DNS. Yn it gefal fan DigitalOcean, bygelyks, it meitsjen fan in auto-fernijing sels-tekene sertifikaat op 'e load balancer is in ienfâldige, fergese en rappe proseduere. Dizze oanpak hat it tafoege foardiel dat it it heul maklik makket om SSL yn te stellen op meardere servers dy't efter in loadbalancer rinne as it nedich is. Hjirmei kinne de servers sels hielendal net "tinke" oer SSL, mar tagelyk de poarte lykas gewoanlik brûke 80. Dat it ynstellen fan SSL op in load balancer is folle makliker en handiger dan alternative metoaden foar it ynstellen fan SSL.

No kinne jo alle havens op 'e tsjinner slute dy't ynkommende ferbiningen akseptearje - útsein de poarte 80, brûkt om te kommunisearjen mei de load balancer, en de haven 22 foar SSH. As gefolch, in besykjen om direkt tagong ta de tsjinner op alle oare havens dan dizze twa sil mislearje.

Resultaten

Nei't ik alles haw dien wêr't ik oer praat yn dit materiaal, noch it Docker-platfoarm noch de begripen fan automatisearre CI / CD-keatlingen makken my mear bang. Ik koe in trochgeande yntegraasjeketen ynstelle, wêrby't de koade wurdt hifke foardat it yn produksje giet en de koade automatysk op 'e tsjinner ynset wurdt. Dit is allegear noch relatyf nij foar my, en ik bin der wis fan dat d'r manieren binne om myn automatisearre workflow te ferbetterjen en effisjinter te meitsjen. Dus as jo ideeën hawwe oer dizze saak, lit it my dan witte. me witte. Ik hoopje dat dit artikel jo hat holpen yn jo ynspanningen. Ik wol leauwe dat jo nei it lêzen safolle learden as ik learde, wylst jo alles útfine wêr't ik deryn oer praat.

PS Yn ús marketplace der is in byld Havenarbeider, dy't yn ien klik ynstallearre wurde kin. Jo kinne kontrolearje de wurking fan konteners by VPS. Alle nije kliïnten krije 3 dagen fan testen fergees.

Dear readers! Brûk jo CI / CD-technologyen yn jo projekten?

In CI / CD-ketting oanmeitsje en wurk automatisearje mei Docker

Boarne: www.habr.com

Add a comment