Paghimo usa ka kadena sa CI / CD ug pag-automate sa trabaho sa Docker

Gisulat nako ang akong unang mga website sa ulahing bahin sa dekada 90. Kaniadto sayon ​​ra kaayo nga ibutang sila sa pagkasunud sa pagtrabaho. Adunay usa ka Apache server sa pipila nga gipaambit nga pag-host, mahimo ka mag-log in niini nga server pinaagi sa FTP pinaagi sa pagsulat sa usa ka butang nga sama ftp://ftp.example.com. Unya kinahanglan nimong isulod ang imong ngalan ug password ug i-upload ang mga file sa server. Adunay lain-laing mga panahon, ang tanan mas simple kaniadto kaysa karon.

Paghimo usa ka kadena sa CI / CD ug pag-automate sa trabaho sa Docker

Sa duha ka dekada sukad niadto, ang tanan nausab pag-ayo. Ang mga website nahimong mas komplikado; sila kinahanglan nga tipunon sa dili pa ipagawas ngadto sa produksyon. Ang usa ka server nahimong daghang mga server nga nagdagan luyo sa mga balanse sa pagkarga, ug ang paggamit sa mga sistema sa pagkontrol sa bersyon nahimong kasagaran.

Alang sa akong personal nga proyekto ako adunay usa ka espesyal nga pag-configure. Ug nahibal-an nako nga kinahanglan nako ang abilidad sa pag-deploy sa site sa produksiyon pinaagi sa paghimo lang sa usa ka aksyon: pagsulat code sa usa ka sanga master sa GitHub. Dugang pa, nahibal-an ko nga aron masiguro ang operasyon sa akong gamay nga aplikasyon sa web, dili ko gusto nga magdumala sa usa ka dako nga kumpol sa Kubernetes, o mogamit sa teknolohiya sa Docker Swarm, o magmentinar sa usa ka panon sa mga server nga adunay mga pod, ahente ug tanan nga lahi sa uban pa. pagkakomplikado. Aron makab-ot ang tumong sa paghimo sa trabaho nga sayon ​​kutob sa mahimo, kinahanglan kong pamilyar sa CI/CD.

Kung ikaw adunay usa ka gamay nga proyekto (sa kini nga kaso, usa ka proyekto sa Node.js) ug gusto nimo mahibal-an kung giunsa ang pag-automate sa pag-deploy niini nga proyekto, samtang gisiguro nga ang gitipigan sa repositoryo eksakto nga katumbas sa kung unsa ang molihok sa produksiyon, unya ako hunahunaa tingali ikaw interesado niini nga artikulo.

Mga kinahanglanon

Ang magbabasa niini nga artikulo gilauman nga adunay usa ka sukaranan nga pagsabot sa command line ug pagsulat sa mga script sa Bash. Dugang pa, kinahanglan niya ang mga account Travis CI и Hub sa pantalan.

Mga tumong

Dili ko moingon nga kini nga artikulo mahimong walay kondisyon nga tawgon nga "tutorial". Kini labaw pa sa usa ka dokumento diin akong gihisgutan ang akong nakat-unan ug gihulagway ang proseso nga haum kanako sa pagsulay ug pag-deploy sa code ngadto sa produksyon, nga gihimo sa usa ka automated pass.

Mao kini ang nahimo sa akong workflow.

Alang sa code nga gi-post sa bisan unsang sanga sa repository gawas master, ang mosunod nga mga aksyon gihimo:

  • Nagsugod ang proyekto nga gitukod sa Travis CI.
  • Ang tanan nga yunit, panagsama ug end-to-end nga mga pagsulay gihimo.

Alang lamang sa code nga nahulog sa master, ang mosunod gihimo:

  • Ang tanan nga gihisgutan sa ibabaw, dugang pa ...
  • Paghimo usa ka imahe sa Docker base sa karon nga code, setting ug palibot.
  • Pag-deploy sa imahe sa Docker Hub.
  • Koneksyon sa produksiyon server.
  • Pag-upload og imahe gikan sa Docker Hub ngadto sa server.
  • Paghunong sa kasamtangan nga sudlanan ug pagsugod og bag-o base sa bag-ong hulagway.

Kung wala ka nahibal-an bahin sa Docker, mga imahe ug mga sudlanan, ayaw kabalaka. Isulti ko kanimo ang tanan bahin niini.

Unsa ang CI/CD?

Ang minubo nga CI/CD nagpasabot sa “padayon nga paghiusa/padayon nga pagdeploy.”

▍Padayon nga paghiusa

Ang padayon nga panagsama usa ka proseso diin ang mga nag-develop naghimo sa mga pasalig sa panguna nga tipiganan sa source code sa proyekto (kasagaran usa ka sanga master). Sa parehas nga oras, ang kalidad sa code gisiguro pinaagi sa awtomatiko nga pagsulay.

▍Padayon nga pagdeploy

Ang padayon nga pag-deploy mao ang kanunay, awtomatiko nga pag-deploy sa code ngadto sa produksiyon. Ang ikaduhang bahin sa CI/CD acronym usahay gi-spelling isip "padayon nga pagpadala." Sa panguna parehas kini sa "padayon nga pag-deploy", apan ang "padayon nga paghatud" nagpasabut nga kinahanglan nga mano-mano ang pagkumpirma sa mga pagbag-o sa dili pa magsugod ang proseso sa pag-deploy sa proyekto.

Pagsugod

Ang app nga akong gigamit sa pagkat-on sa tanan niini nga gitawag TakeNote. Kini usa ka proyekto sa web nga akong gitrabaho, gidisenyo alang sa pagkuha og mga nota. Sa una gisulayan nako nga buhaton JAMStack-proyekto, o usa lang ka front-end nga aplikasyon nga walay server, aron mapahimuslan ang standard nga pag-host ug mga kapabilidad sa pag-deploy sa proyekto nga gitanyag niini netlify. Samtang nagkadako ang pagkakomplikado sa aplikasyon, kinahanglan nako nga maghimo sa bahin sa server niini, nga nagpasabut nga kinahanglan nako nga maghimo sa akong kaugalingon nga estratehiya alang sa awtomatiko nga paghiusa ug awtomatiko nga pag-deploy sa proyekto.

Sa akong kaso, ang aplikasyon usa ka Express server nga nagdagan sa Node.js nga palibot, nagserbisyo sa usa ka panid nga React nga aplikasyon ug nagsuporta sa usa ka luwas nga server-side API. Kini nga arkitektura nagsunod sa estratehiya nga makita sa gihatag Bug-os nga stack authentication nga giya.

Nagpakonsulta ko sa higala, kinsa usa ka eksperto sa automation, ug nangutana kaniya kung unsa ang kinahanglan nakong buhaton aron mahimo kining tanan sa paagi nga gusto nako. Gihatagan niya ako sa ideya kung unsa ang hitsura sa usa ka automated workflow, nga gilatid sa seksyon sa Mga Tumong niini nga artikulo. Ang pagbaton niini nga mga tumong nagpasabot nga kinahanglan nakong mahibal-an kung unsaon paggamit ang Docker.

Docker

Ang Docker usa ka himan nga, salamat sa teknolohiya sa containerization, nagtugot sa mga aplikasyon nga dali nga maapod-apod, ma-deploy ug modagan sa parehas nga palibot, bisan kung ang platform sa Docker mismo nagdagan sa lainlaing mga palibot. Una, kinahanglan nako nga makuha ang akong mga kamot sa Docker command line tools (CLI). Mga instruksyon Ang giya sa pag-install sa Docker dili matawag nga tin-aw kaayo ug masabtan, apan gikan niini mahibal-an nimo nga aron mahimo ang una nga lakang sa pag-install, kinahanglan nimo nga i-download ang Docker Desktop (alang sa Mac o Windows).

Ang Docker Hub halos parehas nga butang GitHub alang sa git repository, o registry npm alang sa JavaScript packages. Kini usa ka online nga repository alang sa mga imahe sa Docker. Kini ang gikonektar sa Docker Desktop.

Mao nga, aron makasugod sa Docker, kinahanglan nimo buhaton ang duha ka butang:

Pagkahuman niini, mahimo nimong susihon kung nagtrabaho ang Docker CLI pinaagi sa pagpadagan sa mosunud nga mando aron masusi ang bersyon sa Docker:

docker -v

Sunod, pag-log in sa Docker Hub pinaagi sa pagsulod sa imong username ug password kung gipangutana:

docker login

Aron magamit ang Docker, kinahanglan nimong masabtan ang mga konsepto sa mga imahe ug mga sulud.

▍Mga hulagway

Ang usa ka imahe sama sa usa ka blueprint nga adunay mga panudlo alang sa pag-assemble sa sudlanan. Kini usa ka dili mausab nga snapshot sa file system ug mga setting sa aplikasyon. Ang mga developer dali nga makapaambit sa mga imahe.

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

Kini nga sugo magpagawas sa usa ka lamesa nga adunay mosunod nga header:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Sunod atong tan-awon ang pipila ka mga pananglitan sa mga sugo sa samang format - una adunay usa ka sugo nga adunay usa ka komentaryo, ug dayon usa ka pananglitan kung unsa ang mahimo niini.

▍Mga sudlanan

Ang usa ka sudlanan usa ka ma-executable nga pakete nga adunay tanan nga gikinahanglan aron makadagan ang usa ka aplikasyon. Ang aplikasyon nga adunay kini nga pamaagi kanunay nga molihok, bisan unsa pa ang imprastraktura: sa usa ka hilit nga palibot ug sa parehas nga palibot. Ang punto mao nga ang mga higayon sa parehas nga imahe gilunsad sa lainlaing mga palibot.

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

▍ Mga tag

Ang tag usa ka timailhan sa usa ka piho nga bersyon sa usa ka imahe.

▍ Usa ka dali nga pakisayran sa mga mando sa Docker

Ania ang usa ka overview sa pipila ka sagad nga gigamit nga mga mando sa Docker.

team

Konteksto

epekto

pagtukod sa docker

Hulagway

Paghimo usa ka imahe gikan sa usa ka Dockerfile

tag sa pantalan

Hulagway

Pag-tag sa hulagway

docker nga mga imahen

Hulagway

Paglista sa mga hulagway

docker run

Kontainer

Pagpadagan sa usa ka sudlanan nga gibase sa usa ka imahe

pagduso sa pantalan

Hulagway

Pag-upload sa usa ka imahe sa rehistro

pagbira sa pantalan

Hulagway

Pag-load sa usa ka imahe gikan sa rehistro

docker ps

Kontainer

Paglista sa mga sudlanan

pagpul-ong sa sistema sa docker

Hulagway/Sudlanan

Pagtangtang sa wala magamit nga mga sudlanan ug mga imahe

▍Dockerfile

Nahibal-an ko kung unsaon pagpadagan ang usa ka aplikasyon sa produksiyon sa lokal. Naa koy configuration sa Webpack nga gidesinyo para magtukod ug ready-made React application. Sunod, ako adunay usa ka sugo nga nagsugod sa usa ka server nga nakabase sa Node.js sa pantalan 5000. Murag mao ni:

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

Kinahanglang hinumdoman nga wala ako'y pananglitan nga aplikasyon alang niini nga materyal. Apan dinhi, alang sa mga eksperimento, mahimo ang bisan unsang yano nga aplikasyon sa Node.

Aron magamit ang sudlanan, kinahanglan nimo nga maghatag mga panudlo sa Docker. Gihimo kini pinaagi sa usa ka file nga gitawag Dockerfile, nga nahimutang sa root directory sa proyekto. Kini nga file, sa sinugdan, ingon og dili masabtan.

Apan kung unsa ang sulud niini naghulagway lamang, nga adunay espesyal nga mga mando, usa ka butang nga susama sa pagpahimutang sa usa ka palibot nga nagtrabaho. Ania ang pipila niini nga mga sugo:

  • GIKAN - Kini nga sugo magsugod sa usa ka file. Gipiho niini ang base nga imahe diin gitukod ang sudlanan.
  • KOPYA - Pagkopya sa mga file gikan sa usa ka lokal nga tinubdan ngadto sa usa ka sudlanan.
  • WORKDIR — Pag-set sa working directory para sa mosunod nga mga sugo.
  • LUNGSOD - Pagdalag mga sugo.
  • PAHAYAG - Mga setting sa pantalan.
  • ENTRYPOINT - Indikasyon sa sugo nga ipatuman.

Dockerfile mahimong tan-awon sama niini:

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

Depende sa base nga imahe nga imong gipili, mahimo nimong i-install ang dugang nga mga dependency. Ang tinuod mao nga ang pipila ka mga base nga mga imahe (sama sa Node Alpine Linux) gimugna uban ang katuyoan sa paghimo niini nga ingon ka compact kutob sa mahimo. Ingon usa ka sangputanan, mahimo nga wala sila sa pipila nga mga programa nga imong gipaabut.

▍Pagtukod, pag-tag ug pagpadagan sa sudlanan

Ang lokal nga asembliya ug paglansad sa sudlanan pagkahuman naa namo Dockerfile, ang mga buluhaton kay yano ra. Sa dili pa nimo iduso ang imahe sa Docker Hub, kinahanglan nimo nga sulayan kini sa lokal.

▍Asembliya

Una kinahanglan nimo nga mangolekta larawan, nga nagpiho sa usa ka ngalan ug, opsyonal, usa ka tag (kung ang usa ka tag wala gitino, ang sistema awtomatik nga magbutang usa ka tag sa imahe latest).

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

Human sa pagpadagan niini nga sugo, mahimo nimong tan-awon ang Docker nga magtukod sa imahe.

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

Ang pagtukod mahimong molungtad ug pipila ka minuto - kini tanan nagdepende kung pila ang imong dependency. Kung kompleto na ang pagtukod, mahimo nimong ipadagan ang mando docker images ug tan-awa ang paghulagway sa imong bag-ong hulagway.

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

▍Ilusad

Ang imahe nahimo na. Nagpasabot kini nga mahimo nimong ipadagan ang usa ka sudlanan nga gibase niini. Tungod kay gusto ko nga ma-access ang aplikasyon nga nagdagan sa sudlanan sa localhost:5000, ako, sa wala nga bahin sa pares 5000:5000 sa sunod nga command nga gi-install 5000. Sa tuo nga bahin mao ang sudlanan nga pantalan.

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

Karon nga ang sudlanan gihimo ug nagdagan, mahimo nimong gamiton ang mando docker ps aron tan-awon ang impormasyon bahin niini nga sudlanan (o mahimo nimong gamiton ang command docker ps -a, nga nagpakita sa impormasyon mahitungod sa tanan nga mga sudlanan, dili lamang sa mga nagdagan).

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

Kung moadto ka karon sa adres localhost:5000 — Makita nimo ang usa ka panid sa usa ka nagdagan nga aplikasyon nga parehas nga hitsura sa panid sa usa ka aplikasyon nga nagdagan sa usa ka palibot sa produksiyon.

▍Pag-tag ug pagmantala

Aron magamit ang usa sa gibuhat nga mga imahe sa server sa produksiyon, kinahanglan namon nga ma-download kini nga imahe gikan sa Docker Hub. Kini nagpasabut nga kinahanglan nimo una nga maghimo usa ka repository alang sa proyekto sa Docker Hub. Human niini, aduna na kitay dapit diin mahimo natong ipadala ang hulagway. Ang imahe kinahanglan nga bag-ohon aron ang ngalan niini magsugod sa among Docker Hub username. Kini kinahanglan nga sundan sa ngalan sa repository. Ang bisan unsang tag mahimong ibutang sa katapusan sa ngalan. Sa ubos usa ka pananglitan sa pagngalan sa mga imahe gamit kini nga laraw.

Karon mahimo nimong tukuron ang imahe gamit ang usa ka bag-ong ngalan ug ipadagan ang mando docker push aron iduso kini sa Docker Hub repository.

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

Kung maayo ang tanan, ang imahe magamit sa Docker Hub ug dali nga ma-upload sa server o mabalhin sa ubang mga developer.

Sunod nga mga lakang

Sa pagkakaron among gipamatud-an nga ang aplikasyon, sa porma sa usa ka sudlanan sa Docker, nagdagan sa lokal. Gi-upload namo ang sudlanan sa Docker Hub. Kining tanan nagpasabot nga maayo na kaayo ang atong pag-uswag padulong sa atong tumong. Karon kinahanglan namong sulbaron ang duha pa ka pangutana:

  • Pag-set up sa usa ka tool sa CI alang sa pagsulay ug pag-deploy sa code.
  • Pag-set up sa production server aron kini maka-download ug makadagan sa among code.

Sa among kaso, among gigamit Travis CI. Ingon usa ka server - DitigalOcean.

Kinahanglan nga hinumdoman nga dinhi mahimo nimong gamiton ang lain nga kombinasyon sa mga serbisyo. Pananglitan, imbes sa Travis CI, mahimo nimong gamiton ang CircleCI o Github Actions. Ug imbes sa DigitalOcean - AWS o Linode.

Nakahukom kami nga magtrabaho kauban ang Travis CI, ug naa na koy na-configure sa kini nga serbisyo. Busa, karon ako sa mubo nga maghisgot kon sa unsang paagi sa pag-andam niini alang sa trabaho.

Travis CI

Ang Travis CI usa ka himan alang sa pagsulay ug pag-deploy sa code. Dili ko gusto nga moadto sa mga komplikado sa pag-set up sa Travis CI, tungod kay ang matag proyekto talagsaon, ug dili kini makahatag daghang kaayohan. Apan tabonan nako ang mga sukaranan aron makasugod ka kung magdesisyon ka nga gamiton ang Travis CI. Kung imong pilion ang Travis CI, CircleCI, Jenkins, o uban pa, ang parehas nga mga pamaagi sa pag-configure magamit bisan diin.

Aron makasugod sa Travis CI, adto sa website sa proyekto ug paghimo ug account. Dayon i-integrate ang Travis CI sa imong GitHub account. Kung gi-set up ang sistema, kinahanglan nimo nga ipiho ang repository nga gusto nimo nga i-automate ang trabaho ug hatagan ang pag-access niini. (Gigamit nako ang GitHub, apan sigurado ako nga ang Travis CI maka-integrate sa BitBucket, ug GitLab, ug uban pang susamang serbisyo).

Sa matag higayon nga magsugod ang Travis CI, ang server gilunsad, nga nagpatuman sa mga sugo nga gitakda sa configuration file, lakip ang pag-deploy sa katugbang nga mga sanga sa repository.

▍ Siklo sa kinabuhi sa trabaho

Travis CI configuration file gitawag .travis.yml ug gitipigan sa direktoryo sa gamut sa proyekto, nagsuporta sa konsepto sa mga panghitabo siklo sa kinabuhi mga buluhaton. Kini nga mga panghitabo gilista sa han-ay kung diin kini nahitabo:

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

▍Pagsulay

Sa configuration file akong i-configure ang lokal nga Travis CI server. Gipili nako ang Node 12 isip pinulongan ug gisultihan ang sistema nga i-install ang mga dependency nga gikinahanglan aron magamit ang Docker.

Ang tanan nga gilista sa .travis.yml, ipatuman kung ang tanan nga mga hangyo sa pagbitad gihimo sa tanan nga mga sanga sa repository, gawas kung gipiho. Kini usa ka mapuslanon nga bahin tungod kay kini nagpasabut nga mahimo naton masulayan ang tanan nga code nga moabut sa repository. Kini nagpahibalo kanimo kung ang code andam na nga isulat sa sanga. master, ug kung makaguba ba kini sa proseso sa pagtukod sa proyekto. Niini nga global nga configuration, akong gi-install ang tanan sa lokal, gipadagan ang Webpack dev server sa background (kini usa ka bahin sa akong workflow), ug nagpadagan sa mga pagsulay.

Kung gusto nimo nga ipakita sa imong repository ang mga badge nga nagpakita sa pagsakup sa pagsulay, dinhi Makaplagan nimo ang mugbong mga instruksyon sa paggamit sa Jest, Travis CI ug Coveralls sa pagkolekta ug pagpakita niini nga impormasyon.

Busa ania ang sulod sa file .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

Dinhi ang mga aksyon nga gihimo alang sa tanan nga mga sanga sa repository ug alang sa mga hangyo sa pagbitad natapos.

▍Pag-deploy

Pinasukad sa pangagpas nga malampuson nga nahuman ang tanan nga mga awtomatiko nga pagsulay, mahimo naton, nga opsyonal, i-deploy ang code sa server sa produksiyon. Tungod kay gusto namon nga buhaton kini alang lamang sa code gikan sa sanga master, gihatagan namo ang sistema og tukma nga mga instruksyon sa mga setting sa deployment. Sa dili ka pa mosulay sa paggamit sa code nga among tan-awon sa sunod sa imong proyekto, gusto ko nga pasidan-an ka nga kinahanglan adunay usa ka aktuwal nga script nga gitawag alang sa pag-deploy.

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

Ang deployment script nakasulbad sa duha ka problema:

  • Paghimo, tag ug ipadala ang imahe sa Docker Hub gamit ang usa ka tool sa CI (sa among kaso, Travis CI).
  • Pag-load sa imahe sa server, paghunong sa daan nga sudlanan ug pagsugod sa usa ka bag-o (sa among kaso, ang server nagdagan sa plataporma sa DigitalOcean).

Una, kinahanglan nimo nga maghimo usa ka awtomatikong proseso alang sa pagtukod, pag-tag, ug pagduso sa imahe sa Docker Hub. Kining tanan susama kaayo sa nahimo na namo nga mano-mano, gawas nga nagkinahanglan kami og estratehiya sa pag-assign sa talagsaon nga mga tag sa mga hulagway ug pag-automate sa mga login. Naglisud ko sa pipila ka mga detalye sa script sa pag-deploy, sama sa diskarte sa pag-tag, pag-login, pag-encode sa key sa SSH, pagtukod sa koneksyon sa SSH. Pero swerte kaayo ang akong uyab sa bash, sama sa uban pang mga butang. Gitabangan ko niya sa pagsulat niini nga script.

Mao nga, ang una nga bahin sa script mao ang pag-upload sa imahe sa Docker Hub. Sayon ra kining buhaton. Ang pamaagi sa pag-tag nga akong gigamit naglakip sa paghiusa sa usa ka git hash ug usa ka git tag, kung adunay usa. Gipaneguro niini nga ang tag talagsaon ug gipadali ang pag-ila sa asembliya diin kini gibase. DOCKER_USERNAME и DOCKER_PASSWORD mao ang user environment variables nga mahimong itakda gamit ang Travis CI interface. Awtomatiko nga iproseso sa Travis CI ang sensitibo nga datos aron dili kini mahulog sa sayup nga mga kamot.

Ania ang unang bahin sa 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}

Unsa ang ikaduha nga bahin sa script nagdepende sa tanan kung unsang host ang imong gigamit ug kung giunsa ang koneksyon niini giorganisar. Sa akong kaso, tungod kay gigamit nako ang Digital Ocean, gigamit nako ang mga mando aron makonektar sa server doctl. Kung nagtrabaho kauban ang AWS, ang utility gamiton aws, ug uban pa.

Ang pag-set up sa server dili kaayo lisud. Mao nga, nagbutang ako usa ka tinulo nga gibase sa base nga imahe. Kinahanglan nga matikdan nga ang sistema nga akong gipili nanginahanglan usa ka usa ka higayon nga manual nga pag-install sa Docker ug usa ka usa ka higayon nga manual nga paglansad sa Docker. Gigamit nako ang Ubuntu 18.04 aron i-install ang Docker, mao nga kung gigamit usab nimo ang Ubuntu aron buhaton ang parehas, mahimo nimong sundon kini simple nga giya.

Wala ako maghisgot dinhi bahin sa piho nga mga sugo alang sa serbisyo, tungod kay kini nga aspeto mahimong magkalainlain sa lainlaing mga kaso. Maghatag lang ako usa ka kinatibuk-ang plano sa aksyon nga himuon pagkahuman sa pagkonekta pinaagi sa SSH sa server diin ang proyekto i-deploy:

  • Kinahanglan natong pangitaon ang sudlanan nga nagdagan karon ug hunongon kini.
  • Unya kinahanglan nimo nga maglansad usa ka bag-ong sudlanan sa background.
  • Kinahanglan nimo nga ibutang ang lokal nga pantalan sa server sa 80 - kini magtugot kanimo sa pagsulod sa site sa usa ka adres sama example.com, nga walay pagpiho sa pantalan, kay sa paggamit ug adres sama sa example.com:5000.
  • Sa katapusan, kinahanglan nimong papason ang tanan nga daan nga mga sulud ug mga imahe.

Ania ang pagpadayon sa 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

Pipila ka mga butang nga angay hatagan ug pagtagad

Posible nga kung magkonektar ka sa server pinaagi sa SSH gikan sa Travis CI, makakita ka usa ka pasidaan nga makapugong kanimo sa pagpadayon sa pag-install tungod kay ang sistema maghulat alang sa tubag sa tiggamit.

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

Nahibal-an nako nga ang usa ka yawe sa pisi mahimong ma-encode sa base64 aron matipigan kini sa usa ka porma diin kini dali ug kasaligan nga magamit. Sa yugto sa pag-install, mahimo nimong ma-decode ang yawe sa publiko ug isulat kini sa usa ka file known_hosts para mawala ang sayop sa ibabaw.

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

Sa praktis, kini nga sugo mahimong ingon niini:

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

Ug ania ang gihimo niini - usa ka base64 nga gi-encode nga string:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Ania ang sugo nga gihisgotan sa ibabaw

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

Ang parehas nga pamaagi mahimong magamit sa usa ka pribado nga yawe kung maghimo usa ka koneksyon, tungod kay kinahanglan nimo ang usa ka pribado nga yawe aron ma-access ang server. Kung nagtrabaho gamit ang yawe, kinahanglan nimo nga sigurohon nga kini gitipigan nga luwas sa usa ka variable sa palibot sa Travis CI ug nga wala kini gipakita bisan diin.

Ang laing butang nga timan-an mao nga kinahanglan nimo nga ipadagan ang tibuuk nga script sa pag-deploy ingon usa ka linya, pananglitan - uban doctl. Mahimong magkinahanglan kini og dugang nga paningkamot.

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

TLS/SSL ug Load Balancing

Human nako gibuhat ang tanan nga gihisgutan sa ibabaw, ang katapusan nga problema nga akong nasugatan mao nga ang server walay SSL. Tungod kay naggamit ko og Node.js server, aron mapugos aron magtrabaho reverse proxy Nginx ug Let's Encrypt, kinahanglan nimo nga mag-tinker og daghan.

Dili gyud nako gusto nga buhaton ang tanan nga pag-configure sa SSL nga mano-mano, mao nga naghimo lang ako usa ka balanse sa pagkarga ug girekord ang mga detalye niini sa DNS. Sa kaso sa DigitalOcean, pananglitan, ang paghimo og auto-renewing self-signed certificate sa load balancer usa ka yano, libre ug paspas nga pamaagi. Kini nga pamaagi adunay dugang nga kaayohan nga kini makapasayon ​​kaayo sa pag-set up sa SSL sa daghang mga server nga nagdagan luyo sa usa ka load balancer kung gikinahanglan. Gitugotan niini ang mga server mismo nga dili "maghunahuna" bahin sa SSL, apan sa parehas nga oras gigamit ang pantalan sama sa naandan 80. Busa ang pag-set up sa SSL sa usa ka load balancer mas sayon ​​ug mas sayon ​​kay sa alternatibong pamaagi sa pag-set up sa SSL.

Karon mahimo nimong isira ang tanan nga mga pantalan sa server nga modawat sa umaabot nga mga koneksyon - gawas sa pantalan 80, gigamit sa pagpakigsulti sa load balancer, ug sa pantalan 22 para sa SSH. Ingon usa ka sangputanan, ang usa ka pagsulay nga direktang ma-access ang server sa bisan unsang mga pantalan gawas niining duha mapakyas.

Mga resulta

Pagkahuman nako gibuhat ang tanan nga akong gihisgutan sa kini nga materyal, ni ang plataporma sa Docker o ang mga konsepto sa automated nga CI / CD nga mga kadena nahadlok kanako. Nakahimo ako og usa ka padayon nga kadena sa panagsama, diin ang code gisulayan sa wala pa kini moadto sa produksiyon ug ang code awtomatikong i-deploy sa server. Kining tanan medyo bag-o pa alang kanako, ug sigurado ako nga adunay mga paagi aron mapaayo ang akong awtomatiko nga daloy sa trabaho ug himuon kini nga labi ka episyente. Busa kon duna kay ideya bahin niini, palihog pahibaloa ako. sa akoa nahibalo. Nanghinaut ko nga kini nga artikulo nakatabang kanimo sa imong mga paningkamot. Gusto kong motuo nga human mabasa kini, nakakat-on ka sama sa akong nakat-unan samtang gisusi ang tanan nga akong gihisgutan niini.

PS Sa among merkado naay image Docker, nga mahimong ma-install sa usa ka pag-klik. Mahimo nimong susihon ang operasyon sa mga sudlanan sa VPS. Tanang bag-ong mga kliyente gihatagan og 3 ka adlaw nga pagsulay nga walay bayad.

Minahal nga magbabasa! Gigamit ba nimo ang mga teknolohiya sa CI/CD sa imong mga proyekto?

Paghimo usa ka kadena sa CI / CD ug pag-automate sa trabaho sa Docker

Source: www.habr.com

Idugang sa usa ka comment