CI/CD kate bat sortzea eta Docker-ekin lana automatizatzea

Nire lehen webguneak 90eko hamarkadaren amaieran idatzi nituen. Orduan oso erraza zen haiek lanean jartzea. Hosting partekatu batzuetan Apache zerbitzari bat zegoen, FTP bidez zerbitzari honetan saioa hasi zintezkeen antzeko zerbait idatziz ftp://ftp.example.com. Ondoren, zure izena eta pasahitza sartu eta fitxategiak zerbitzarira igo behar izan dituzu. Garai desberdinak zeuden, dena zen orain baino sinpleagoa orduan.

CI/CD kate bat sortzea eta Docker-ekin lana automatizatzea

Harrezkero bi hamarkadetan dena asko aldatu da. Webguneak konplexuagoak bihurtu dira; muntatu egin behar dira produkziora atera aurretik. Zerbitzari bakarra karga-orekatzaileen atzean exekutatzen ziren zerbitzari asko bihurtu zen, eta bertsio-kontrol sistemen erabilera ohikoa bihurtu zen.

Nire proiektu pertsonalerako konfigurazio berezi bat nuen. Eta banekien gunea ekoizpenean hedatzeko gaitasuna behar nuela ekintza bakarra eginez: adar batean kodea idaztea. master GitHub-en. Horrez gain, banekien nire web-aplikazio txikiaren funtzionamendua bermatzeko, ez nuela Kubernetes kluster handi bat kudeatu nahi, edo Docker Swarm teknologia erabili, edo zerbitzari-flota bat mantendu, pod, agente eta beste mota guztietako zerbitzariak. konplexutasunak. Lana ahalik eta errazen egiteko helburua lortzeko, CI/CD-a ezagutu behar nuen.

Proiektu txiki bat baduzu (kasu honetan, Node.js proiektu bat) eta proiektu honen hedapena nola automatizatu jakin nahi baduzu, biltegian gordetakoa ekoizpenean lan egiten duenarekin bat datorrela ziurtatzen baduzu, orduan uste artikulu hau interesatuko zaizula.

Aurrebaldintzak

Artikulu honen irakurleak komando-lerroa eta Bash script-ak idaztea oinarrizko ulermena izatea espero da. Horrez gain, kontuak beharko ditu Travis CI и Docker zentroa.

helburuak

Ez dut esango artikulu honi baldintzarik gabe "tutorial" deitu daitekeenik. Hau dokumentu bat gehiago da, non ikasi dudanari buruz hitz egiten dudan eta kodea produkzioan probatzeko eta hedatzeko egokitzen zaidan prozesua deskribatzen dudan, pasarte automatizatu batean egina.

Hau da nire lan-fluxua izan zen azkenean.

Edozein biltegi adarretan argitaratutako kodearentzat izan ezik master, ekintza hauek egiten dira:

  • Travis CIren gainean eraikitako proiektua hasten da.
  • Unitate, integrazio eta amaierako proba guztiak egiten dira.

Erortzen den kodearentzat bakarrik master, honako hau egiten da:

  • Goian aipatutako guztia, gainera...
  • Docker irudi bat eraikitzea uneko kodean, ezarpenetan eta ingurunean oinarrituta.
  • Irudia Docker Hub-en zabaltzen.
  • Ekoizpen zerbitzariarekin konexioa.
  • Docker Hub-etik irudi bat zerbitzarira kargatzen.
  • Uneko edukiontzia gelditu eta irudi berrian oinarritutako beste bat abiaraztea.

Docker, irudi eta edukiontziei buruz ezer ez badakizu, ez kezkatu. Dena kontatuko dizut.

Zer da CI/CD?

CI/CD laburdurak "etengabeko integrazioa/etengabeko hedapena" esan nahi du.

▍Etengabeko integrazioa

Etengabeko integrazioa garatzaileek proiektuaren iturburu-kodeen biltegi nagusian konpromisoak hartzen dituzten prozesu bat da (normalean adar bat). master). Aldi berean, kodearen kalitatea proba automatizatuen bidez bermatzen da.

▍Etengabeko hedapena

Etengabeko inplementazioa kodea ekoizpenean maiz eta automatikoki hedatzea da. CI/CD akronimoaren bigarren zatia batzuetan "etengabeko entrega" gisa idazten da. Funtsean, "etengabeko hedapena"ren berdina da, baina "etengabeko entrega"-k aldaketak eskuz berretsi beharra suposatzen du proiektua hedatzeko prozesua hasi aurretik.

Pizten

Hau guztia ikasteko erabili dudan aplikazioari deitzen zaio Hartu Oharra. Lantzen ari naizen web-proiektua da hau, oharrak hartzeko pentsatua. Hasieran egiten saiatu nintzen JAMSstack-proiektua, edo zerbitzaririk gabeko front-end aplikazio bat besterik ez, eskaintzen dituen hosting eta proiektuen hedapen gaitasun estandarrak aprobetxatzeko. Netlify. Aplikazioaren konplexutasuna hazi ahala, bere zerbitzariaren zatia sortu behar nuen, eta horrek esan nahi zuen nire estrategia propioa formulatu beharko nuela integrazio automatizaturako eta proiektuaren hedapen automatizaturako.

Nire kasuan, aplikazioa Node.js ingurunean exekutatzen den Express zerbitzari bat da, orrialde bakarreko React aplikazioa zerbitzatzen duena eta zerbitzariaren aldeko API segurua onartzen duena. Arkitektura honek aurki daitekeen estrategia jarraitzen du emana Pila osoa autentifikatzeko gida.

Kontsultatu nuen Lagun, automatizazioan aditua dena, eta zer egin behar nuen galdetu zidan guztiak nahi nuen moduan funtzionatzeko. Lan-fluxu automatizatu batek nolakoa izan behar duen ideia eman zidan, artikulu honetako Helburuak atalean azalduta. Helburu hauek izateak Docker nola erabili asmatu behar nuela esan nahi zuen.

Docker

Docker tresna bat da, edukiontzien teknologiari esker, aplikazioak ingurune berean erraz banatu, hedatu eta exekutatzeko aukera ematen duena, nahiz eta Docker plataforma bera ingurune ezberdinetan exekutatzen den. Lehenik eta behin, Docker komando lerroko tresnetan (CLI) eskuetan jarri behar nuen. Argibideak Docker instalatzeko gida ezin da oso argia eta ulergarria deitu, baina hortik jakin dezakezu lehen instalazioa emateko Docker Desktop deskargatu behar duzula (Mac edo Windows).

Docker Hub gutxi gorabehera gauza bera da GitHub git biltegietarako, edo erregistrorako NPM JavaScript paketeetarako. Hau Docker irudien lineako biltegia da. Honekin konektatzen da Docker Desktop.

Beraz, Docker-ekin hasteko, bi gauza egin behar dituzu:

Horren ondoren, Docker CLI-a funtzionatzen ari den egiaztatu dezakezu komando hau exekutatuz Docker bertsioa egiaztatzeko:

docker -v

Ondoren, hasi saioa Docker Hub-en zure erabiltzaile-izena eta pasahitza idatzita galdetuta:

docker login

Docker erabiltzeko, irudien eta edukiontzien kontzeptuak ulertu behar dituzu.

▍Irudiak

Irudi bat edukiontzia muntatzeko argibideak dituen plano baten antzeko zerbait da. Hau aplikazioaren fitxategi sistemaren eta ezarpenen argazki aldaezina da. Garatzaileek erraz parteka ditzakete irudiak.

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

Komando honek taula bat aterako du goiburu honekin:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Jarraian, formatu bereko komandoen adibide batzuk ikusiko ditugu; lehenik, komando bat dago iruzkin batekin, eta ondoren atera dezakeenaren adibidea.

▍Ontziak

Edukiontzi bat aplikazio bat exekutatzeko beharrezkoa den guztia daukan pakete exekutagarria da. Ikuspegi hau duen aplikazio batek beti berdin funtzionatuko du, azpiegitura edozein dela ere: ingurune isolatu batean eta ingurune berean. Kontua da irudi beraren instantziak ingurune ezberdinetan abiarazten direla.

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

▍Etiketak

Etiketa bat irudi baten bertsio zehatz baten adierazlea da.

▍Docker komandoei erreferentzia azkarra

Hona hemen erabili ohi diren Docker komando batzuen ikuspegi orokorra.

Team

Testuingurua

efektu

docker eraikitzea

irudia

Dockerfile batetik irudi bat eraikitzea

docker etiketa

irudia

Irudien etiketatzea

docker irudiak

irudia

Irudiak zerrendatzea

docker run

edukiontzi

Irudi batean oinarritutako edukiontzi bat martxan jartzea

docker push

irudia

Irudi bat erregistrora igotzea

docker tira

irudia

Erregistrotik irudi bat kargatzen

docker ps

edukiontzi

Ontziak zerrendatzea

Docker sistema inausi

Irudia/Edukiontzia

Erabiltzen ez diren ontziak eta irudiak kentzea

▍Dockerfile

Badakit ekoizpen-aplikazio bat lokalean nola exekutatu. Webpack konfigurazio bat daukat prest egindako React aplikazio bat eraikitzeko. Ondoren, atakan Node.js oinarritutako zerbitzari bat abiarazten duen komando bat daukat 5000. Honela dirudi:

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

Kontuan izan behar da ez dudala material honen aplikazio adibiderik. Baina hemen, esperimentuak egiteko, edozein Node aplikazio sinpleak balioko du.

Edukiontzia erabiltzeko, argibideak eman beharko dizkiozu Dockerri. Hau izeneko fitxategi baten bidez egiten da Dockerfile, proiektuaren erro-direktorioan kokatuta. Fitxategi honek, hasiera batean, nahiko ulertezina dirudi.

Baina daukanak, komando bereziekin, lan-ingurune bat konfiguratzearen antzeko zerbait deskribatzen du. Hona hemen komando horietako batzuk:

  • FROM — Komando honek fitxategi bat abiarazten du. Oinarrizko irudia zehazten du zein den edukiontzia eraikita.
  • COPY — Fitxategiak tokiko iturri batetik edukiontzi batera kopiatzea.
  • LAN ZUZENDARITZA — Lan-direktorioa konfiguratzea komando hauetarako.
  • RUN - Exekutatu komandoak.
  • ERAKUSI — Portuaren ezarpenak.
  • SARRERA — Exekutatu beharreko aginduaren adieraztea.

Dockerfile antzeko zerbait izan daiteke:

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

Aukeratzen duzun oinarrizko irudiaren arabera, baliteke menpekotasun gehigarriak instalatu behar izatea. Kontua da oinarrizko irudi batzuk (Node Alpine Linux esaterako) ahalik eta trinkoen egiteko helburuarekin sortzen direla. Ondorioz, baliteke espero dituzun programa batzuk ez izatea.

▍Edukiontzia eraiki, etiketatu eta martxan jartzea

Tokian tokiko muntaketa eta edukiontzia abiaraztea dugu ondoren Dockerfile, zereginak nahiko sinpleak dira. Irudia Docker Hub-era bidali aurretik, lokalean probatu behar duzu.

▍Asanblada

Lehenik eta behin bildu behar duzu irudia, izen bat eta, aukeran, etiketa bat zehaztuz (etiketa bat zehazten ez bada, sistemak automatikoki etiketa bat esleituko dio irudiari latest).

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

Komando hau exekutatu ondoren, Docker-ek irudia eraikitzen ikus dezakezu.

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

Eraikuntzak minutu pare bat behar izan ditzake - dena zenbat mendekotasun dituzun araberakoa da. Eraikuntza amaitutakoan, komandoa exekutatu dezakezu docker images eta begiratu zure irudi berriaren deskribapena.

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

▍Abian jarri

Irudia sortu da. Horrek esan nahi du edukiontzi bat exekutatu dezakezula horretan oinarrituta. Edukiontzian exekutatzen ari den aplikaziora sartu ahal izan nahi dudalako hemen localhost:5000, ni, bikotearen ezkerraldean 5000:5000 instalatutako hurrengo komandoan 5000. Eskuineko aldean edukiontzien portua dago.

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

Orain edukiontzia sortu eta martxan dagoela, komandoa erabil dezakezu docker ps edukiontzi honi buruzko informazioa ikusteko (edo komandoa erabil dezakezu docker ps -a, edukiontzi guztiei buruzko informazioa erakusten duena, ez bakarrik martxan daudenei buruzkoa).

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

Orain helbidera joaten bazara localhost:5000 — Exekutatzen den aplikazio baten orrialde bat ikus dezakezu, ekoizpen-ingurunean exekutatzen ari den aplikazio baten orriaren itxura bera duena.

▍Etiketatzea eta argitaratzea

Sortutako irudietako bat produkzio zerbitzarian erabiltzeko, irudi hau Docker Hub-etik deskargatu ahal izan behar dugu. Horrek esan nahi du lehenik proiekturako biltegi bat sortu behar duzula Docker Hub-en. Honen ostean, irudia bidaltzeko leku bat izango dugu. Irudiari izena aldatu behar zaio, bere izena gure Docker Hub erabiltzaile-izenarekin has dadin. Honen ondoren biltegiaren izena jarri behar da. Izenaren amaieran edozein etiketa jar daiteke. Jarraian, eskema hau erabiliz irudiak izendatzeko adibide bat dago.

Orain irudia izen berri batekin eraiki dezakezu eta komandoa exekutatu docker push Docker Hub biltegira bultzatzeko.

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

Dena ondo badoa, irudia eskuragarri egongo da Docker Hub-en eta erraz igo daiteke zerbitzarira edo beste garatzaile batzuetara transferitu.

Hurrengo urratsak

Oraingoz egiaztatu dugu aplikazioa, Docker edukiontzi moduan, lokalean exekutatzen ari dela. Edukiontzia Docker Hub-era kargatu dugu. Horrek guztiak esan nahi du dagoeneko oso aurrerapauso ona egin dugula gure helburua lortzeko. Orain beste bi galdera ebatzi behar ditugu:

  • Kodea probatzeko eta zabaltzeko CI tresna bat konfiguratzea.
  • Produkzio-zerbitzaria konfiguratzea, gure kodea deskargatu eta exekutatu ahal izateko.

Gure kasuan, erabiltzen dugu Travis CI. zerbitzari gisa - DitigalOcean.

Kontuan izan behar da hemen beste zerbitzu konbinazio bat erabil dezakezula. Adibidez, Travis CIren ordez, CircleCI edo Github Actions erabil ditzakezu. Eta DigitalOcean-en ordez - AWS edo Linode.

Travis CIrekin lan egitea erabaki genuen, eta dagoeneko zerbait konfiguratuta daukat zerbitzu honetan. Hori dela eta, orain laburki hitz egingo dut nola prestatu lanerako.

Travis CI

Travis CI kodea probatzeko eta zabaltzeko tresna bat da. Ez nuke Travis CI konfiguratzearen korapilatsuetan sartu nahi, proiektu bakoitza bakarra baita, eta honek ez du onura handirik ekarriko. Baina Travis CI erabiltzea erabakitzen baduzu, hasteko oinarriak azalduko ditut. Travis CI, CircleCI, Jenkins edo beste zerbait aukeratu duzun ala ez, antzeko konfigurazio-metodoak erabiliko dira nonahi.

Travis CI-rekin hasteko, joan hona proiektuaren webgunea eta sortu kontu bat. Ondoren, integratu Travis CI zure GitHub kontuarekin. Sistema konfiguratzerakoan, lana automatizatu nahi duzun biltegia zehaztu beharko duzu eta horretarako sarbidea gaitu. (GitHub erabiltzen dut, baina ziur nago Travis CI BitBucket, GitLab eta antzeko beste zerbitzu batzuekin integra daitekeela).

Travis CI abiarazten den bakoitzean, konfigurazio-fitxategian zehaztutako komandoak exekutatzen dituen zerbitzari bat abiarazten da, dagozkion biltegi-adarrak zabaltzea barne.

▍Lanaren bizi-zikloa

Travis CI konfigurazio fitxategia deitzen da .travis.yml eta proiektuaren erro-direktorioan gordeta, gertaeren kontzeptua onartzen du bizitzaren zikloa zereginak. Gertaera hauek gertatzen diren ordenaren arabera zerrendatzen dira:

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

▍Probak

Konfigurazio fitxategian tokiko Travis CI zerbitzaria konfiguratuko dut. 12. nodoa hautatu nuen hizkuntza gisa eta sistemari esan nion Docker erabiltzeko beharrezkoak diren mendekotasunak instalatzeko.

Bertan ageri den guztia .travis.yml, tira-eskaera guztiak biltegiaren adar guztiei egiten zaizkienean exekutatuko da, kontrakoa zehaztu ezean. Ezaugarri erabilgarria da, biltegira sartzen den kode guztia probatu dezakegula esan nahi baitu. Horri esker, kodea adarrean idazteko prest dagoen jakingo duzu. master, eta ea hautsiko duen proiektua eraikitzeko prozesua. Konfigurazio global honetan, dena lokalean instalatzen dut, Webpack dev zerbitzaria atzeko planoan exekutatzen dut (nire lan-fluxuaren ezaugarri bat da) eta probak exekutatzen ditut.

Zure biltegiak proba-estaldura adierazten duten bereizgarriak bistaratzea nahi baduzu, Hemen Informazio hau biltzeko eta bistaratzeko Jest, Travis CI eta Overalls erabiltzeko argibide laburrak aurki ditzakezu.

Beraz, hona hemen fitxategiaren edukia .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

Hor amaitzen dira biltegiaren adar guztietarako eta pull-eskaeretarako egiten diren ekintzak.

▍Inplementazioa

Proba automatizatu guztiak arrakastaz amaitu direlakoan oinarrituta, aukerakoa den kodea ekoizpen-zerbitzarian zabaldu dezakegu. Hau adarreko kodearentzat bakarrik egin nahi dugunez master, sistemari argibide egokiak ematen dizkiogu hedapen-ezarpenetan. Zure proiektuan hurrengo aztertuko dugun kodea erabiltzen saiatu aurretik, inplementatzeko benetako script bat izan behar duzula ohartarazi nahi dizut.

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

Inplementazio-scriptak bi arazo konpontzen ditu:

  • Eraiki, etiketatu eta bidali irudia Docker Hub-era CI tresna bat erabiliz (gure kasuan, Travis CI).
  • Irudia zerbitzarian kargatu, edukiontzi zaharra gelditu eta berri bat abiarazi (gure kasuan, zerbitzaria DigitalOcean plataforman exekutatzen da).

Lehenik eta behin, irudia eraikitzeko, etiketatzeko eta Docker Hub-era eramateko prozesu automatiko bat konfiguratu behar duzu. Hau guztia eskuz egin dugunaren oso antzekoa da, irudiei etiketa bereziak esleitzeko eta saioak automatizatzeko estrategia bat behar dugula izan ezik. Inplementazio-scriptaren xehetasun batzuekin zailtasunak izan nituen, hala nola, etiketatze-estrategia, saioa hasteko, SSH gakoen kodeketa, SSH konexioaren ezarpena. Baina, zorionez, nire mutil-laguna oso ona da bash-ekin, beste gauza askotan bezala. Berak lagundu zidan gidoi hau idazten.

Beraz, gidoiaren lehen zatia irudia Docker Hub-era kargatzen ari da. Hau egiteko nahiko erraza da. Erabili dudan etiketa-eskemak git hash eta git etiketa bat konbinatzen ditu, baldin badago. Horrek etiketa bakarra dela bermatzen du eta erraztu egiten du oinarrian dagoen muntaia identifikatzea. DOCKER_USERNAME и DOCKER_PASSWORD Travis CI interfazea erabiliz ezar daitezkeen erabiltzailearen inguruneko aldagaiak dira. Travis CIk automatikoki prozesatuko ditu datu sentikorrak, esku okerretan eror ez daitezen.

Hona hemen gidoiaren lehen zatia 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}

Gidoiaren bigarren zatia zein izango den erabiltzen ari zaren ostalariaren eta berarekiko konexioaren araberakoa da. Nire kasuan, Digital Ocean erabiltzen dudanez, komandoak erabiltzen ditut zerbitzariarekin konektatzeko dok. AWSrekin lan egiten duzunean, utilitatea erabiliko da aws, eta abar.

Zerbitzaria konfiguratzea ez zen bereziki zaila izan. Beraz, tanta bat konfiguratu dut oinarrizko irudian oinarrituta. Kontuan izan behar da aukeratu dudan sistemak Docker-en eskuzko instalazio bakar bat eta Docker-en eskuz behin-behineko abiarazte bat behar duela. Ubuntu 18.04 erabili dut Docker instalatzeko, beraz Ubuntu ere erabiltzen ari bazara gauza bera egiteko, jarraitu besterik ez duzu egin hau gida sinplea.

Ez naiz hemen zerbitzurako komando espezifikoez hitz egiten, alderdi hau asko alda daiteke eta kasu desberdinetan. Proiektua zabalduko den SSH bidez konektatu ondoren egin beharreko ekintza-plan orokorra emango dut:

  • Gaur egun martxan dagoen edukiontzia aurkitu eta gelditu behar dugu.
  • Ondoren, edukiontzi berri bat abian jarri behar duzu atzeko planoan.
  • Zerbitzariaren ataka lokala ezarri beharko duzu 80 - Honek webgunean sartzeko aukera emango dizu antzeko helbide batean example.com, ataka zehaztu gabe, bezalako helbidea erabili beharrean example.com:5000.
  • Azkenik, edukiontzi eta irudi zahar guztiak ezabatu behar dituzu.

Hona hemen gidoiaren jarraipena.

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

Erreparatzeko gauza batzuk

Baliteke Travis CI-tik SSH bidez zerbitzariari konektatzen zarenean, instalazioarekin jarraitzea eragotziko dizun abisu bat agertzea, sistema erabiltzailearen erantzunaren zain egongo baita.

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

Kate-gako bat base64-n kodetu daitekeela ikasi nuen, modu egokian eta fidagarrian lan egin ahal izateko modu batean gordetzeko. Instalazio fasean, gako publikoa deskodetu eta fitxategi batean idatzi dezakezu known_hosts goiko akatsa kentzeko.

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

Praktikan, komando hau honelakoa izan daiteke:

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

Eta hona hemen zer sortzen duen - base64 kodetutako kate bat:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Hona hemen goian aipatutako komandoa

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

Ikuspegi bera gako pribatu batekin erabil daiteke konexioa ezartzerakoan, zerbitzarian sartzeko gako pribatu bat behar duzulako. Gakoarekin lan egiten duzunean, Travis CI inguruneko aldagai batean modu seguruan gordeta dagoela ziurtatu behar duzu eta ez dela inon bistaratzen.

Kontuan izan behar den beste gauza bat da inplementazio-script osoa lerro bakarrean exekutatu beharko duzula, adibidez --rekin doctl. Honek esfortzu gehigarria eskatu dezake.

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

TLS/SSL eta karga orekatzea

Goian aipatutako guztia egin ondoren, aurkitu nuen azken arazoa zerbitzariak ez zuela SSL izan zen. Node.js zerbitzari bat erabiltzen dudanez, behartzeko lan egiteko alderantzizko proxy Nginx eta Let's Encrypt, asko aldatu behar duzu.

Benetan ez nuen SSL konfigurazio hori guztia eskuz egin nahi, beraz, karga-orekatzailea sortu eta bere xehetasunak DNSn erregistratu ditut. DigitalOcean-en kasuan, adibidez, karga-orekatzailean automatikoki berritzen den autosinatutako ziurtagiri bat sortzea prozedura sinplea, doakoa eta azkarra da. Ikuspegi honek abantaila gehigarria du: SSL oso erraza da karga-orekatzaile baten atzean exekutatzen diren hainbat zerbitzarietan konfiguratzea, behar izanez gero. Horri esker, zerbitzariek ez dute batere "pentsatu" SSL-n, baina, aldi berean, portua ohi bezala erabiltzen dute. 80. Beraz, karga-orekatzaile batean SSL konfiguratzea askoz errazagoa eta erosoagoa da SSL konfiguratzeko metodo alternatiboak baino.

Orain, sarrerako konexioak onartzen dituzten zerbitzariko ataka guztiak itxi ditzakezu, ataka izan ezik 80, karga-orekatzailearekin eta atakarekin komunikatzeko erabiltzen da 22 SSHrako. Ondorioz, bi hauek ez diren beste edozein ataketan zerbitzarira zuzenean sartzeko saiakerak huts egingo du.

Emaitzak

Material honetan hitz egin dudan guztia egin ondoren, ez Docker plataformak, ez CI/CD kate automatizatuen kontzeptuek ez naute beldurtu gehiago. Etengabeko integrazio-kate bat konfiguratu ahal izan nuen, eta bertan kodea probatu egiten da ekoizpenean sartu aurretik eta kodea automatikoki inplementatzen da zerbitzarian. Hau guztia nahiko berria da oraindik niretzat, eta ziur nago nire lan-fluxu automatizatua hobetzeko eta eraginkorragoa izateko moduak daudela. Beraz, gai honi buruzko ideiarik baduzu, mesedez, jakinarazi iezadazu. me ezagutzen. Artikulu honek zure ahaleginetan lagundu izana espero dut. Sinetsi nahi dut irakurri ondoren, nik ikasi nuen bezainbeste ikasi duzula bertan hitz egiten dudan guztia irudikatzen duzun bitartean.

PS Gure merkatua irudi bat dago Docker, klik bakarrean instalatu daitekeena. Edukiontzien funtzionamendua kontsulta dezakezu hemen VPS. Bezero berri guztiei 3 eguneko probak eskaintzen zaizkie doan.

Irakurle maitea! CI/CD teknologiak erabiltzen al dituzu zure proiektuetan?

CI/CD kate bat sortzea eta Docker-ekin lana automatizatzea

Iturria: www.habr.com

Gehitu iruzkin berria