Eng CI / CD Kette erstellen an d'Aarbecht mat Docker automatiséieren

Ech hunn meng éischt Websäiten am spéiden 90er geschriwwen. Deemools war et ganz einfach fir se an d'Aarbecht ze setzen. Et war en Apache Server op e puer gemeinsame Hosting, Dir kënnt op dëse Server iwwer FTP aloggen andeems Dir eppes schreift ftp://ftp.example.com. Da musst Dir Ären Numm a Passwuert aginn an d'Dateien op de Server eroplueden. Et waren verschidden Zäiten, alles war deemools méi einfach wéi elo.

Eng CI / CD Kette erstellen an d'Aarbecht mat Docker automatiséieren

An deenen zwee Joerzéngten zënterhier huet sech alles vill geännert. Websäite si méi komplex ginn; si musse versammelt ginn ier se an d'Produktioun verëffentlecht ginn. Een eenzege Server gouf vill Serveren hannert Laaschtbalancer lafen, an d'Benotzung vu Versiounskontrollsystemer gouf allgemeng.

Fir mäi perséinleche Projet hat ech eng speziell Konfiguratioun. An ech wousst datt ech d'Fäegkeet brauch fir de Site an der Produktioun z'installéieren andeems ech just eng Handlung ausféieren: Code an eng Branche schreiwen master op GitHub. Zousätzlech wousst ech datt fir d'Operatioun vu menger klenger Webapplikatioun ze garantéieren, ech net e risege Kubernetes Cluster wëlle verwalten, oder Docker Swarm Technologie benotzen, oder eng Flott vu Serveren mat Pods, Agenten an all aner aner erhalen. Komplexitéiten. Fir d'Zil z'erreechen, d'Aarbecht esou einfach wéi méiglech ze maachen, hunn ech misse mat CI/CD vertraut ginn.

Wann Dir e klenge Projet hutt (an dësem Fall e Node.js Projet) an Dir wëllt wësse wéi Dir d'Deployment vun dësem Projet automatiséiert, wärend Dir garantéiert datt dat wat am Repository gespäichert ass genau entsprécht wat an der Produktioun funktionnéiert, dann mengen Dir kéint an dësem Artikel interesséiert ginn.

Viraussetzungen

De Lieser vun dësem Artikel gëtt erwaart e Basisverständnis vun der Kommandozeil ze hunn a Bash Scripten ze schreiwen. Zousätzlech, wäert hien Konte brauchen Travis C.I. и DockerHub.

Zilsetzungen

Ech wäert net soen datt dësen Artikel onbedéngt als "Tutorial" genannt ka ginn. Dëst ass méi en Dokument an deem ech schwätzen iwwer dat wat ech geléiert hunn an de Prozess beschreiwen, dee mir passt fir de Code an d'Produktioun ze testen an z'installéieren, an engem automatiséierte Pass gemaach.

Dëst ass wat mäi Workflow endlech war.

Fir Code gepost an all Repository Branche ausser master, ginn déi folgend Aktiounen ausgefouert:

  • De Projet baut op Travis CI fänkt un.
  • All Eenheet, Integratioun an Enn-zu-Enn Tester ginn duerchgefouert.

Nëmmen fir Code datt falen an master, gëtt déi folgend gemaach:

  • Alles uewen ernimmt, plus ...
  • Bauen en Docker Bild baséiert op den aktuelle Code, Astellungen an Ëmfeld.
  • Deployéiert d'Bild op Docker Hub.
  • Verbindung mat der Produktioun Server.
  • Eroplueden e Bild vum Docker Hub op de Server.
  • Den aktuelle Container stoppen an en neien starten op Basis vum neie Bild.

Wann Dir absolut näischt iwwer Docker, Biller a Container wësst, maach der keng Suergen. Ech soen Iech alles doriwwer.

Wat ass CI/CD?

D'Ofkierzung CI/CD steet fir "continuous integration/continuous deployment."

▍ Kontinuéierlech Integratioun

Kontinuéierlech Integratioun ass e Prozess an deem Entwéckler sech fir den Haaptquellcode Repository vum Projet engagéieren (normalerweis eng Branche) master). Zur selwechter Zäit ass d'Qualitéit vum Code duerch automatiséiert Tester geséchert.

▍ Kontinuéierlech Détachement

Kontinuéierlech Détachement ass déi heefeg, automatiséiert Deployment vum Code an d'Produktioun. Den zweeten Deel vum CI / CD Akronym gëtt heiansdo als "kontinuéierlech Liwwerung" geschriwwe. Dëst ass am Fong d'selwecht wéi "kontinuéierlech Deployment", awer "kontinuéierlech Liwwerung" implizéiert de Besoin fir d'Ännerunge manuell ze bestätegen ier de Projet Deployment Prozess ufänkt.

Schrëtt;

D'App, déi ech benotzt hunn fir dëst alles ze léieren, gëtt genannt Notéiert. Dëst ass e Webprojet un deem ech schaffen, entworf fir Notizen ze maachen. Am Ufank hunn ech probéiert ze maachen JAMStack-Projet, oder just eng Front-End Applikatioun ouni Server, fir vun de Standard Hosting a Projet Deployment Fäegkeeten ze profitéieren déi et ubitt Netify. Wéi d'Komplexitéit vun der Applikatioun gewuess ass, brauch ech säi Serverdeel ze kreéieren, wat bedeit datt ech meng eege Strategie fir automatiséiert Integratioun an automatiséiert Deployment vum Projet musse formuléieren.

A mengem Fall ass d'Applikatioun en Express Server deen am Node.js Ëmfeld leeft, eng eenzeg Säit React Applikatioun servéiert an eng sécher Server-Säit API ënnerstëtzt. Dës Architektur follegt d'Strategie déi ka fonnt ginn dëser Voll Stack Authentifikatioun Guide.

Ech konsultéiert mat Frënd, deen en Automatisatiounsexpert ass, an hie gefrot wat ech maache muss fir datt alles funktionnéiert wéi ech wollt. Hien huet mir d'Iddi ginn wéi en automatiséierte Workflow soll ausgesinn, beschriwwen an der Ziler Sektioun vun dësem Artikel. Dës Ziler hunn gemengt datt ech muss erausfannen wéi ech Docker benotzen.

Docker

Docker ass en Tool dat, dank der Containeriséierungstechnologie, Uwendungen erlaabt einfach ze verdeelen, ofzesetzen an an deemselwechten Ëmfeld ze lafen, och wann d'Docker Plattform selwer a verschiddenen Ëmfeld leeft. Als éischt muss ech meng Hänn op den Docker Kommandozeil Tools (CLI) kréien. Uweisunge Den Docker Installatiounsguide kann net ganz kloer a verständlech genannt ginn, awer dovun kënnt Dir léieren datt fir den éischten Installatiounsschrëtt ze huelen, musst Dir Docker Desktop eroflueden (fir Mac oder Windows).

Docker Hub ass ongeféier déiselwecht Saach wéi GitHub fir git Repositories, oder Registry npm fir JavaScript Packagen. Dëst ass en Online Repository fir Docker Biller. Dëst ass wat Docker Desktop verbënnt.

Also, fir mat Docker unzefänken, musst Dir zwou Saache maachen:

Duerno kënnt Dir kucken ob den Docker CLI funktionnéiert andeems Dir de folgende Kommando leeft fir d'Docker Versioun ze kontrolléieren:

docker -v

Als nächst loggt Iech op Docker Hub un andeems Dir Äre Benotzernumm a Passwuert aginn wann Dir gefrot gëtt:

docker login

Fir Docker ze benotzen, musst Dir d'Konzepter vu Biller a Container verstoen.

▍ Biller

E Bild ass eppes wéi e Blueprint deen Instruktioune enthält fir de Container ze montéieren. Dëst ass en onverännert Snapshot vum Dateiesystem an Astellunge vun der Applikatioun. Entwéckler kënnen einfach Biller deelen.

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

Dëse Kommando wäert en Dësch mat dem folgenden Header erausginn:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Als nächst wäerte mir e puer Beispiller vu Kommandoen am selwechte Format kucken - als éischt gëtt et e Kommando mat engem Kommentar, an dann e Beispill vu wat et kann ausginn.

▍Container

E Container ass en ausführbare Package deen alles enthält wat néideg ass fir eng Applikatioun ze lafen. Eng Applikatioun mat dëser Approche funktionnéiert ëmmer d'selwecht, onofhängeg vun der Infrastruktur: an engem isoléierten Ëmfeld an an deemselwechten Ëmfeld. De Punkt ass datt Instanzen vum selwechte Bild a verschiddenen Ëmfeld lancéiert ginn.

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

▍Tag

En Tag ass eng Indikatioun fir eng spezifesch Versioun vun engem Bild.

▍ Eng séier Referenz op Docker Kommandoen

Hei ass en Iwwerbléck iwwer e puer allgemeng benotzt Docker Kommandoen.

Equipe

Kontext

Effet

docker bauen

Bild

E Bild vun engem Dockerfile bauen

docker tag

Bild

Bild Tagging

Dockerbilder

Bild

Oplëschtung Biller

Docker lafen

Container

Lafen e Container baséiert op engem Bild

docker dréckt

Bild

Eroplueden e Bild an de Registry

docker zéien

Bild

Lued e Bild aus dem Registry

docker ps

Container

Oplëschtung Container

docker System prune

Bild / Container

Ewechzehuelen onbenotzt Container a Biller

▍ Dockerfile

Ech weess wéi ech eng Produktiounsapplikatioun lokal lafen. Ech hunn eng Webpack Konfiguratioun entwéckelt fir eng fäerdeg React Applikatioun ze bauen. Als nächst hunn ech e Kommando deen e Node.js baséiert Server um Hafen ufänkt 5000. Et gesäit esou aus:

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

Et sollt bemierkt datt ech keng Beispillapplikatioun fir dëst Material hunn. Awer hei, fir Experimenter, wäert all einfach Node Applikatioun maachen.

Fir de Container ze benotzen, musst Dir Docker Instruktioune ginn. Dëst gëtt gemaach duerch eng Datei genannt Dockerfile, läit am Root Verzeechnes vum Projet. Dëse Fichier schéngt am Ufank zimlech onverständlech ze sinn.

Awer wat et enthält beschreift nëmmen, mat spezielle Kommandoen, eppes ähnlech wéi d'Ariichten vun engem Aarbechtsëmfeld. Hei sinn e puer vun dëse Kommandoen:

  • AUS - Dëse Kommando start eng Datei. Et spezifizéiert d'Basisbild op deem de Container gebaut ass.
  • KOPIER - Kopie vun Dateien vun enger lokaler Quell an e Container.
  • WORKDIR - Astellung vum Aarbechtsverzeechnes fir déi folgend Kommandoen.
  • RENN - Kommandoen lafen.
  • EXPOSÉIEREN - Port Astellunge.
  • ENTRYPOINT - Indikatioun vum Kommando auszeféieren.

Dockerfile kéint sou eppes ausgesinn:

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

Ofhängeg vum Basisbild deen Dir gewielt hutt, musst Dir eventuell zousätzlech Ofhängegkeeten installéieren. D'Tatsaach ass datt e puer Basisbiller (wéi Node Alpine Linux) erstallt ginn mam Zil se sou kompakt wéi méiglech ze maachen. Als Resultat hu se vläicht net e puer vun de Programmer déi Dir erwaart.

▍ De Container bauen, taggen a lafen

Lokal Assemblée an lancéiere vum Container ass no mir hunn Dockerfile, d'Aufgaben sinn ganz einfach. Ier Dir d'Bild op Docker Hub dréckt, musst Dir et lokal testen.

▍ Assemblée

Als éischt musst Dir sammelen e Bild, en Numm an, optional, en Tag uginn (wann en Tag net spezifizéiert ass, gëtt de System automatesch en Tag un d'Bild zouginn latest).

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

Nodeems Dir dëse Kommando ausgefouert hutt, kënnt Dir kucken datt Docker d'Bild opbaut.

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

De Bau kann e puer Minutten daueren - alles hänkt dovun of wéi vill Ofhängegkeeten Dir hutt. Wann de Bau fäerdeg ass, kënnt Dir de Kommando ausféieren docker images a kuckt op d'Beschreiwung vun Ärem neie Bild.

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

▍Start

D'Bild ass erstallt ginn. Dat heescht, datt Dir e Container baséiert op et lafen kann. Well ech wëll fäeg sinn Zougang zu der Applikatioun déi am Container leeft op localhost:5000, ech, op der lénker Säit vun der Pair 5000:5000 am nächste Kommando installéiert 5000. Op der rietser Säit ass de Container Hafen.

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

Elo datt de Container erstallt a leeft, kënnt Dir de Kommando benotzen docker ps fir Informatiounen iwwer dëse Container ze kucken (oder Dir kënnt de Kommando benotzen docker ps -a, déi Informatioun iwwer all Container weist, net nëmmen déi lafen).

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

Wann Dir elo op d'Adress gitt localhost:5000 - Dir kënnt eng Säit vun enger lafender Applikatioun gesinn déi genau d'selwecht ausgesäit wéi d'Säit vun enger Applikatioun déi an engem Produktiounsëmfeld leeft.

▍Tagging a Verëffentlechung

Fir ee vun de erstallte Biller um Produktiounsserver ze benotzen, musse mir dëst Bild vum Docker Hub eroflueden. Dëst bedeit datt Dir als éischt e Repository fir de Projet op Docker Hub musst erstellen. Duerno hu mir eng Plaz wou mir d'Bild kënne schécken. D'Bild muss ëmbenannt ginn, sou datt säin Numm mat eisem Docker Hub Benotzernumm ufänkt. Dëst sollt vum Numm vum Repository gefollegt ginn. All Tag kann um Enn vum Numm gesat ginn. Drënner ass e Beispill fir Biller ze benennen mat dësem Schema.

Elo kënnt Dir d'Bild mat engem neien Numm bauen an de Kommando ausféieren docker push fir et an den Docker Hub Repository ze drécken.

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

Wann alles gutt geet, gëtt d'Bild op Docker Hub verfügbar a kann einfach op de Server eropgeluede ginn oder op aner Entwéckler transferéiert ginn.

Nächst Schrëtt

Bis elo hu mir verifizéiert datt d'Applikatioun, a Form vun engem Docker Container, lokal leeft. Mir hunn de Container op Docker Hub eropgelueden. Dat alles bedeit, datt mir scho ganz gutt Fortschrëtter fir eist Zil gemaach hunn. Elo musse mir zwou weider Froen léisen:

  • En CI-Tool opzestellen fir Code ze testen an z'installéieren.
  • De Produktiounsserver opsetzen fir datt en eise Code eroflueden an ausféieren.

An eisem Fall benotze mir Travis C.I.. Als Server - DitigalOzean.

Et sollt bemierkt datt hei Dir eng aner Kombinatioun vu Servicer benotze kënnt. Zum Beispill, amplaz Travis CI, kënnt Dir CircleCI oder Github Actions benotzen. An amplaz DigitalOcean - AWS oder Linode.

Mir hunn decidéiert mat Travis CI ze schaffen, an ech hu schonn eppes an dësem Service konfiguréiert. Dofir, elo wäert ech kuerz iwwer schwätzen wéi et op d'Aarbecht ze preparéieren.

Travis C.I.

Travis CI ass en Tool fir Code ze testen an z'installéieren. Ech wéilt net an d'Intricacies vun der Ariichten vum Travis CI goen, well all Projet eenzegaarteg ass, an dëst wäert net vill Virdeeler bréngen. Awer ech wäert d'Grondlage ofdecken fir Iech unzefänken wann Dir decidéiert Travis CI ze benotzen. Egal ob Dir Travis CI, CircleCI, Jenkins oder soss eppes wielt, ähnlech Konfiguratiounsmethoden ginn iwwerall benotzt.

Fir mat Travis CI unzefänken, gitt op Projet Websäit a schafen e Kont. Dann integréieren Travis CI mat Ärem GitHub Kont. Wann Dir de System opstellt, musst Dir de Repository spezifizéieren mat deem Dir d'Aarbecht automatiséieren wëllt an den Zougang dozou aktivéieren. (Ech benotzen GitHub, awer ech si sécher datt Travis CI mat BitBucket, GitLab an aner ähnlech Servicer integréiere kann).

All Kéier wann Travis CI gestart gëtt, gëtt de Server lancéiert, d'Befehle ausgefouert, déi an der Konfiguratiounsdatei spezifizéiert sinn, inklusiv déi entspriechend Repositoryzweige z'installéieren.

▍ Aarbecht Liewenszyklus

Travis CI Configuratiounsdatei genannt .travis.yml an am Projet root directory gespäichert, ënnerstëtzt d'Konzept vun Evenementer Liewenszyklus Aufgaben. Dës Eventer ginn an der Reiefolleg opgelëscht an där se geschéien:

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

▍Test

An der Konfiguratiounsdatei wäert ech de lokalen Travis CI Server konfiguréieren. Ech hunn den Node 12 als Sprooch ausgewielt an de System gesot fir d'Ofhängegkeeten z'installéieren déi néideg sinn fir Docker ze benotzen.

Alles wat an opgezielt ass .travis.yml, gëtt ausgeführt wann all Pull-Ufroen un all Filialen vum Repository gemaach ginn, ausser anescht uginn. Dëst ass eng nëtzlech Feature well et heescht datt mir all Code testen, déi an de Repository kommen. Dëst léisst Iech wëssen ob de Code prett ass fir an d'Branche geschriwwe ze ginn. master, an ob et de Projet Bauprozess briechen. An dëser globaler Konfiguratioun installéieren ech alles lokal, lafen de Webpack Dev Server am Hannergrond (dëst ass eng Feature vu mengem Workflow) a lafen Tester.

Wann Dir wëllt datt Äre Repository Badges weist, déi Testofdeckung uginn, hei Dir kënnt kuerz Instruktioune fir Jest, Travis CI a Coveralls ze benotzen fir dës Informatioun ze sammelen an ze weisen.

Also hei ass den Inhalt vun der Datei .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

Dëst ass wou d'Aktiounen ophalen, déi fir all Filialen vum Repository a fir Pull-Ufroen ausgefouert ginn.

▍Deployment

Baséierend op der Virgab datt all automatiséiert Tester erfollegräich ofgeschloss hunn, kënne mir, wat fakultativ ass, de Code op de Produktiounsserver ofsetzen. Well mir wëllen dat nëmme fir Code aus der Branche maachen master, ginn mir de System entspriechend Instruktiounen an den Deployment Astellungen. Ier Dir probéiert de Code ze benotzen, dee mir nächst an Ärem Projet kucken, wëll ech Iech warnen datt Dir en aktuellt Skript muss hunn, dee fir Deployment genannt gëtt.

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

Den Deployment Skript léist zwee Probleemer:

  • Baut, markéiert a schéckt d'Bild op Docker Hub mat engem CI-Tool (an eisem Fall, Travis CI).
  • D'Bild op de Server lueden, den alen Container stoppen an en neien starten (an eisem Fall leeft de Server op der DigitalOcean Plattform).

Als éischt musst Dir en automatesche Prozess opstellen fir d'Bild op Docker Hub ze bauen, ze taggen an ze drécken. Dëst ass alles ganz ähnlech wéi dat wat mir scho manuell gemaach hunn, ausser datt mir eng Strategie brauchen fir eenzegaarteg Tags u Biller ze ginn an d'Logins automatiséieren. Ech hat Schwieregkeeten mat e puer Detailer vum Deployment Skript, wéi Tagging Strategie, Login, SSH Schlëssel Kodéierung, SSH Verbindung Etablissement. Awer glécklecherweis ass mäi Frënd ganz gutt mat Bash, wéi mat villen anere Saachen. Hien huet mir gehollef dëst Skript ze schreiwen.

Also, den éischten Deel vum Skript lued d'Bild op Docker Hub erop. Dëst ass ganz einfach ze maachen. D'Tagging Schema, déi ech benotzt hunn, beinhalt d'Kombinatioun vun engem Git Hash an engem Git Tag, wann een existéiert. Dëst garantéiert datt den Tag eenzegaarteg ass a mécht et méi einfach d'Versammlung ze identifizéieren op där se baséiert. DOCKER_USERNAME и DOCKER_PASSWORD sinn Benotzer Ëmfeld Variabelen déi mat der Travis CI Interface agestallt kënne ginn. Travis CI veraarbecht automatesch sensibel Donnéeën sou datt se net an déi falsch Hänn falen.

Hei ass den éischten Deel vum 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 den zweeten Deel vum Skript wäert sinn hänkt ganz of wéi engem Host Dir benotzt a wéi d'Verbindung domat organiséiert ass. A mengem Fall, well ech Digital Ocean benotzen, benotzen ech d'Befehle fir mam Server ze verbannen doctl. Wann Dir mat AWS schafft, gëtt den Utility benotzt aws, a sou weider.

De Server opzestellen war net besonnesch schwéier. Also hunn ech en Droplet opgestallt op Basis vum Basisbild. Et sollt bemierkt datt de System, deen ech gewielt hunn, eng eemoleg manuell Installatioun vum Docker an en eemolege manuelle Start vum Docker erfuerdert. Ech hunn Ubuntu 18.04 benotzt fir Docker z'installéieren, also wann Dir och Ubuntu benotzt fir datselwecht ze maachen, kënnt Dir just verfollegen dat einfache Guide.

Ech schwätzen hei net iwwer spezifesch Befehle fir de Service, well dësen Aspekt ka vill a verschiddene Fäll variéieren. Ech ginn just e generellen Handlungsplang deen duerchgefouert gëtt nodeems ech iwwer SSH mam Server verbonne sinn, op deem de Projet ofgesat gëtt:

  • Mir mussen de Container fannen deen am Moment leeft an et stoppen.
  • Da musst Dir en neie Container am Hannergrond starten.
  • Dir musst de lokale Port vum Server op setzen 80 - dëst wäert erlaben Iech de Site op eng Adress ze gitt wéi example.com, ouni den Hafen ze spezifizéieren, anstatt eng Adress ze benotzen wéi example.com:5000.
  • Endlech musst Dir all al Container a Biller läschen.

Hei ass d'Fortsetzung vum 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

E puer Saachen oppassen op

Et ass méiglech datt wann Dir mam Server iwwer SSH vun Travis CI verbënnt, Dir wäert eng Warnung gesinn, déi Iech verhënnert datt Dir mat der Installatioun weiderféiert, well de System op d'Äntwert vum Benotzer waart.

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

Ech hunn geléiert datt e Stringschlëssel am base64 codéiert ka ginn fir en an enger Form ze späicheren an där et bequem an zouverlässeg ka geschafft ginn. An der Installatiounsstadium kënnt Dir den ëffentleche Schlëssel decodéieren an en an eng Datei schreiwen known_hosts fir den uewe genannte Feeler ze läschen.

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

An der Praxis kann dëse Kommando esou ausgesinn:

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

An hei ass wat et produzéiert - eng base64 kodéiert String:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Hei ass de Kommando uewen ernimmt

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

Déi selwecht Approche ka mat engem private Schlëssel benotzt ginn wann Dir eng Verbindung opstellt, well Dir vläicht e private Schlëssel brauch fir op de Server ze kommen. Wann Dir mam Schlëssel schafft, musst Dir just suergen datt et sécher an enger Travis CI Ëmfeldvariabel gespäichert ass an datt et net iwwerall ugewise gëtt.

Eng aner Saach ze notéieren ass datt Dir de ganzen Deployment Skript als eng Zeil muss lafen, zum Beispill - mat doctl. Dëst kann e puer extra Effort verlaangen.

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

TLS / SSL a Load Balancing

Nodeems ech alles uewen ernimmt gemaach hunn, war de leschte Problem deen ech begéint hunn datt de Server keen SSL huet. Well ech e Node.js Server benotzen, fir ze zwéngen schaffen ëmgedréint Proxy Nginx a Let's Encrypt, Dir musst vill nidderloossen.

Ech wollt wierklech net all dës SSL Konfiguratioun manuell maachen, also hunn ech just e Lastbalancer erstallt an seng Detailer an DNS opgeholl. Am Fall vun DigitalOcean, zum Beispill, eng automatesch Erneierung selwer ënnerschriwwen Zertifikat op der Lastbalancer ze kreéieren ass eng einfach, gratis a séier Prozedur. Dës Approche huet den zousätzleche Virdeel datt et et ganz einfach mécht SSL op verschidde Serveren opzestellen, déi hannert engem Lastbalancer lafen wann néideg. Dëst erlaabt d'Servere selwer guer net iwwer SSL ze "denken", awer gläichzäiteg den Hafen wéi gewinnt ze benotzen 80. Also SSL opzemaachen op engem Lastbalancer ass vill méi einfach a méi praktesch wéi alternativ Methode fir SSL opzestellen.

Elo kënnt Dir all Ports um Server zoumaachen, déi erakommen Verbindungen akzeptéieren - ausser den Hafen 80, benotzt fir mat der Lastbalancer ze kommunizéieren, an dem Hafen 22 fir SSH. Als Resultat, e Versuch, direkt op de Server op all aner Häfen wéi dës zwee ze kommen, versoen.

Resultater

Nodeems ech alles gemaach hunn, iwwer wat ech an dësem Material geschwat hunn, hunn weder d'Docker Plattform nach d'Konzepter vun automatiséierte CI / CD Ketten mech méi Angscht gemaach. Ech konnt eng kontinuéierlech Integratiounskette opsetzen, während där de Code getest gëtt ier en an d'Produktioun geet an de Code automatesch um Server ofgesat gëtt. Dëst ass alles nach relativ nei fir mech, an ech si sécher datt et Weeër gi fir mäi automatiséierte Workflow ze verbesseren an et méi effizient ze maachen. Also wann Dir Iddien zu dëser Matière hutt, loosst mech w.e.g. wëssen. mech weess. Ech hoffen dësen Artikel huet Iech an Ären Bestriewen gehollef. Ech wëll gleewen datt Dir nodeems Dir et gelies hutt, sou vill geléiert wéi ech geléiert hunn wärend Dir alles erausfonnt wat ech dra geschwat hunn.

PS An eiser Maartplaz et gëtt e Bild Docker, déi an engem Klick installéiert ka ginn. Dir kënnt d'Operatioun vun Container kontrolléieren op VPS. All nei Clientë kréien 3 Deeg Tester gratis.

Léif Lieser! Benotzt Dir CI / CD Technologien an Äre Projeten?

Eng CI / CD Kette erstellen an d'Aarbecht mat Docker automatiséieren

Source: will.com

Setzt e Commentaire