Crià una catena CI / CD è automatizà u travagliu cù Docker

Aghju scrittu i mo primi siti web à a fini di l'anni 90. Allora era assai faciule di mette in cundizione di travagliu. Ci era un servitore Apache in qualchì hosting spartutu, stu servitore puderia esse accessu via FTP scrivendu in a linea di navigatore qualcosa cum'è ftp://ftp.example.com. Allora era necessariu entre un nome è una password è caricate i schedari à u servitore. Ci era altri tempi, tuttu era più simplice allora ch'è avà.

Crià una catena CI / CD è automatizà u travagliu cù Docker

E cose sò cambiate assai in l'ultimi dui decennii. I siti sò diventati più cumplessi, devenu esse assemblati prima di esse liberati in produzzione. Un solu servitore hè diventatu assai servitori chì currenu daretu à i balancers di carica, l'usu di sistemi di cuntrollu di versione hè diventatu cumunu.

Per u mo prughjettu persunale, aghju avutu una cunfigurazione speciale. E sapia chì avia bisognu di a capacità di implementà un situ in produzzione, eseguendu una sola azione: scrive codice à una filiera. master nantu à GitHub. Sapia ancu chì ùn vulia micca gestisce un grande cluster Kubernetes, o aduprà a tecnulugia Docker Swarm, o mantene un parcu di servitore cù pods, agenti è ogni tipu di cumplessità, per eseguisce a mo piccula applicazione web. Per ghjunghje u scopu di fà u travagliu u più faciule pussibule, aghju avutu bisognu di cunnosce CI / CD.

Sè vo avete un picculu prughjettu (in u nostru casu, un prughjettu Node.js) è vulete amparà à automatizà a implementazione di stu prughjettu, assicurendu chì ciò chì hè guardatu in u repositoriu currisponde esattamente à ciò chì travaglia in produzzione, pensu. pudete esse interessatu in questu articulu.

Prerequisiti

U lettore di questu articulu hè previstu di avè una linea di cummanda di basa è a cunniscenza di scripting Bash. Inoltre, hà bisognu di cunti Travis C.I. и Hub Docker.

Scopi

Ùn diceraghju micca chì questu articulu pò esse chjamatu incondizionatamente "guida di furmazione". Questu hè più di un documentu in u quale parlu di ciò chì aghju amparatu è discrive u prucessu chì mi cunvene per pruvà è implementà u codice à a produzzione, realizatu in un passu automatizatu.

Eccu ciò chì u mo flussu di travagliu hè finitu cum'è.

Per u codice spintu à qualsiasi ramu di u repositoriu altru ch'è master, i seguenti azzioni sò realizati:

  • U prughjettu di u prughjettu nantu à Travis CI principia.
  • Tutte e teste di unità, integrazione è end-to-end sò realizate.

Solu per u codice chì finisce in master, i seguenti sò fatti:

  • Tuttu ciò chì sopra, più ...
  • Custruì una maghjina Docker basatu annantu à u codice attuale, paràmetri è ambiente.
  • Ospitu l'imaghjini nantu à Docker Hub.
  • Cunnessione à u servitore di pruduzzione.
  • Caricà una maghjina da Docker Hub à u servitore.
  • Ferma u cuntinuu attuale è principia un novu basatu annantu à a nova maghjina.

Se ùn sapete nunda di Docker, l'imaghjini è i cuntenituri, ùn vi preoccupate micca. Vi dicu tuttu.

Cosa hè CI/CD?

L'abbreviazione CI / CD significa "integrazione continua / implementazione continua" - "integrazione continua / implementazione continua".

▍Integrazione Cuntinuu

L'Integrazione Continua hè u prucessu per u quale i sviluppatori facenu impegni à u repositoriu di codice fonte principale di un prughjettu (di solitu un ramu. master). À u listessu tempu, a qualità di u codice hè assicurata da teste automatizati.

▍Spiegamentu Cuntinuu

A implementazione cuntinuu hè a frequente implementazione automatizata di codice à a produzzione. A seconda parte di l'abbreviazione CI / CD hè qualchì volta revelata cum'è "consegna cuntinuu" ("consegna cuntinuu"). Questu hè basicamente u listessu cum'è "spiegamentu cuntinuu", ma "consegna cuntinuu" implica chì i cambiamenti devenu esse cunfirmati manualmente prima di inizià u prucessu di implementazione di u prugettu.

Getting passé

L'applicazione nantu à quale aghju maestru di tuttu questu hè chjamatu Pigliate Nota. Questu hè un prughjettu web chì aghju travagliatu per piglià note. Prima aghju pruvatu à fà JAMStack-project, o solu una applicazione front-end senza un servitore, per prufittà di l'opzioni standard di hosting è di implementazione di prughjettu chì offre netlify. Cume a cumplessità di l'applicazione cresce, avia bisognu di creà u so back-end, chì significava chì avissi da furmà a mo propria strategia per l'integrazione automatizata è l'implementazione automatizata di u prugettu.

In u mo casu, l'applicazione hè un servitore Express chì funziona in un ambiente Node.js, serve una applicazione React di una sola pagina è sustene una API sicura di u servitore. Questa architettura seguita una strategia chì pò esse truvata in issu guida d'autenticazione full stack.

Aghju cunsultatu cun amicu, chì hè un espertu d'automatizazione, è li dumandò ciò chì aghju bisognu di fà per fà tuttu u travagliu cumu vogliu. M'hà datu un'idea di ciò chì u flussu di travagliu automatizatu delineatu in a sezione Obiettivi di questu articulu duverebbe esse. Stabilisce scopi cum'è questu significava chì avia bisognu di capisce cumu utilizà Docker.

Docker

Docker hè un strumentu chì, grazia à a tecnulugia di containerizazione, facilita a distribuzione di l'applicazioni, è ancu di implementà è eseguisce in u stessu ambiente, ancu s'è a piattaforma Docker stessa funziona in diverse ambienti. Prima, avia bisognu di mette in manu nantu à l'uttine di linea di cumanda di Docker (CLI). struzzione A guida d'installazione di Docker ùn hè micca assai chjaru, ma pudete amparà da ellu chì per fà u primu passu di a stallazione, avete bisognu di scaricà Docker Desktop (per Mac o Windows).

Docker Hub hè quasi u listessu cum'è GitHub per i repositori git, o registry npm per i pacchetti JavaScript. Questu hè un repositoriu in linea per l'imaghjini Docker. Questu hè induve Docker Desktop si cunnetta.

Dunque, per cumincià cù Docker, avete bisognu di fà duie cose:

Dopu quì, pudete verificà se a CLI di Docker funziona eseguendu u cumandimu seguitu per verificà a versione Docker:

docker -v

In seguitu, accede à Docker Hub inserendu u vostru nome d'utilizatore è password quandu avete dumandatu:

docker login

Per utilizà Docker, duvete capisce i cuncetti di l'imaghjini è i cuntenituri.

▍Immagini

Una maghjina hè un tipu di pianu chì cuntene struzzioni per custruisce un containeru. Questa hè una snapshot immutable di u sistema di fugliale è i paràmetri di l'applicazione. I sviluppatori ponu facilmente sparte l'imaghjini.

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

Stu cumandimu hà da pruduce una tavola cù u titulu seguente:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

In seguitu, avemu da cunsiderà parechji esempi di cumandamenti in u stessu formatu - prima ci hè un cumandamentu cù un cumentu, è dopu un esempiu di ciò chì pò pruduce.

▍Containers

Un containeru hè un pacchettu eseguibile chì cuntene tuttu ciò chì hè necessariu per eseguisce una applicazione. Una applicazione cù questu approcciu sempre travaglià u listessu, indipendentemente da l'infrastruttura: in un ambiente isolatu è in u stessu ambiente. Parlemu di u fattu chì l'istanze di a stessa maghjina sò lanciate in ambienti differenti.

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

▍Tags

Un tag hè un indicazione di una versione specifica di una maghjina.

▍Riferimentu rapidu per i cumandamenti Docker

Eccu una panoramica di alcuni cumandamenti Docker cumunimenti usati.

squadra

U cuntestu

effettu

custruzzione di docker

Image

Custruì una maghjina da un Dockerfile

tag docker

Image

Tagging di l'imagine

docker images

Image

Mostra una lista di imagine

docker run

Cuntinutu

Esecuzione di un containeru basatu in imagine

spinta di docker

Image

Mandendu una Image à u Registru

docker-pull

Image

Caricà una Image da u Registru

docker ps

Cuntinutu

Elencu cuntenituri

sistema docker prune

Image/Container

Eliminà i cuntenituri è l'imaghjini inutilizati

▍Dockerfile

Sò cumu per eseguisce una applicazione di produzzione in u locu. Aghju una cunfigurazione webpack per custruisce una app React finita. Dopu, aghju un cumandamentu chì principia un servitore basatu Node.js in u portu 5000. Sembra cusì:

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

Hè da nutà chì ùn aghju micca un esempiu di applicazione per stu materiale. Ma quì, per esperimenti, qualsiasi applicazione Node simplice farà.

Per utilizà u cuntinuu, avete bisognu di dà struzzioni à Docker. Questu hè fattu attraversu un schedariu chjamatu Dockerfilesituatu in u cartulare radicali di u prugettu. Stu schedariu, in prima, pare piuttostu incomprensibile.

Ma ciò chì cuntene solu descrive, in cumandamenti speciali, qualcosa cum'è a creazione di un ambiente di travagliu. Eccu alcuni di questi cumandamenti:

  • FROM - Stu cumandimu principia un schedariu. Specifica l'imaghjini di basa da quale u cuntinuu hè custruitu.
  • COPIA - Copià i fugliali da una fonte lucale à un containeru.
  • U travagliu - Stabbilimentu di u cartulare di travagliu per i seguenti cumandamenti.
  • RUN - Eseguite cumandamenti.
  • ESPOSTI - Cunfigurazione di u portu.
  • PUNTU DI ENTRATA - Una indicazione di u cumandamentu per esse eseguitu.

Dockerfile puderia vede qualcosa cusì:

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

Sicondu l'imaghjini di basa chì sceglite, pudete avè bisognu di installà dipendenze supplementari. U fattu hè chì certi imaghjini di basa (cum'è Node Alpine Linux) sò pensati per esse u più compactu pussibule. In u risultatu, ùn ponu micca include alcuni di i prugrammi chì aspettate.

▍Custruisce, marca è gestisce un containeru

L'assemblea lucale è u lanciu di u cuntinuu hè, dopu avè Dockerfilei travaglii sò abbastanza sèmplice. Prima di spinghje una maghjina à Docker Hub, deve esse pruvata in u locu.

▍ Assemblea

Prima vi tocca à cullà imagine, specificendu un nome, è, eventualmente, un tag (se ùn ci hè micca specificatu tag, u sistema assignerà automaticamente un tag à l'imaghjini). latest).

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

Dopu avè eseguitu stu cumandamentu, pudete vede Docker custruisce l'imaghjini.

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

A custruzzione pò piglià un paru di minuti - tuttu dipende di quante dependenze avete. Dopu chì a custruzione hè cumpleta, pudete eseguisce u cumandamentu docker images è fate un ochju à a descrizzione di a vostra nova imagine.

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

▍Lanciare

L'imagine hè stata creata. È questu significa chì nantu à a so basa pudete eseguisce un containeru. Siccomu vogliu esse capace di accede à l'applicazione in esecuzione in u cuntinuu à localhost:5000, i, à u latu manca di a coppia 5000:5000 in u seguitu set di cumandamenti 5000. À u latu drittu hè u portu di u containeru.

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

Avà chì u cuntinuu hè creatu è in esecuzione, pudete aduprà u cumandamentu docker ps per vede l'infurmazioni nantu à stu containeru (o pudete aduprà u cumandamentu docker ps -a, chì mostra infurmazione nantu à tutti i cuntenituri, micca solu quelli in esecuzione).

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

Sè avà vai à localhost:5000 - pudete vede a pagina di l'applicazione in esecuzione, chì pare esattamente uguale à a pagina di l'applicazione in esecuzione in l'ambiente di produzzione.

▍Tag Assignazione è Publicazione

Per utilizà una di l'imaghjini creati nantu à u servitore di produzzione, avemu bisognu di pudè scaricà sta maghjina da Docker Hub. Questu significa chì avete prima bisognu di creà un repository per u prugettu in Docker Hub. Dopu quì, averemu un locu induve pudemu mandà l'imaghjini. L'imaghjina deve esse rinominata in modu chì u so nome cumencia cù u nostru nome d'utilizatore Docker Hub. Questu deve esse seguitu da u nome di u repository. Ogni tag pò esse piazzatu à a fine di u nome. Quì sottu hè un esempiu di nomi di l'imaghjini secondu stu schema.

Avà pudete custruisce l'imaghjini cù un novu nome attribuitu è ​​eseguite u cumandamentu docker push per spinghje à u repository 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

Se tuttu va bè, l'imaghjini serà dispunibule nantu à Docker Hub è pò esse facilmente caricate à u servitore o sparte cù altri sviluppatori.

Passi prossimi

Avà, avemu verificatu chì l'applicazione, in a forma di un containeru Docker, funziona in u locu. Avemu caricatu u containeru in Docker Hub. Tuttu chistu significa chì avemu digià fattu assai prugressu versu u nostru scopu. Avà avemu bisognu di risolve duie altre dumande:

  • Configurazione di un strumentu CI per pruvà è implementà u codice.
  • Configurazione di u servitore di pruduzzione per pudè scaricà è eseguisce u nostru codice.

In u nostru casu, cum'è una soluzione CI / CD, usemu Travis C.I.. Cum'è un servitore - Digital Ocean.

Hè devi esse nutatu chì quì pudete aduprà una altra cumminazione di servizii. Per esempiu, invece di Travis CI, pudete aduprà CircleCI o Github Actions. È invece di DigitalOcean - AWS o Linode.

Avemu decisu di travaglià cù Travis CI, è aghju digià qualcosa stallatu in questu serviziu. Dunque, ora vi parleraghju brevemente di cumu si preparanu per u travagliu.

Travis C.I.

Travis CI hè un strumentu per pruvà è implementà u codice. Ùn vogliu micca andà in i dettagli di a creazione di Travis CI, postu chì ogni prughjettu hè unicu è ùn farà micca assai bè. Ma copreraghju i principii per avè principiatu se decide di utilizà Travis CI. Qualunque cosa sceglite - Travis CI, CircleCI, Jenkins, o qualcos'altro, metudi di cunfigurazione simili si applicanu in ogni locu.

Per cumincià cù Travis CI, andate à situ web di u prugettu è crea un contu. Allora integra Travis CI cù u vostru contu GitHub. Quandu si stallanu u sistema, avete bisognu di specificà u repositoriu chì vulete automatizà è attivà l'accessu à questu. (Aduprate GitHub, ma sò sicuru chì Travis CI pò integrà cù BitBucket, GitLab, è altri servizii simili).

Ogni volta chì Travis CI hè iniziatu, un servitore hè iniziatu chì eseguisce i cumandamenti specificati in u schedariu di cunfigurazione, cumpresu l'implementazione di e rami adatti di u repository.

▍Ciculu di vita di u travagliu

Travis CI u schedariu di cunfigurazione chjamatu .travis.yml è guardatu in u repertoriu radicali di u prughjettu, sustene u cuncettu di avvenimenti ciclu di vita compiti. Eccu l'avvenimenti, elencati in l'ordine in quale sò accaduti:

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

▍Test

In u schedariu di cunfigurazione, aghju da stallà un servitore Travis CI locale. Aghju sceltu u Node 12 cum'è lingua è hà dettu à u sistema per installà e dependenzii necessarii per utilizà Docker.

Tuttu u listinu in .travis.yml, serà eseguitu nantu à tutte e dumande di pull à tutte e rami di u repository, salvu s'ellu ùn hè micca specificatu. Questa hè una funzione utile chì significa chì pudemu pruvà tuttu u codice chì entra in u repository. Stu vi permette di sapè s'ellu u codice hè prontu à esse scrittu à u ramu. master, è se romperà u prucessu di custruzzione di u prugettu. In questa cunfigurazione glubale, aghju installatu tuttu in u locu, eseguite u servitore dev Webpack in u fondu (questa hè una funzione di u mo flussu di travagliu), è eseguite e teste.

Se vulete chì u vostru repositoriu visualice icone di copertura di codice, ccà pudete truvà un tutorialu rapidu nantu à cumu utilizà Jest, Travis CI è Coveralls per cullà è vede sta infurmazione.

Allora quì hè u cuntenutu di u schedariu .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

Hè quì chì finiscinu l'azzioni chì sò realizati per tutte e rami di u repositoriu è per e richieste di pull.

▍Deployment

Basatu nantu à l'assunzione chì tutti i testi automatizati anu cumpletu cù successu, pudemu opzionalmente implementà u codice à u servitore di produzzione. Siccomu vulemu solu fà questu per u codice di filiale master, demu à u sistema l'istruzzioni appropritate in i paràmetri di implementazione. Prima di pruvà à usà u codice chì avemu da vede dopu in u vostru prughjettu, vogliu avvistà chì duvete avè un script attuale chì hè chjamatu per implementazione.

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

U script di implementazione face duie cose:

  • Custruisce, tagging è mandà l'imaghjini à Docker Hub cù un strumentu CI (in u nostru casu hè Travis CI).
  • Caricà l'imaghjini nantu à u servitore, fermendu u vechju cuntainer è principià un novu (in u nostru casu, u servitore corre nantu à a piattaforma DigitalOcean).

Prima, avete bisognu di stallà un prucessu automaticu per custruisce, tagging, è spinghje l'imaghjini à Docker Hub. Tuttu chistu hè assai simili à ciò chì avemu digià fattu manualmente, salvu chì quì avemu bisognu di una strategia per assignà tag unichi à l'imaghjini è automatizà u login. Aviu avutu difficultà cù qualchi dettagli di u script di implementazione, cum'è a strategia di tagging, login, codificazione di chjave SSH, stabilisce una cunnessione SSH. Ma per furtuna, u mo amicu hè assai bonu cù bash, è ancu cù parechje altre cose. M'hà aiutatu à scrive stu script.

Allora, a prima parte di u script hè di mandà l'imaghjini à Docker Hub. Per fà questu hè abbastanza simplice. U schema di tagging ch'e aghju utilizatu implica a cumminazione di u git hash è u git tag s'ellu esiste. Questu assicura chì l'etichetta hè unica è facilita l'identificazione di l'assemblea nantu à quale hè basatu. DOCKER_USERNAME и DOCKER_PASSWORD sò variabili di l'ambiente definite da l'utilizatori chì ponu esse stabilite cù l'interfaccia Travis CI. Travis CI prucederà automaticamente e dati sensibili in modu chì ùn cascà micca in mani sbagliate.

Eccu a prima parte di u script 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}

Chì serà a seconda parte di u script dipende interamente da quale òspite aduprate è cumu a cunnessione cù questu hè urganizata. In u mo casu, postu chì aghju utilizatu Digital Ocean, i cumandamenti sò usati per cunnette à u servitore doctl. Quandu travaglia cù Aws, l'utilità serà utilizata aws, eccetera.

Stallà u servitore ùn era micca particularmente difficiule. Allora, aghju stabilitu una goccia basatu annantu à l'imaghjini di basa. Hè da nutà chì u sistema ch'e aghju sceltu richiede una stallazione manuale di Docker una volta è un iniziu manuale di Docker. Aghju utilizatu Ubuntu 18.04 per installà Docker, perchè sè ancu aduprà Ubuntu, pudete solu seguità questu semplice guida.

Ùn sò micca parlà di cumandamenti specifichi per u serviziu quì, postu chì questu aspettu pò varià assai in diversi casi. Daraghju solu un pianu generale d'azzione per esse realizatu dopu a cunnessione via SSH à u servitore induve u prugettu serà implementatu:

  • Avete bisognu di truvà u cuntinuu chì hè attualmente in esecuzione è ferma.
  • Allora avete bisognu di inizià un novu containeru in u fondu.
  • Avete bisognu di stabilisce u portu lucale di u servitore 80 - questu vi permetterà di entre in u situ à l'indirizzu di u furmulariu example.com, senza specificà un portu, invece di utilizà un indirizzu cum'è example.com:5000.
  • È, finarmenti, avete bisognu di caccià tutti i vechji cuntenituri è imagine.

Eccu a continuazione di u script.

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

Alcune cose da guardà

Hè pussibule chì quandu si cunnetta à u servitore via SSH da Travis CI, vi vede un avvisu chì ùn vi permettenu micca di cuntinuà cù a stallazione, postu chì u sistema aspittà a risposta di l'utilizatore.

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

Aghju amparatu chì una chjave di stringa pò esse codificata in base64 per almacenà in una forma in quale pò esse cunvene è affidabile travagliatu. À a fase di stallazione, pudete decodificà a chjave publica è scrive in un schedariu known_hosts per caccià l'errore sopra.

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

In pratica, stu cumandamentu pò esse cusì:

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

È quì hè ciò chì dà - una stringa codificata in base64:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Eccu u cumandamentu citatu sopra

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

U listessu approcciu pò esse usatu cù una chjave privata quandu stabilisce una cunnessione, postu chì pudete bisognu di una chjave privata per accede à u servitore. Quandu u travagliu cù una chjave, solu bisognu di assicurà chì hè salvatu in modu sicuru in una variabile d'ambiente Travis CI, è chì ùn hè micca mostratu in ogni locu.

Un'altra cosa da nutà hè chì pudete avè bisognu di eseguisce tuttu u script di implementazione cum'è una sola linea, per esempiu cun doctl. Questu pò esse bisognu di qualchì sforzu extra.

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

TLS/SSL è bilanciamentu di carica

Dopu avè fattu tuttu ciò chì sopra, l'ultimu prublema chì aghju avutu era chì u servitore ùn hà micca SSL. Siccomu aduprate un servitore Node.js, per forza travaglià proxy inversu Nginx è Let's Encrypt, avete bisognu di tinker assai.

Veramente ùn vulia micca fà tutti questi paràmetri SSL manualmente, cusì aghju creatu solu un equilibratore di carica è aghju registratu infurmazioni nantu à questu in DNS. In u casu di DigitalOcean, per esempiu, a creazione di un certificatu autofirmatu di rinnuvamentu automaticu nantu à u bilanciu di carica hè una prucedura simplice, gratuita è veloce. Stu approcciu hà u benefiziu aghjuntu di rende assai faciule di stallà SSL in parechji servitori chì funzionanu daretu à un equilibratore di carica se ne necessariu. Questu permette à i servitori stessi di ùn "pensà" micca à SSL, ma à u stessu tempu aduprà, cum'è solitu, u portu. 80. Dunque, cunfigurà SSL in un equilibratore di carica hè assai più faciule è più convenientu cà i metudi di cunfigurazione SSL alternativu.

Avà pudete chjude tutti i porti nantu à u servitore chì accettanu cunnessione entranti - fora di u portu 80, usatu per cumunicà cù u balancer di carica, è u portu 22 per SSH. In u risultatu, un tentativu di cuntattà direttamente u servitore nantu à qualsiasi porti altru ch'è questi dui falli.

Risultati

Dopu avè fattu tuttu ciò chì aghju parlatu in questu articulu, nè a piattaforma Docker nè u cuncettu di catene CI / CD automatizati ùn mi spaventavanu più. Puderaghju stabilisce una catena d'integrazione cuntinuu, durante a quale u codice hè pruvatu prima di andà in produzzione è u codice hè automaticamente implementatu à u servitore. Tuttu chistu hè sempre relativamente novu per mè, è sò sicuru chì ci sò modi per migliurà u mo flussu di travagliu automatizatu è rende più efficiente. Allora s'è vo avete idee nantu à questu - dà sapè. Spergu chì questu articulu vi hà aiutatu in i vostri sforzi. Vogliu crede chì leghjendulu, avete amparatu quantu aghju amparatu mentre trattava di tuttu ciò chì aghju dettu in questu.

PS In u nostru mercatu ci hè una maghjina Docker, chì hè stallatu in un clic. Pudete cuntrollà i cuntenituri chì travaglianu VPS. Tutti i novi clienti sò datu 3 ghjorni di teste gratuitamente.

Beni, lettori! Aduprate e tecnulugia CI/CD in i vostri prughjetti?

Crià una catena CI / CD è automatizà u travagliu cù Docker

Source: www.habr.com

Add a comment