Kreye yon chèn CI/CD ak otomatize travay ak Docker

Mwen te ekri premye sit entènèt mwen an nan fen ane 90 yo. Lè sa a, li te trè fasil yo mete yo nan lòd travay. Te gen yon sèvè Apache sou kèk hosting pataje, ou ta ka konekte nan sèvè sa a atravè FTP lè w ekri yon bagay tankou ftp://ftp.example.com. Lè sa a, ou te oblije antre non ou ak modpas ak Upload dosye yo sou sèvè a. Te gen diferan tan, tout bagay te pi senp lè sa a pase kounye a.

Kreye yon chèn CI/CD ak otomatize travay ak Docker

Nan de deseni yo depi lè sa a, tout bagay te chanje anpil. Sit wèb yo vin pi konplèks; yo dwe rasanble anvan yo lage nan pwodiksyon an. Yon sèl sèvè te vin anpil sèvè kouri dèyè balanse chaj, ak itilizasyon sistèm kontwòl vèsyon yo te vin komen.

Pou pwojè pèsonèl mwen mwen te gen yon konfigirasyon espesyal. Apre sa, mwen te konnen ke mwen te bezwen kapasite nan deplwaye sit la nan pwodiksyon pa fè yon sèl aksyon: ekri kòd nan yon branch. master sou GitHub. Anplis de sa, mwen te konnen ke yo nan lòd yo asire operasyon an nan ti aplikasyon entènèt mwen an, mwen pa t 'vle jere yon gwo gwoup Kubernetes, oswa itilize teknoloji Docker Swarm, oswa kenbe yon flòt nan serveurs ak gous, ajan ak tout kalite lòt. konpleksite. Pou m kapab reyalize objektif la pou fè travay pi fasil ke posib, mwen te bezwen vin abitye ak CI/CD.

Si ou gen yon ti pwojè (nan ka sa a, yon pwojè Node.js) epi ou ta renmen konnen ki jan yo otomatize deplwaman pwojè sa a, pandan y ap asire ke sa ki estoke nan depo a egzakteman matche ak sa ki travay nan pwodiksyon, Lè sa a, mwen panse ou ta ka enterese nan atik sa a.

Kondisyon

Lektè atik sa a espere gen yon konpreyansyon debaz sou liy lòd la ak ekri Scripts Bash. Anplis de sa, li pral bezwen kont Travis C.I. и Hub Docker.

Objektif

Mwen pa pral di ke atik sa a ka enkondisyonèl dwe rele yon "tutorial". Sa a se plis nan yon dokiman nan ki mwen pale sou sa mwen te aprann ak dekri pwosesis la ki kostim mwen pou tès ak deplwaye kòd nan pwodiksyon, fèt nan yon sèl pas otomatik.

Sa a se sa workflow mwen te fini.

Pou kòd afiche nan nenpòt branch repozitwa eksepte master, aksyon sa yo fèt:

  • Pwojè a bati sou Travis CI kòmanse.
  • Tout tès inite, entegrasyon ak fen-a-fen yo fèt.

Sèlman pou kòd ki tonbe nan master, sa ki annapre yo fèt:

  • Tout sa ki mansyone pi wo a, plis ...
  • Bati yon imaj Docker ki baze sou kòd aktyèl la, anviwònman ak anviwònman.
  • Deplwaye imaj la nan Docker Hub.
  • Koneksyon ak sèvè pwodiksyon an.
  • Telechaje yon imaj ki soti nan Docker Hub sou sèvè a.
  • Sispann veso aktyèl la epi kòmanse yon nouvo ki baze sou nouvo imaj la.

Si w pa konnen absoliman anyen sou Docker, imaj ak resipyan, pa enkyete w. Mwen pral di ou tout bagay sou li.

ki sa ki CI/CD?

Abreviyasyon CI/CD la vle di "entegrasyon kontinyèl/deplwaman kontinyèl."

▍ Entegrasyon kontinyèl

Entegrasyon kontinyèl se yon pwosesis kote devlopè yo pran angajman nan depo prensipal kòd sous pwojè a (anjeneral yon branch. master). An menm tan an, bon jan kalite a nan kòd la asire nan tès otomatik.

▍Deplwaman kontinyèl

Deplwaman kontinyèl se deplwaman souvan, otomatik ki fonksyone nan kòd nan pwodiksyon an. Dezyèm pati akwonim CI/CD a pafwa eple kòm "livrezon kontinyèl". Sa a se fondamantalman menm jan ak "deplwaman kontinyèl", men "livrezon kontinyèl" implique bezwen pou konfime chanjman manyèlman anvan yo kòmanse pwosesis deplwaman pwojè a.

Pou kòmanse

Aplikasyon mwen te konn aprann tout bagay sa yo rele PranNote. Sa a se yon pwojè entènèt mwen ap travay sou, ki fèt pou pran nòt. Okòmansman mwen te eseye fè JAMStack-pwojè, oswa jis yon aplikasyon front-end san yon sèvè, yo nan lòd yo pran avantaj de estanda hosting ak kapasite deplwaman pwojè ke li ofri. Netlify. Kòm konpleksite aplikasyon an te grandi, mwen te bezwen kreye pati sèvè li yo, ki vle di ke mwen ta bezwen fòmile pwòp estrateji mwen an pou entegrasyon otomatik ak deplwaman otomatik nan pwojè a.

Nan ka mwen an, aplikasyon an se yon sèvè Express ki kouri nan anviwònman Node.js, k ap sèvi yon aplikasyon React yon sèl paj ak sipòte yon API sèvè-bò sèvè. Achitekti sa a swiv estrateji ki ka jwenn nan sa a Gid otantifikasyon pile konplè.

Mwen konsilte ak zanmi, ki moun ki se yon ekspè automatisation, epi li te mande l 'sa mwen te bezwen fè pou fè li tout travay jan mwen te vle. Li te ban m lide ki jan yon workflow otomatik ta dwe sanble, ki dekri nan seksyon Objektif atik sa a. Èske w gen objektif sa yo vle di ke mwen te bezwen konnen ki jan yo sèvi ak Docker.

Koupre

Docker se yon zouti ki, gras ak teknoloji kontenèrizasyon, pèmèt aplikasyon yo fasil distribye, deplwaye ak kouri nan menm anviwònman an, menm si platfòm Docker la li menm ap kouri nan diferan anviwònman. Premyèman, mwen te bezwen jwenn men m 'sou zouti liy lòd Docker (CLI). Enstriksyon yo Gid enstalasyon Docker pa ka rele trè klè ak konprann, men nan li ou ka aprann ke yo nan lòd yo pran premye etap enstalasyon an, ou bezwen telechaje Docker Desktop (pou Mac oswa Windows).

Docker Hub se apeprè menm bagay ak GitHub pou git depo, oswa rejis npm pou pakè JavaScript. Sa a se yon depo sou entènèt pou imaj Docker. Sa a se sa Docker Desktop konekte ak.

Se konsa, yo nan lòd yo kòmanse ak Docker, ou bezwen fè de bagay:

Apre sa, ou ka tcheke si Docker CLI a ap travay pa kouri lòd sa a pou tcheke vèsyon Docker la:

docker -v

Apre sa, konekte nan Docker Hub lè w ap antre non itilizatè w ak modpas w lè w mande w:

docker login

Pou itilize Docker, ou dwe konprann konsèp imaj ak resipyan yo.

▍Imaj

Yon imaj se yon bagay tankou yon plan ki gen enstriksyon pou rasanble veso a. Sa a se yon snapshot imuiabl nan sistèm dosye aplikasyon an ak anviwònman. Devlopè yo ka fasilman pataje imaj.

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

Kòmand sa a pral bay yon tablo ak header sa a:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Apre sa, nou pral gade kèk egzanp kòmandman nan menm fòma - premye gen yon kòmandman ak yon kòmantè, ak Lè sa a, yon egzanp sou sa li ka pwodiksyon.

▍Resipyan

Yon veso se yon pake ègzèkutabl ki gen tout sa ki nesesè pou kouri yon aplikasyon. Yon aplikasyon ak apwòch sa a ap toujou travay menm jan an, kèlkeswa enfrastrikti a: nan yon anviwònman izole ak nan menm anviwònman an. Pwen an se ke ka menm imaj la yo te lanse nan diferan anviwònman.

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

▍Tags

Yon tag se yon endikasyon de yon vèsyon espesifik nan yon imaj.

▍Yon referans rapid sou kòmandman Docker

Men yon apèsi sou kèk kòmandman Docker yo itilize souvan.

Ekip

Kontèks

efè

docker bati

Imaj

Bati yon imaj ki soti nan yon Dockerfile

tag docker

Imaj

Tagging imaj

Docker imaj

Imaj

Lis imaj yo

Dokè kouri

Veso

Kouri yon veso ki baze sou yon imaj

docker pouse

Imaj

Telechaje yon imaj nan rejis la

docker rale

Imaj

Chaje yon imaj ki soti nan rejis la

docker ps

Veso

Lis resipyan yo

sistèm docker koupe

Imaj/Resipyan

Retire veso ak imaj ki pa itilize yo

▍Dockerfile

Mwen konnen ki jan yo kouri yon aplikasyon pwodiksyon lokalman. Mwen gen yon konfigirasyon Webpack ki fèt pou konstwi yon aplikasyon React pare. Apre sa, mwen gen yon lòd ki kòmanse yon sèvè ki baze sou Node.js sou pò a 5000. Li sanble sa a:

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

Li ta dwe remake ke mwen pa gen yon aplikasyon egzanp pou materyèl sa a. Men, isit la, pou eksperyans, nenpòt aplikasyon Node senp pral fè.

Pou w ka itilize veso a, w ap bezwen bay Docker enstriksyon. Sa a se fè atravè yon dosye ki rele Dockerfile, ki chita nan anyè rasin pwojè a. Fichye sa a, nan premye, sanble byen enkonpreyansib.

Men, sa li genyen sèlman dekri, ak kòmandman espesyal, yon bagay ki sanble ak mete kanpe yon anviwònman k ap travay. Men kèk nan kòmandman sa yo:

  • KI SOTI NAN — Kòmandman sa a kòmanse yon dosye. Li presize imaj de baz sou ki veso a bati.
  • KOPI — Kopye dosye ki soti nan yon sous lokal nan yon veso.
  • WORKDIR — Mete anyè k ap travay pou kòmandman sa yo.
  • RUN - Kouri kòmandman yo.
  • Ekspoze — Anviwònman pò.
  • ENTRYPOINT — Endikasyon kòmandman an dwe egzekite.

Dockerfile ta ka sanble yon bagay tankou sa a:

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

Tou depan de imaj de baz ou chwazi a, ou ka bezwen enstale depandans adisyonèl. Reyalite a se ke kèk imaj de baz (tankou Node Alpine Linux) yo kreye ak objektif pou fè yo pi konpak ke posib. Kòm yon rezilta, yo ka pa gen kèk nan pwogram ou espere yo.

▍Konstwi, make ak kouri veso a

Asanble lokal ak lansman veso a se apre nou genyen Dockerfile, travay yo se byen senp. Anvan ou pouse imaj la nan Docker Hub, ou bezwen teste li lokalman.

▍Asanble

Premye ou bezwen kolekte imaj, espesifye yon non epi, si ou vle, yon tag (si yo pa espesifye yon tag, sistèm nan pral otomatikman bay yon tag nan imaj la. latest).

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

Apre ou fin kouri lòd sa a, ou ka gade Docker bati imaj la.

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

Konstriksyon an ka pran yon koup de minit - tout depann sou konbyen depandans ou genyen. Yon fwa bati a fini, ou ka kouri lòd la docker images epi gade deskripsyon nouvo imaj ou a.

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

▍Lanse

Imaj la te kreye. Sa vle di ke ou ka kouri yon veso ki baze sou li. Paske mwen vle kapab jwenn aksè nan aplikasyon an kouri nan veso a nan localhost:5000, mwen, sou bò gòch nan pè a 5000:5000 nan pwochen lòd la enstale 5000. Sou bò dwat la se pò veso a.

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

Kounye a ke veso a kreye epi kouri, ou ka itilize lòd la docker ps pou gade enfòmasyon sou veso sa a (oswa ou ka itilize kòmandman an docker ps -a, ki montre enfòmasyon sou tout resipyan yo, pa sèlman sa yo k ap kouri).

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

Si ou kounye a ale nan adrès la localhost:5000 — ou ka wè yon paj nan yon aplikasyon k ap kouri ki sanble egzakteman menm jan ak paj yon aplikasyon k ap kouri nan yon anviwònman pwodiksyon.

▍Tagging ak pibliye

Pou nou kapab itilize youn nan imaj yo kreye sou sèvè pwodiksyon an, nou bezwen kapab telechaje imaj sa a soti nan Docker Hub. Sa vle di ke ou premye bezwen kreye yon depo pou pwojè a sou Docker Hub. Apre sa, nou pral gen yon kote nou ka voye imaj la. Imaj la bezwen chanje non pou non li kòmanse ak non itilizatè Docker Hub nou an. Sa a ta dwe swiv pa non an nan depo a. Nenpòt tag ka mete nan fen non an. Anba a se yon egzanp nonmen imaj lè l sèvi avèk konplo sa a.

Koulye a, ou ka bati imaj la ak yon nouvo non epi kouri lòd la docker push pou pouse li nan depo Docker Hub la.

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

Si tout bagay ale byen, imaj la ap disponib sou Docker Hub epi yo ka fasilman telechaje sou sèvè a oswa transfere nan lòt devlopè.

Pwochen etap yo

Kounye a nou te verifye ke aplikasyon an, nan fòm yon veso Docker, ap kouri lokalman. Nou te telechaje veso a nan Docker Hub. Tout sa vle di ke nou deja fè anpil bon pwogrè nan objektif nou. Koulye a, nou bezwen rezoud de lòt kesyon:

  • Mete kanpe yon zouti CI pou tès ak deplwaye kòd.
  • Mete kanpe sèvè pwodiksyon an pou li ka telechaje epi kouri kòd nou an.

Nan ka nou an, nou itilize Travis C.I.. Kòm yon sèvè - DitigalOcean.

Li ta dwe remake ke isit la ou ka itilize yon lòt konbinezon de sèvis yo. Pou egzanp, olye pou Travis CI, ou ka itilize CircleCI oswa Github Actions. Ak olye pou yo DigitalOcean - AWS oswa Linode.

Nou deside travay ak Travis CI, e mwen deja gen yon bagay configuré nan sèvis sa a. Se poutèt sa, kounye a mwen pral yon ti tan pale sou ki jan yo prepare li pou travay.

Travis C.I.

Travis CI se yon zouti pou teste ak deplwaye kòd. Mwen pa ta renmen antre nan sibtilite yo nan mete kanpe Travis CI, paske chak pwojè se inik, e sa a pa pral pote anpil benefis. Men, mwen pral kouvri baz yo pou fè ou kòmanse si ou deside sèvi ak Travis CI. Kit ou chwazi Travis CI, CircleCI, Jenkins, oswa yon lòt bagay, yo pral itilize metòd konfigirasyon menm jan an toupatou.

Pou kòmanse ak Travis CI, ale nan sit entènèt pwojè epi kreye yon kont. Lè sa a, entegre Travis CI ak kont GitHub ou. Lè w ap mete sistèm nan, w ap bezwen presize repozitwa ou vle otomatize travay epi pèmèt aksè a li. (Mwen sèvi ak GitHub, men mwen sèten ke Travis CI ka entegre ak BitBucket, ak GitLab, ak lòt sèvis menm jan an).

Chak fwa Travis CI kòmanse, sèvè a lanse, egzekite kòmandman yo espesifye nan fichye konfigirasyon an, ki gen ladan deplwaye branch repozitwa korespondan yo.

▍Sik lavi travay

Travis CI dosye konfigirasyon rele .travis.yml ak ki estoke nan anyè rasin pwojè a, sipòte konsèp evènman yo sik lavi travay. Evènman sa yo endike nan lòd yo rive:

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

▍Tès

Nan fichye konfigirasyon an mwen pral konfigirasyon sèvè Travis CI lokal la. Mwen te chwazi Node 12 kòm lang epi mwen te di sistèm nan enstale depandans ki nesesè pou itilize Docker.

Tout sa ki nan lis la .travis.yml, yo pral egzekite lè tout demann rale yo te fè nan tout branch nan repozitwa a, sof si yo espesifye yon lòt jan. Sa a se yon karakteristik itil paske sa vle di ke nou ka teste tout kòd k ap antre nan depo a. Sa fè ou konnen si kòd la pare pou ekri nan branch lan. master, epi si li pral kraze pwosesis konstriksyon pwojè a. Nan konfigirasyon mondyal sa a, mwen enstale tout bagay lokalman, kouri sèvè Webpack dev la nan background nan (sa a se yon karakteristik nan workflow mwen an), epi kouri tès yo.

Si ou vle depo ou a montre badj ki endike garanti tès la, isit la Ou ka jwenn enstriksyon kout sou itilizasyon Jest, Travis CI ak salopel pou kolekte epi montre enfòmasyon sa yo.

Se konsa, isit la se kontni an nan dosye a .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

Sa a se kote aksyon yo ki fèt pou tout branch nan repozitwa a ak pou demann rale fini.

▍Deplwaman

Dapre sipozisyon ke tout tès otomatik yo konplete avèk siksè, nou ka, ki se opsyonèl, deplwaye kòd la nan sèvè pwodiksyon an. Depi nou vle fè sa sèlman pou kòd ki soti nan branch lan master, nou bay sistèm nan enstriksyon apwopriye nan paramèt deplwaman yo. Anvan ou eseye sèvi ak kòd la ke nou pral gade nan pwochen nan pwojè ou a, mwen ta renmen avèti ou ke ou dwe gen yon script aktyèl ki rele pou deplwaman.

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

Script deplwaman an rezoud de pwoblèm:

  • Konstwi, tag epi voye imaj la nan Docker Hub lè l sèvi avèk yon zouti CI (nan ka nou an, Travis CI).
  • Chaje imaj la sou sèvè a, kanpe ansyen veso a epi kòmanse yon nouvo (nan ka nou an, sèvè a kouri sou platfòm DigitalOcean).

Premyèman, ou bezwen mete kanpe yon pwosesis otomatik pou bati, tag, ak pouse imaj la nan Docker Hub. Tout bagay sa yo sanble anpil ak sa nou te deja fè manyèlman, eksepte ke nou bezwen yon estrateji pou plase Tags inik nan imaj ak otomatize koneksyon. Mwen te gen difikilte ak kèk detay sou script deplwaman an, tankou estrateji tagging, login, kodaj kle SSH, etablisman koneksyon SSH. Men, heureusement, konpayon mwen trè bon ak bash, menm jan ak anpil lòt bagay. Li te ede m ekri script sa a.

Se konsa, premye pati nan script la se telechaje imaj la nan Docker Hub. Sa a se byen fasil fè. Konplo tagging mwen te itilize a enplike konbine yon hash git ak yon tag git, si youn egziste. Sa a asire ke tag la inik epi li fè li pi fasil yo idantifye asanble sou ki li baze. DOCKER_USERNAME и DOCKER_PASSWORD se varyab anviwònman itilizatè ki ka mete lè l sèvi avèk koòdone Travis CI. Travis CI pral otomatikman trete done sansib pou li pa tonbe nan move men yo.

Isit la se premye pati nan script la 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}

Ki sa ki dezyèm pati nan script la pral depann antyèman sou ki lame w ap itilize ak ki jan koneksyon an òganize. Nan ka mwen an, depi mwen itilize Digital Ocean, mwen itilize kòmandman yo pou konekte avèk sèvè a doktl. Lè w ap travay ak AWS, yo pral itilize sèvis piblik la aws, ak sou sa.

Mete kanpe sèvè a pa t 'partikilyèlman difisil. Se konsa, mwen mete kanpe yon ti gout ki baze sou imaj la baz. Li ta dwe remake ke sistèm mwen te chwazi a mande pou yon sèl-fwa enstalasyon manyèl nan Docker ak yon sèl-fwa lansman manyèl nan Docker. Mwen te itilize Ubuntu 18.04 pou enstale Docker, kidonk si w ap itilize Ubuntu tou pou fè menm bagay la, ou ka jis swiv sa a gid senp.

Mwen pa pale isit la sou kòmandman espesifik pou sèvis la, depi aspè sa a ka varye anpil nan diferan ka. Mwen pral jis bay yon plan jeneral nan aksyon yo dwe fèt apre konekte atravè SSH nan sèvè a sou ki pwojè a pral deplwaye:

  • Nou bezwen jwenn veso ki kounye a ap kouri epi sispann li.
  • Lè sa a, ou bezwen lanse yon nouvo veso nan background nan.
  • Ou pral bezwen mete pò lokal sèvè a nan 80 - sa pral pèmèt ou antre nan sit la nan yon adrès tankou example.com, san yo pa espesifye pò a, olye ke itilize yon adrès tankou example.com:5000.
  • Finalman, ou bezwen efase tout resipyan fin vye granmoun ak imaj.

Isit la se kontinyasyon nan script la.

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

Kèk bagay pou peye atansyon

Li posib ke lè ou konekte ak sèvè a atravè SSH soti nan Travis CI, ou pral wè yon avètisman ki pral anpeche ou kontinye ak enstalasyon an kòm sistèm nan ap tann repons itilizatè a.

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

Mwen te aprann ke yon kle fisèl ka kode nan base64 yo nan lòd yo sove li nan yon fòm kote li ka fasilman ak seryezman travay avèk yo. Nan etap enstalasyon an, ou ka dekode kle piblik la epi ekri li nan yon dosye known_hosts yo nan lòd yo debarase m de erè ki anwo a.

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

Nan pratik, lòd sa a ta ka sanble sa a:

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

Men sa li pwodui - yon kòd kode base64:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Isit la se kòmandman mansyone pi wo a

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

Menm apwòch la ka itilize ak yon kle prive lè w ap etabli yon koneksyon, paske ou ka byen bezwen yon kle prive pou jwenn aksè nan sèvè a. Lè w ap travay ak kle a, ou jis bezwen asire ke li estoke byen nan yon varyab anviwònman Travis CI epi ke li pa parèt nenpòt kote.

Yon lòt bagay sonje se ke ou ka bezwen kouri script deplwaman an antye kòm yon sèl liy, pou egzanp - avèk doctl. Sa a ka mande kèk efò siplemantè.

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

TLS/SSL ak balans chaj

Apre mwen te fè tout sa ki mansyone pi wo a, dènye pwoblèm mwen te rankontre se ke sèvè a pa t 'gen SSL. Depi mwen sèvi ak yon sèvè Node.js, yo nan lòd yo fòse nan travay reverse proxy Nginx ak ann ankripte, ou bezwen brikole anpil.

Mwen reyèlman pa t 'vle fè tout sa a konfigirasyon SSL manyèlman, Se konsa, mwen jis kreye yon balanse chaj ak anrejistre detay li yo nan DNS. Nan ka DigitalOcean, pou egzanp, kreye yon sètifika renouvèlman oto-siyen sou balans chaj la se yon pwosedi senp, gratis ak rapid. Apwòch sa a gen avantaj ki ajoute ke li fè li trè fasil yo mete SSL sou plizyè serveurs kouri dèyè yon balans chaj si sa nesesè. Sa a pèmèt sèvè yo tèt yo pa "panse" sou SSL ditou, men an menm tan an sèvi ak pò a kòm dabitid. 80. Se konsa, mete SSL sou yon balans chaj se pi fasil ak pi pratik pase metòd altènatif nan mete SSL.

Koulye a, ou ka fèmen tout pò sou sèvè a ki aksepte koneksyon fèk ap rantre - eksepte pò a 80, itilize pou kominike ak balans chaj la, ak pò a 22 pou SSH. Kòm yon rezilta, yon tantativ pou jwenn aksè dirèkteman sèvè a sou nenpòt pò ki pa de sa yo ap echwe.

Rezilta

Apre mwen te fè tout sa mwen te pale sou materyèl sa a, ni platfòm Docker la, ni konsèp chèn otomatik CI/CD pa pè m ankò. Mwen te kapab mete kanpe yon chèn entegrasyon kontinyèl, pandan ki kòd la teste anvan li ale nan pwodiksyon ak kòd la otomatikman deplwaye sou sèvè a. Tout bagay sa yo toujou relativman nouvo pou mwen, e mwen sèten gen fason pou amelyore workflow otomatik mwen an epi fè li pi efikas. Se konsa, si ou gen nenpòt lide sou zafè sa a, tanpri fè m 'konnen. m ' konnen. Mwen espere atik sa a te ede ou nan efò ou. Mwen vle kwè ke apre ou fin li li, ou te aprann otan ke mwen te aprann pandan w ap kalkile tout sa mwen te pale sou li.

PS Nan nou an mache gen yon imaj Koupre, ki ka enstale nan yon sèl klike sou. Ou ka tcheke operasyon an nan resipyan nan VPS. Tout nouvo kliyan yo bay 3 jou tès gratis.

Chè lektè! Èske w itilize teknoloji CI/CD nan pwojè w yo?

Kreye yon chèn CI/CD ak otomatize travay ak Docker

Sous: www.habr.com

Add nouvo kòmantè