Kuunda mnyororo wa CI/CD na kazi ya kiotomatiki na Docker

Niliandika tovuti zangu za kwanza mwishoni mwa miaka ya 90. Wakati huo ilikuwa rahisi sana kuwaweka katika utaratibu wa kufanya kazi. Kulikuwa na seva ya Apache kwenye upangishaji wengine ulioshirikiwa, unaweza kuingia kwenye seva hii kupitia FTP kwa kuandika kitu kama hicho ftp://ftp.example.com. Kisha ulipaswa kuingiza jina lako na nenosiri na kupakia faili kwenye seva. Kulikuwa na nyakati tofauti, kila kitu kilikuwa rahisi wakati huo kuliko sasa.

Kuunda mnyororo wa CI/CD na kazi ya kiotomatiki na Docker

Katika miongo miwili tangu wakati huo, kila kitu kimebadilika sana. Tovuti zimekuwa ngumu zaidi; ni lazima zikusanywe kabla ya kutolewa katika uzalishaji. Seva moja ikawa seva nyingi zinazoendesha nyuma ya mizani ya mzigo, na matumizi ya mifumo ya udhibiti wa toleo ikawa kawaida.

Kwa mradi wangu wa kibinafsi nilikuwa na usanidi maalum. Na nilijua kuwa nilihitaji uwezo wa kupeleka tovuti katika uzalishaji kwa kufanya kitendo kimoja tu: kuandika nambari kwa tawi. master kwenye GitHub. Kwa kuongezea, nilijua kuwa ili kuhakikisha utendakazi wa programu yangu ndogo ya wavuti, sikutaka kusimamia nguzo kubwa ya Kubernetes, au kutumia teknolojia ya Docker Swarm, au kudumisha kundi la seva na maganda, mawakala na kila aina ya wengine. magumu. Ili kufikia lengo la kufanya kazi iwe rahisi iwezekanavyo, nilihitaji kufahamu CI/CD.

Ikiwa una mradi mdogo (katika kesi hii, mradi wa Node.js) na ungependa kujua jinsi ya kusambaza upelekaji wa mradi huu kiotomatiki, huku ukihakikisha kuwa kile kilichohifadhiwa kwenye hazina kinalingana kabisa na kile kinachofanya kazi katika uzalishaji, basi mimi. nadhani unaweza kupendezwa na makala hii.

Masharti

Msomaji wa nakala hii anatarajiwa kuwa na uelewa wa kimsingi wa safu ya amri na kuandika maandishi ya Bash. Kwa kuongeza, atahitaji akaunti Travis C.I. и Kitovu cha Docker.

Malengo ya

Sitasema kwamba makala hii inaweza kuitwa bila masharti "mafunzo". Hii ni zaidi ya hati ambayo ninazungumza juu ya yale ambayo nimejifunza na kuelezea mchakato ambao unanifaa kwa majaribio na kupeleka nambari kwenye uzalishaji, unaofanywa kwa pasi moja ya kiotomatiki.

Hivi ndivyo mtiririko wangu wa kazi uliishia.

Kwa nambari iliyotumwa kwa tawi lolote la hazina isipokuwa master, vitendo vifuatavyo vinafanywa:

  • Mradi unaojengwa kwenye Travis CI unaanza.
  • Vipimo vyote vya kitengo, ujumuishaji na mwisho hadi mwisho hufanywa.

Ni kwa nambari tu inayoangukia master, yafuatayo hufanywa:

  • Kila kitu kilichotajwa hapo juu, pamoja na ...
  • Kuunda picha ya Docker kulingana na nambari ya sasa, mipangilio na mazingira.
  • Inapeleka picha kwenye Docker Hub.
  • Muunganisho kwa seva ya uzalishaji.
  • Inapakia picha kutoka kwa Docker Hub hadi kwenye seva.
  • Kusimamisha kontena la sasa na kuanzisha jipya kulingana na picha mpya.

Ikiwa hujui chochote kuhusu Docker, picha na vyombo, usijali. Nitakuambia yote juu yake.

CI/CD ni nini?

Kifupi cha CI/CD kinasimama kwa "ushirikiano endelevu/usambazaji unaoendelea."

▍Ujumuishaji unaoendelea

Ujumuishaji unaoendelea ni mchakato ambao watengenezaji hufanya ahadi kwenye hazina kuu ya msimbo wa chanzo cha mradi (kawaida tawi master) Wakati huo huo, ubora wa msimbo unahakikishwa kupitia upimaji wa kiotomatiki.

▍ Usambazaji unaoendelea

Usambazaji unaoendelea ni uwekaji wa mara kwa mara, wa kiotomatiki wa msimbo katika uzalishaji. Sehemu ya pili ya kifupi cha CI/CD wakati mwingine huandikwa kama "uwasilishaji unaoendelea." Hii kimsingi ni sawa na "usambazaji unaoendelea", lakini "uwasilishaji endelevu" unamaanisha hitaji la kudhibitisha mabadiliko mwenyewe kabla ya kuanza mchakato wa kusambaza mradi.

Anza

Programu niliyotumia kujifunza haya yote inaitwa TakeNote. Huu ni mradi wa wavuti ninaofanyia kazi, ulioundwa kwa ajili ya kuandika madokezo. Mwanzoni nilijaribu kufanya JAMStack-mradi, au programu tumizi ya mbele bila seva, ili kuchukua fursa ya uwezo wa kawaida wa ukaribishaji na upelekaji wa mradi ambao hutoa. Netify. Utata wa programu ulipokua, nilihitaji kuunda sehemu yake ya seva, ambayo ilimaanisha kwamba ningehitaji kuunda mkakati wangu mwenyewe wa ujumuishaji wa kiotomatiki na usambazaji wa kiotomatiki wa mradi.

Kwa upande wangu, programu tumizi ni seva ya Express inayoendesha katika mazingira ya Node.js, inayotumikia programu ya React ya ukurasa mmoja na kuunga mkono API ya upande wa seva salama. Usanifu huu unafuata mkakati unaoweza kupatikana ndani kupewa Mwongozo kamili wa uthibitishaji wa rafu.

Nilishauriana na rafiki, ambaye ni mtaalamu wa mitambo, na kumuuliza nilichohitaji kufanya ili kufanya yote yafanyike jinsi nilivyotaka. Alinipa wazo la jinsi mtiririko wa kazi otomatiki unapaswa kuonekana, ulioainishwa katika sehemu ya Malengo ya nakala hii. Kuwa na malengo haya kulimaanisha kwamba nilihitaji kujua jinsi ya kutumia Docker.

Docker

Docker ni zana ambayo, kwa shukrani kwa teknolojia ya uwekaji vyombo, inaruhusu programu kusambazwa kwa urahisi, kutumwa na kuendeshwa katika mazingira sawa, hata kama jukwaa la Docker yenyewe linaendeshwa katika mazingira tofauti. Kwanza, nilihitaji kuweka mikono yangu kwenye zana za mstari wa amri ya Docker (CLI). Maagizo Mwongozo wa ufungaji wa Docker hauwezi kuitwa wazi sana na unaoeleweka, lakini kutoka humo unaweza kujifunza kwamba ili kuchukua hatua ya kwanza ya ufungaji, unahitaji kupakua Desktop ya Docker (kwa Mac au Windows).

Docker Hub ni takriban kitu sawa na GitHub kwa hazina za git, au usajili npm kwa vifurushi vya JavaScript. Hili ni hazina ya mtandaoni ya picha za Docker. Hivi ndivyo Docker Desktop inaunganisha.

Kwa hivyo, ili kuanza na Docker, unahitaji kufanya mambo mawili:

Baada ya hayo, unaweza kuangalia ikiwa Docker CLI inafanya kazi kwa kutekeleza amri ifuatayo kuangalia toleo la Docker:

docker -v

Ifuatayo, ingia kwenye Docker Hub kwa kuingiza jina lako la mtumiaji na nenosiri unapoulizwa:

docker login

Ili kutumia Docker, lazima uelewe dhana za picha na vyombo.

▍Picha

Picha ni kitu kama ramani ambayo ina maagizo ya kuunganisha chombo. Hii ni picha isiyoweza kubadilika ya mfumo wa faili wa programu na mipangilio. Wasanidi wanaweza kushiriki picha kwa urahisi.

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

Amri hii itatoa meza na kichwa kifuatacho:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Ifuatayo tutaangalia baadhi ya mifano ya amri katika umbizo sawa - kwanza kuna amri na maoni, na kisha mfano wa nini inaweza kutoa.

▍ Vyombo

Chombo ni kifurushi kinachoweza kutekelezeka ambacho kina kila kitu kinachohitajika ili kuendesha programu. Maombi na mbinu hii daima itafanya kazi sawa, bila kujali miundombinu: katika mazingira ya pekee na katika mazingira sawa. Jambo ni kwamba matukio ya picha sawa yanazinduliwa katika mazingira tofauti.

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

▍Lebo

Lebo ni ishara ya toleo maalum la picha.

▍Marejeleo ya haraka ya amri za Docker

Hapa kuna muhtasari wa amri zingine za Docker zinazotumiwa sana.

Timu

Muktadha

athari

ujenzi wa docker

Picha

Kuunda picha kutoka kwa Dockerfile

lebo ya docker

Picha

Kuweka tagi

picha za docker

Picha

Kuorodhesha picha

docker kukimbia

chombo

Kuendesha chombo kulingana na picha

kushinikiza docker

Picha

Inapakia picha kwenye Usajili

docker kuvuta

Picha

Inapakia picha kutoka kwa Usajili

docker ps

chombo

Kuorodhesha vyombo

kupogoa mfumo wa docker

Picha/Kontena

Kuondoa vyombo na picha ambazo hazijatumiwa

▍Dockerfile

Ninajua jinsi ya kuendesha programu ya uzalishaji ndani ya nchi. Nina usanidi wa Webpack iliyoundwa kuunda programu ya React iliyotengenezwa tayari. Ifuatayo, nina amri inayoanzisha seva ya msingi ya Node.js kwenye bandari 5000. Inaonekana kama hii:

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

Ikumbukwe kwamba sina maombi ya mfano kwa nyenzo hii. Lakini hapa, kwa majaribio, programu yoyote rahisi ya Node itafanya.

Ili kutumia chombo, utahitaji kutoa maagizo kwa Docker. Hii inafanywa kupitia faili inayoitwa Dockerfile, iliyoko kwenye saraka ya mizizi ya mradi. Faili hii, mwanzoni, inaonekana isiyoeleweka kabisa.

Lakini kile kilichomo kinaelezea tu, kwa amri maalum, kitu sawa na kuweka mazingira ya kazi. Hapa kuna baadhi ya amri hizi:

  • KUTOKA - Amri hii inaanzisha faili. Inabainisha picha ya msingi ambayo chombo kinajengwa.
  • COPY - Kunakili faili kutoka kwa chanzo cha ndani hadi kwenye kontena.
  • MFANYAKAZI - Kuweka saraka ya kufanya kazi kwa amri zifuatazo.
  • RUN - Kuendesha amri.
  • FICHUA - Mipangilio ya bandari.
  • KIINGILIO - Dalili ya amri ya kutekelezwa.

Dockerfile inaweza kuonekana kama hii:

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

Kulingana na picha ya msingi unayochagua, huenda ukahitaji kusakinisha vitegemezi vya ziada. Ukweli ni kwamba baadhi ya picha za msingi (kama Node Alpine Linux) zinaundwa kwa lengo la kuzifanya kuwa compact iwezekanavyo. Kwa hivyo, huenda wasiwe na baadhi ya programu unazotarajia.

▍Kujenga, kuweka alama na kuendesha chombo

Mkutano wa ndani na uzinduzi wa kontena ni baada ya kuwa na Dockerfile, kazi ni rahisi sana. Kabla ya kusukuma picha kwenye Docker Hub, unahitaji kuipima ndani ya nchi.

▍Mkusanyiko

Kwanza unahitaji kukusanya picha, ikibainisha jina na, kwa hiari, tepe (ikiwa lebo haijabainishwa, mfumo utatoa kiotomati tagi kwenye picha. latest).

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

Baada ya kutekeleza amri hii, unaweza kutazama Docker ikiunda picha.

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

Ujenzi unaweza kuchukua dakika kadhaa - yote inategemea ni utegemezi wangapi unao. Mara tu ujenzi ukamilika, unaweza kuendesha amri docker images na uangalie maelezo ya picha yako mpya.

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

▍Zindua

Picha imeundwa. Hii ina maana kwamba unaweza kuendesha chombo kulingana na hilo. Kwa sababu ninataka kuweza kupata programu inayoendesha kwenye kontena localhost:5000, mimi, upande wa kushoto wa jozi 5000:5000 katika amri inayofuata imewekwa 5000. Upande wa kulia ni bandari ya chombo.

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

Sasa kwa kuwa chombo kimeundwa na kinaendelea, unaweza kutumia amri docker ps kuangalia habari kuhusu chombo hiki (au unaweza kutumia amri docker ps -a, ambayo inaonyesha habari kuhusu vyombo vyote, sio tu vinavyoendesha).

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

Ikiwa sasa nenda kwa anwani localhost:5000 — unaweza kuona ukurasa wa programu inayoendeshwa ambayo inaonekana sawa kabisa na ukurasa wa programu inayoendeshwa katika mazingira ya utayarishaji.

▍Kutambulisha na kuchapisha

Ili kutumia mojawapo ya picha zilizoundwa kwenye seva ya uzalishaji, tunahitaji kuweza kupakua picha hii kutoka kwa Docker Hub. Hii inamaanisha kuwa kwanza unahitaji kuunda hazina ya mradi kwenye Docker Hub. Baada ya hayo, tutakuwa na mahali ambapo tunaweza kutuma picha. Picha inahitaji kubadilishwa jina ili jina lake lianze na jina la mtumiaji la Docker Hub. Hii inapaswa kufuatiwa na jina la hifadhi. Lebo yoyote inaweza kuwekwa mwishoni mwa jina. Chini ni mfano wa kutaja picha kwa kutumia mpango huu.

Sasa unaweza kujenga picha kwa jina jipya na kuendesha amri docker push ili kuisukuma kwenye hazina ya 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

Ikiwa kila kitu kitaenda vizuri, picha itapatikana kwenye Docker Hub na inaweza kupakiwa kwa urahisi kwenye seva au kuhamishiwa kwa watengenezaji wengine.

Hatua zifuatazo

Kufikia sasa tumethibitisha kuwa programu, katika mfumo wa kontena la Docker, inaendeshwa ndani ya nchi. Tumepakia kontena kwenye Docker Hub. Yote hii ina maana kwamba tayari tumepiga hatua nzuri sana kuelekea lengo letu. Sasa tunahitaji kutatua maswali mawili zaidi:

  • Kuweka zana ya CI kwa ajili ya kupima na kupeleka msimbo.
  • Kuweka seva ya uzalishaji ili iweze kupakua na kuendesha msimbo wetu.

Kwa upande wetu, tunatumia Travis C.I.. Kama seva - DitigalOcean.

Ikumbukwe kwamba hapa unaweza kutumia mchanganyiko mwingine wa huduma. Kwa mfano, badala ya Travis CI, unaweza kutumia CircleCI au Github Actions. Na badala ya DigitalOcean - AWS au Linode.

Tuliamua kufanya kazi na Travis CI, na tayari nina kitu kimesanidiwa katika huduma hii. Kwa hiyo, sasa nitazungumzia kwa ufupi jinsi ya kuitayarisha kwa kazi.

Travis C.I.

Travis CI ni zana ya kujaribu na kupeleka nambari. Nisingependa kuingia katika ugumu wa kuanzisha Travis CI, kwa kuwa kila mradi ni wa kipekee, na hii haitaleta faida nyingi. Lakini nitashughulikia mambo ya msingi ili uanze ikiwa utaamua kutumia Travis CI. Ukichagua Travis CI, CircleCI, Jenkins, au kitu kingine chochote, mbinu sawa za usanidi zitatumika kila mahali.

Ili kuanza na Travis CI, nenda kwenye tovuti ya mradi na unda akaunti. Kisha unganisha Travis CI na akaunti yako ya GitHub. Wakati wa kusanidi mfumo, utahitaji kutaja hazina ambayo unataka kufanya kazi kiotomatiki na kuwezesha ufikiaji wake. (Ninatumia GitHub, lakini nina uhakika kwamba Travis CI inaweza kuunganishwa na BitBucket, na GitLab, na huduma zingine zinazofanana).

Kila wakati Travis CI inapoanzishwa, seva inazinduliwa, kutekeleza amri zilizoainishwa kwenye faili ya usanidi, ikiwa ni pamoja na kupeleka matawi yanayolingana ya hazina.

▍Mzunguko wa maisha ya kazi

Faili ya usanidi ya Travis CI inayoitwa .travis.yml na kuhifadhiwa katika saraka ya mizizi ya mradi, inasaidia dhana ya matukio mzunguko wa maisha kazi. Matukio haya yameorodheshwa kwa mpangilio ambao yanatokea:

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

▍Majaribio

Kwenye faili ya usanidi nitasanidi seva ya Travis CI ya ndani. Nilichagua Node 12 kama lugha na nikaambia mfumo kusanikisha utegemezi unaohitajika kutumia Docker.

Kila kitu ambacho kimeorodheshwa ndani .travis.yml, itatekelezwa wakati maombi yote ya kuvuta yanafanywa kwa matawi yote ya hazina, isipokuwa ikiwa imeainishwa vinginevyo. Hiki ni kipengele muhimu kwa sababu inamaanisha kuwa tunaweza kujaribu nambari zote zinazoingia kwenye hazina. Hii hukujulisha ikiwa msimbo uko tayari kuandikwa kwa tawi. master, na kama itavunja mchakato wa ujenzi wa mradi. Katika usanidi huu wa kimataifa, mimi husakinisha kila kitu ndani, endesha seva ya Webpack dev nyuma (hii ni kipengele cha utiririshaji wangu wa kazi), na fanya majaribio.

Ikiwa ungependa hazina yako ionyeshe beji zinazoonyesha chanjo ya majaribio, hapa Unaweza kupata maagizo mafupi kuhusu kutumia Jest, Travis CI na Coveralls kukusanya na kuonyesha maelezo haya.

Kwa hivyo hapa kuna yaliyomo kwenye faili .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

Hapa ndipo vitendo vinavyofanywa kwa matawi yote ya hazina na maombi ya kuvuta huisha.

▍ Usambazaji

Kulingana na dhana kwamba majaribio yote ya kiotomatiki yamekamilika kwa mafanikio, tunaweza, ambayo ni hiari, kupeleka msimbo kwenye seva ya uzalishaji. Kwa kuwa tunataka kufanya hivi kwa nambari tu kutoka kwa tawi master, tunatoa maagizo sahihi ya mfumo katika mipangilio ya kupeleka. Kabla ya kujaribu kutumia msimbo ambao tutaangalia baadaye katika mradi wako, ningependa kukuonya kwamba lazima uwe na hati halisi inayoitwa kupelekwa.

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

Hati ya kupeleka hutatua shida mbili:

  • Jenga, tagi na utume picha hiyo kwa Docker Hub ukitumia zana ya CI (kwa upande wetu, Travis CI).
  • Inapakia picha kwenye seva, kusimamisha chombo cha zamani na kuanza mpya (kwa upande wetu, seva inaendesha kwenye jukwaa la DigitalOcean).

Kwanza, unahitaji kusanidi mchakato otomatiki wa kujenga, kuweka lebo, na kusukuma picha kwenye Docker Hub. Haya yote yanafanana sana na yale ambayo tayari tumefanya kwa mikono, isipokuwa tunahitaji mkakati wa kugawa tagi za kipekee kwa picha na kuweka kumbukumbu kiotomatiki. Nilikuwa na ugumu na maelezo kadhaa ya hati ya kupeleka, kama vile mkakati wa kuweka lebo, kuingia, usimbaji wa ufunguo wa SSH, uanzishaji wa muunganisho wa SSH. Lakini kwa bahati nzuri mpenzi wangu ni mzuri sana na bash, kama ilivyo kwa vitu vingine vingi. Alinisaidia kuandika maandishi haya.

Kwa hivyo, sehemu ya kwanza ya hati ni kupakia picha kwenye Docker Hub. Hii ni rahisi sana kufanya. Mpango wa kuweka lebo niliotumia unajumuisha kuchanganya git hash na git tag, ikiwa moja ipo. Hii inahakikisha kwamba lebo ni ya kipekee na hurahisisha kutambua mkusanyiko ambao inategemea. DOCKER_USERNAME и DOCKER_PASSWORD ni vigezo vya mazingira ya mtumiaji ambavyo vinaweza kuwekwa kwa kutumia kiolesura cha Travis CI. Travis CI itachakata kiotomatiki data nyeti ili isianguke kwenye mikono mibaya.

Hapa kuna sehemu ya kwanza ya hati 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}

Sehemu ya pili ya hati itakuwa nini inategemea kabisa ni mwenyeji gani unatumia na jinsi unganisho lake limepangwa. Kwa upande wangu, kwa kuwa ninatumia Bahari ya Dijiti, ninatumia amri kuunganishwa na seva doctl. Wakati wa kufanya kazi na AWS, matumizi yatatumika aws, Nakadhalika.

Kusanidi seva haikuwa ngumu haswa. Kwa hiyo, niliweka droplet kulingana na picha ya msingi. Ikumbukwe kwamba mfumo niliochagua unahitaji usakinishaji wa mwongozo wa wakati mmoja wa Docker na uzinduzi wa mwongozo wa wakati mmoja wa Docker. Nilitumia Ubuntu 18.04 kusanikisha Docker, kwa hivyo ikiwa unatumia Ubuntu kufanya vivyo hivyo, unaweza kufuata tu. hii mwongozo rahisi.

Sizungumzi hapa juu ya amri maalum za huduma, kwani kipengele hiki kinaweza kutofautiana sana katika matukio tofauti. Nitatoa tu mpango wa jumla wa hatua wa kufanywa baada ya kuunganishwa kupitia SSH kwa seva ambayo mradi utatumwa:

  • Tunahitaji kupata kontena ambayo inaendeshwa kwa sasa na kuisimamisha.
  • Kisha unahitaji kuzindua chombo kipya nyuma.
  • Utahitaji kuweka lango la ndani la seva kuwa 80 - hii itawawezesha kuingia kwenye tovuti kwa anwani kama example.com, bila kubainisha bandari, badala ya kutumia anwani kama example.com:5000.
  • Hatimaye, unahitaji kufuta vyombo vyote vya zamani na picha.

Hapa kuna muendelezo wa hati.

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

Baadhi ya mambo ya kuzingatia

Inawezekana kwamba unapounganisha kwenye seva kupitia SSH kutoka Travis CI, utaona onyo ambalo litakuzuia kuendelea na usakinishaji kwani mfumo utasubiri jibu la mtumiaji.

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

Nilijifunza kuwa kitufe cha kamba kinaweza kusimbwa katika base64 ili kuihifadhi katika fomu ambayo inaweza kufanya kazi nayo kwa urahisi na kwa uhakika. Katika hatua ya usakinishaji, unaweza kusimbua ufunguo wa umma na uiandike kwa faili known_hosts ili kuondoa makosa hapo juu.

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

Kwa mazoezi, amri hii inaweza kuonekana kama hii:

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

Na hii ndio inazalisha - kamba ya msingi64 iliyosimbwa:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Hapa kuna amri iliyotajwa hapo juu

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

Njia hiyo hiyo inaweza kutumika na ufunguo wa kibinafsi wakati wa kuanzisha muunganisho, kwani unaweza kuhitaji ufunguo wa kibinafsi ili kufikia seva. Unapofanya kazi na ufunguo, unahitaji tu kuhakikisha kuwa umehifadhiwa kwa usalama katika mabadiliko ya mazingira ya Travis CI na kwamba hauonyeshwa popote.

Jambo lingine la kuzingatia ni kwamba unaweza kuhitaji kuendesha hati nzima ya kupeleka kama safu moja, kwa mfano - na doctl. Hii inaweza kuhitaji juhudi fulani ya ziada.

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

TLS/SSL na Usawazishaji wa Mizigo

Baada ya kufanya kila kitu kilichotajwa hapo juu, shida ya mwisho niliyokutana nayo ni kwamba seva haikuwa na SSL. Kwa kuwa mimi hutumia seva ya Node.js, ili kulazimisha kufanya kazi wakala wa kubadilisha Nginx na Wacha Tusimbe, unahitaji kutafakari sana.

Kwa kweli sikutaka kufanya usanidi huu wote wa SSL kwa mikono, kwa hivyo niliunda tu kusawazisha mzigo na kurekodi maelezo yake katika DNS. Kwa upande wa DigitalOcean, kwa mfano, kuunda cheti cha kujisasisha kiotomatiki kilichosainiwa kwenye usawazishaji wa mzigo ni utaratibu rahisi, wa bure na wa haraka. Mbinu hii ina faida iliyoongezwa ambayo hurahisisha sana kusanidi SSL kwenye seva nyingi zinazoendesha nyuma ya kiweka sawa cha mzigo ikihitajika. Hii inaruhusu seva zenyewe "kutofikiria" juu ya SSL hata kidogo, lakini wakati huo huo tumia bandari kama kawaida. 80. Kwa hivyo kuanzisha SSL kwenye usawazishaji wa mzigo ni rahisi zaidi na rahisi zaidi kuliko mbinu mbadala za kuanzisha SSL.

Sasa unaweza kufunga bandari zote kwenye seva inayokubali miunganisho inayoingia - isipokuwa bandari 80, inayotumiwa kuwasiliana na mizani ya mzigo, na bandari 22 kwa SSH. Kwa hivyo, jaribio la kufikia seva moja kwa moja kwenye milango yoyote isipokuwa hizi mbili litashindwa.

Matokeo ya

Baada ya kufanya kila kitu nilichozungumza kwenye nyenzo hii, hakuna jukwaa la Docker au dhana za minyororo ya kiotomatiki ya CI/CD haikunitisha tena. Niliweza kusanidi msururu unaoendelea wa ujumuishaji, wakati ambapo msimbo unajaribiwa kabla haijatolewa na msimbo hutumwa kiotomatiki kwenye seva. Haya yote bado ni mapya kwangu, na nina uhakika kuna njia za kuboresha utiririshaji wangu wa kiotomatiki na kuifanya iwe bora zaidi. Kwa hivyo ikiwa una maoni yoyote juu ya jambo hili, tafadhali nijulishe. kwangu kujua. Natumaini makala hii imekusaidia katika jitihada zako. Nataka kuamini kwamba baada ya kuisoma, umejifunza mengi kama nilivyojifunza huku nikitafakari kila kitu nilichozungumza ndani yake.

PS Katika yetu sokoni kuna picha Docker, ambayo inaweza kusakinishwa kwa mbofyo mmoja. Unaweza kuangalia uendeshaji wa vyombo katika VPS. Wateja wote wapya wanapewa siku 3 za majaribio bila malipo.

Ndugu wasomaji! Je, unatumia teknolojia za CI/CD katika miradi yako?

Kuunda mnyororo wa CI/CD na kazi ya kiotomatiki na Docker

Chanzo: mapenzi.com

Kuongeza maoni