Creu cadwyn CI/CD ac awtomeiddio gwaith gyda Docker

Ysgrifennais fy gwefannau cyntaf yn y 90au hwyr. Yna roedd yn hawdd iawn dod â nhw i gyflwr gweithio. Roedd gweinydd Apache ar rywfaint o westeiwr a rennir, roedd modd cyrchu'r gweinydd hwn trwy FTP trwy ysgrifennu rhywbeth fel ftp://ftp.example.com. Yna roedd angen nodi enw a chyfrinair a llwytho'r ffeiliau i'r gweinydd. Roedd yna adegau eraill, roedd popeth yn symlach bryd hynny nag y mae nawr.

Creu cadwyn CI/CD ac awtomeiddio gwaith gyda Docker

Mae pethau wedi newid llawer yn y ddau ddegawd diwethaf. Mae safleoedd wedi dod yn fwy cymhleth, rhaid eu cydosod cyn eu rhyddhau i gynhyrchu. Mae un gweinydd sengl wedi dod yn llawer o weinyddion sy'n rhedeg y tu ôl i gydbwyswyr llwyth, ac mae'r defnydd o systemau rheoli fersiynau wedi dod yn gyffredin.

Ar gyfer fy mhrosiect personol, roedd gen i gyfluniad arbennig. Ac roeddwn i'n gwybod bod angen y gallu arnaf i ddefnyddio gwefan wrth gynhyrchu, gan berfformio un weithred yn unig: ysgrifennu cod i gangen master ar GitHub. Roeddwn i'n gwybod hefyd nad oeddwn i eisiau rheoli clwstwr Kubernetes enfawr, na defnyddio technoleg Docker Swarm, na chynnal parc gweinyddwyr gyda chodennau, asiantau, a phob math o gymhlethdodau eraill, i redeg fy nghais gwe bach. Er mwyn cyrraedd y nod o wneud gwaith mor hawdd â phosibl, roedd angen i mi ddod yn gyfarwydd â CI / CD.

Os oes gennych chi brosiect bach (yn ein hachos ni, prosiect Node.js) ac yr hoffech chi ddysgu sut i awtomeiddio'r defnydd o'r prosiect hwn, tra'n sicrhau bod yr hyn sy'n cael ei storio yn y storfa yn cyfateb yn union i'r hyn sy'n gweithio wrth gynhyrchu, rwy'n meddwl efallai y bydd gennych ddiddordeb yn yr erthygl hon.

Rhagofynion

Disgwylir i ddarllenydd yr erthygl hon feddu ar linell orchymyn sylfaenol a gwybodaeth sgriptio Bash. Yn ogystal, bydd angen cyfrifon arno Travis CI и Hwb dociwr.

Amcanion

Ni ddywedaf y gellir galw'r erthygl hon yn ddiamod yn "ganllaw hyfforddi". Mae hon yn fwy o ddogfen lle rwy'n siarad am yr hyn a ddysgais ac yn disgrifio'r broses sy'n addas i mi ar gyfer profi a defnyddio cod i gynhyrchu, wedi'i berfformio mewn un pas awtomataidd.

Dyma sut olwg oedd ar fy llif gwaith yn y diwedd.

Ar gyfer cod gwthio i unrhyw gangen o'r ystorfa ac eithrio master, cyflawnir y camau gweithredu canlynol:

  • Prosiect adeiladu ar Travis CI yn dechrau.
  • Perfformir yr holl brofion uned, integreiddio a diwedd-i-ddiwedd.

Dim ond ar gyfer cod sy'n dod i ben i mewn master, gwneir y canlynol:

  • Pob un o'r uchod, yn ogystal...
  • Adeiladu delwedd Docker yn seiliedig ar y cod, y gosodiadau a'r amgylchedd cyfredol.
  • Yn cynnal y ddelwedd ar Docker Hub.
  • Cysylltiad â'r gweinydd cynhyrchu.
  • Lanlwytho delwedd o Docker Hub i'r gweinydd.
  • Stopiwch y cynhwysydd presennol a chychwyn un newydd yn seiliedig ar y ddelwedd newydd.

Os nad ydych chi'n gwybod dim am Docker, delweddau a chynwysyddion, peidiwch â phoeni. Byddaf yn dweud wrthych i gyd amdano.

Beth yw CI/CD?

Mae'r talfyriad CI / CD yn sefyll am "integreiddio parhaus / defnydd parhaus" - "integreiddio parhaus / lleoli parhaus".

▍ Integreiddio Parhaus

Integreiddio Parhaus yw'r broses a ddefnyddir gan ddatblygwyr i ymrwymo i brif storfa cod ffynhonnell prosiect (cangen fel arfer master). Ar yr un pryd, sicrheir ansawdd y cod trwy brofion awtomataidd.

▍ Defnydd Parhaus

Defnydd parhaus yw'r defnydd awtomataidd o god i gynhyrchu. Weithiau datgelir ail ran y talfyriad CI / CD fel "cyflwyniad parhaus" ("cyflenwi parhaus"). Mae hyn yn y bôn yr un peth â "defnyddio parhaus", ond mae "cyflawni parhaus" yn awgrymu bod yn rhaid cadarnhau newidiadau â llaw cyn dechrau'r broses o ddefnyddio'r prosiect.

Dechrau Arni

Gelwir y cais y meistrolais hyn oll Cymer Nodyn. Dyma brosiect gwe dwi'n gweithio arno ar gyfer cymryd nodiadau. Yn gyntaf ceisiais wneud JAMStack-project, neu ddim ond cymhwysiad pen blaen heb weinydd, er mwyn manteisio ar yr opsiynau cynnal a defnyddio prosiect safonol y mae'n eu cynnig rhwydi. Wrth i gymhlethdod y cais dyfu, roedd angen i mi greu ei ben ôl, a oedd yn golygu y byddai'n rhaid i mi ffurfio fy strategaeth fy hun ar gyfer integreiddio awtomataidd a defnyddio'r prosiect yn awtomataidd.

Yn fy achos i, mae'r cymhwysiad yn weinydd cyflym sy'n rhedeg mewn amgylchedd Node.js, sy'n gwasanaethu cymhwysiad React un dudalen ac yn cefnogi API diogel ar ochr y gweinydd. Mae'r bensaernïaeth hon yn dilyn strategaeth y gellir ei chanfod yn a roddwyd canllaw dilysu pentwr llawn.

Ymgynghorais â ffrind, sy'n arbenigwr ar awtomeiddio, a gofynnodd iddo beth sydd angen i mi ei wneud i wneud i'r cyfan weithio'r ffordd rydw i eisiau. Rhoddodd syniad i mi o sut olwg ddylai fod ar y llif gwaith awtomataidd a amlinellir yn adran Nodau'r erthygl hon. Roedd gosod nodau fel hyn yn golygu bod angen i mi ddarganfod sut i ddefnyddio Docker.

Docker

Mae Docker yn offeryn sydd, diolch i dechnoleg cynhwysyddio, yn ei gwneud hi'n hawdd dosbarthu cymwysiadau, yn ogystal â'u defnyddio a'u rhedeg yn yr un amgylchedd, hyd yn oed os yw platfform Docker ei hun yn rhedeg mewn gwahanol amgylcheddau. Yn gyntaf, roedd angen i mi gael fy nwylo ar offer llinell orchymyn Docker (CLI). cyfarwyddyd Nid yw'r canllaw gosod ar gyfer Docker yn glir iawn, ond gallwch ddysgu ohono, er mwyn cymryd cam cyntaf y gosodiad, bod angen i chi lawrlwytho Docker Desktop (ar gyfer Mac neu Windows).

Mae Docker Hub tua'r un peth â GitHub ar gyfer ystorfeydd git, neu gofrestrfa npm ar gyfer pecynnau JavaScript. Mae hon yn storfa ar-lein ar gyfer delweddau Docker. Dyma lle mae Docker Desktop yn cysylltu â.

Felly, er mwyn dechrau gyda Docker, mae angen i chi wneud dau beth:

Ar ôl hynny, gallwch wirio a yw'r Docker CLI yn gweithio trwy redeg y gorchymyn canlynol i wirio fersiwn Docker:

docker -v

Nesaf, mewngofnodwch i Docker Hub trwy nodi'ch enw defnyddiwr a'ch cyfrinair pan ofynnir i chi:

docker login

Er mwyn defnyddio Docker, rhaid i chi ddeall cysyniadau delweddau a chynwysyddion.

▍ Delweddau

Mae delwedd yn fath o lasbrint sy'n cynnwys cyfarwyddiadau ar gyfer adeiladu cynhwysydd. Dyma giplun digyfnewid o'r system ffeiliau a gosodiadau'r rhaglen. Gall datblygwyr rannu delweddau yn hawdd.

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

Bydd y gorchymyn hwn yn allbynnu tabl gyda'r teitl canlynol:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Nesaf, byddwn yn ystyried rhai enghreifftiau o orchmynion yn yr un fformat - yn gyntaf mae gorchymyn gyda sylw, ac yna enghraifft o'r hyn y gall ei allbwn.

▍ Cynwysyddion

Mae cynhwysydd yn becyn gweithredadwy sy'n cynnwys popeth sydd ei angen i redeg cais. Bydd cymhwysiad gyda'r dull hwn bob amser yn gweithio yr un peth, waeth beth fo'r seilwaith: mewn amgylchedd ynysig ac yn yr un amgylchedd. Yr ydym yn sôn am y ffaith bod enghreifftiau o'r un ddelwedd yn cael eu lansio mewn gwahanol amgylcheddau.

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

▍Tagiau

Mae tag yn arwydd o fersiwn benodol o ddelwedd.

▍ Cyfeiriad cyflym ar gyfer gorchmynion Docker

Dyma drosolwg o rai gorchmynion Docker a ddefnyddir yn gyffredin.

Tîm

Cyd-destun

effaith

adeiladu docwr

Delwedd

Adeiladu delwedd o Dockerfile

tag docwr

Delwedd

Tagio delwedd

delweddau docker

Delwedd

Yn dangos rhestr o ddelweddau

docker rhedeg

Cynhwysydd

Rhedeg cynhwysydd sy'n seiliedig ar ddelwedd

gwthio docwr

Delwedd

Anfon Delwedd i'r Gofrestrfa

tynnu docwr

Delwedd

Llwytho Delwedd o'r Gofrestrfa

docker ps

Cynhwysydd

Rhestru cynwysyddion

tocio system docwr

Delwedd/Cynhwysydd

Cael gwared ar gynwysyddion a delweddau nas defnyddiwyd

▍Dockerfile

Rwy'n gwybod sut i redeg cais cynhyrchu yn lleol. Mae gen i gyfluniad pecyn gwe i adeiladu app React gorffenedig. Nesaf, mae gen i orchymyn sy'n cychwyn gweinydd sy'n seiliedig ar Node.js ar y porthladd 5000. Mae'n edrych fel hyn:

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

Dylid nodi nad oes gennyf gais enghreifftiol ar gyfer y deunydd hwn. Ond yma, ar gyfer arbrofion, bydd unrhyw gais Node syml yn ei wneud.

Er mwyn defnyddio'r cynhwysydd, bydd angen i chi roi cyfarwyddiadau i Docker. Gwneir hyn trwy ffeil o'r enw Dockerfilelleoli yng nghyfeirlyfr gwraidd y prosiect. Mae'r ffeil hon, ar y dechrau, yn ymddangos braidd yn annealladwy.

Ond nid yw'r hyn sydd ynddo ond yn disgrifio, mewn gorchmynion arbennig, rywbeth fel sefydlu amgylchedd gwaith. Dyma rai o'r gorchmynion hynny:

  • O - Mae'r gorchymyn hwn yn cychwyn ffeil. Mae'n nodi'r ddelwedd sylfaenol y mae'r cynhwysydd wedi'i adeiladu ohoni.
  • COPI - Copïo ffeiliau o ffynhonnell leol i gynhwysydd.
  • GWAITHDIR - Gosod y cyfeiriadur gweithio ar gyfer y gorchmynion canlynol.
  • RUN - Rhedeg gorchmynion.
  • YMOSODIAD —Gosodiad porthladd.
  • MYNEDIAD — Arwydd o'r gorchymyn i'w weithredu.

Dockerfile efallai edrych rhywbeth fel hyn:

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

Yn dibynnu ar y ddelwedd sylfaenol a ddewiswch, efallai y bydd angen i chi osod dibyniaethau ychwanegol. Y ffaith yw bod rhai delweddau sylfaenol (fel Node Alpine Linux) wedi'u cynllunio i fod mor gryno â phosib. O ganlyniad, efallai na fyddant yn cynnwys rhai o'r rhaglenni rydych chi'n eu disgwyl.

▍Adeiladu, tagio a rhedeg cynhwysydd

Cydosod lleol a lansio'r cynhwysydd yw, ar ôl i ni gael Dockerfilemae'r tasgau'n eithaf syml. Cyn gwthio delwedd i Docker Hub, mae angen ei brofi'n lleol.

▍ Cynulliad

Yn gyntaf mae angen i chi gasglu delwedd, gan nodi enw, ac, yn ddewisol, tag (os na nodir tag, bydd y system yn aseinio tag i'r ddelwedd yn awtomatig latest).

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

Ar ôl rhedeg y gorchymyn hwn, gallwch wylio Docker yn adeiladu'r ddelwedd.

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

Gall adeiladu gymryd ychydig funudau - mae'r cyfan yn dibynnu ar faint o ddibyniaethau sydd gennych. Ar ôl i'r adeiladwaith gael ei gwblhau, gallwch redeg y gorchymyn docker images ac edrychwch ar y disgrifiad o'ch delwedd newydd.

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

▍ Lansio

Mae'r ddelwedd wedi'i chreu. Ac mae hyn yn golygu y gallwch chi redeg cynhwysydd ar ei sail. Gan fy mod am allu cyrchu'r rhaglen sy'n rhedeg yn y cynhwysydd yn localhost:5000, i, ar ochr chwith y pâr 5000:5000 yn y set gorchymyn canlynol 5000. Ar yr ochr dde mae'r porthladd cynhwysydd.

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

Nawr bod y cynhwysydd wedi'i greu a'i redeg, gallwch ddefnyddio'r gorchymyn docker ps i edrych ar wybodaeth am y cynhwysydd hwn (neu gallwch ddefnyddio'r gorchymyn docker ps -a, sy'n dangos gwybodaeth am yr holl gynwysyddion, nid dim ond rhai rhedeg).

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

Os ewch nawr i localhost:5000 - gallwch weld tudalen y rhaglen redeg, sy'n edrych yn union yr un fath â thudalen y rhaglen sy'n rhedeg yn yr amgylchedd cynhyrchu.

▍Aseiniad Tagiau a Chyhoeddi

Er mwyn defnyddio un o'r delweddau a grëwyd ar y gweinydd cynhyrchu, mae angen i ni allu lawrlwytho'r ddelwedd hon o Docker Hub. Mae hyn yn golygu bod angen i chi greu ystorfa ar gyfer y prosiect ar Docker Hub yn gyntaf. Ar ôl hynny, bydd gennym le lle gallwn anfon y ddelwedd. Mae angen ailenwi'r ddelwedd fel bod ei henw yn dechrau gyda'n henw defnyddiwr Docker Hub. Dylid dilyn hyn gan enw'r ystorfa. Gellir gosod unrhyw dag ar ddiwedd yr enw. Isod mae enghraifft o enwi delweddau yn ôl y cynllun hwn.

Nawr gallwch chi adeiladu'r ddelwedd gydag enw newydd wedi'i neilltuo iddo a rhedeg y gorchymyn docker push i'w wthio i ystorfa 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

Os aiff popeth yn iawn, bydd y ddelwedd ar gael ar Docker Hub a gellir ei huwchlwytho'n hawdd i'r gweinydd neu ei rhannu â datblygwyr eraill.

Camau nesaf

Erbyn hyn, rydym wedi gwirio bod y cais, ar ffurf cynhwysydd Docker, yn rhedeg yn lleol. Rydym wedi uwchlwytho'r cynhwysydd i Docker Hub. Mae hyn i gyd yn golygu ein bod eisoes wedi gwneud cynnydd da iawn tuag at ein nod. Nawr mae angen i ni ddatrys dau gwestiwn arall:

  • Sefydlu offeryn CI ar gyfer profi a defnyddio cod.
  • Sefydlu'r gweinydd cynhyrchu fel y gall lawrlwytho a rhedeg ein cod.

Yn ein hachos ni, fel ateb CI / CD, rydym yn defnyddio Travis CI. Fel gweinydd - Cefnfor Digidol.

Dylid nodi y gallwch ddefnyddio cyfuniad arall o wasanaethau yma. Er enghraifft, yn lle Travis CI, gallwch ddefnyddio CircleCI neu Github Actions. Ac yn lle DigitalOcean - AWS neu Linode.

Fe benderfynon ni weithio gyda Travis CI, ac mae gen i rywbeth wedi'i sefydlu yn y gwasanaeth hwn yn barod. Felly, yn awr byddaf yn sôn yn fyr am sut i'w baratoi ar gyfer gwaith.

Travis CI

Offeryn ar gyfer profi a defnyddio cod yw Travis CI. Nid wyf am fynd i mewn i fanylion sefydlu Travis CI, gan fod pob prosiect yn unigryw ac ni fydd yn gwneud llawer o les. Ond byddaf yn ymdrin â'r pethau sylfaenol i'ch rhoi ar ben ffordd os penderfynwch ddefnyddio Travis CI. Beth bynnag a ddewiswch - Travis CI, CircleCI, Jenkins, neu rywbeth arall, bydd dulliau cyfluniad tebyg yn berthnasol ym mhobman.

I ddechrau gyda Travis CI, ewch i gwefan y prosiect a chreu cyfrif. Yna integreiddio Travis CI â'ch cyfrif GitHub. Wrth sefydlu'r system, bydd angen i chi nodi'r ystorfa yr ydych am ei awtomeiddio a galluogi mynediad iddi. (Rwy'n defnyddio GitHub, ond rwy'n siŵr y gall Travis CI integreiddio â BitBucket, GitLab, a gwasanaethau tebyg eraill).

Bob tro y bydd Travis CI yn cael ei gychwyn, mae gweinydd yn cael ei gychwyn sy'n gweithredu'r gorchmynion a nodir yn y ffeil ffurfweddu, gan gynnwys defnyddio canghennau priodol yr ystorfa.

▍ Cylch bywyd swydd

Galwodd ffeil ffurfweddu Travis CI .travis.yml a'i storio yng nghyfeirlyfr gwraidd y prosiect, yn cefnogi'r cysyniad o ddigwyddiadau cylch bywyd tasgau. Dyma'r digwyddiadau, a restrir yn y drefn y maent yn digwydd:

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

▍ Profi

Yn y ffeil ffurfweddu, rydw i'n mynd i sefydlu gweinydd CI Travis lleol. Dewisais Node 12 fel yr iaith a dywedais wrth y system i osod y dibyniaethau sydd eu hangen i ddefnyddio Docker.

Popeth a restrir yn .travis.yml, yn cael ei weithredu ar bob cais tynnu i bob cangen o'r gadwrfa, oni nodir yn wahanol. Mae hon yn nodwedd ddefnyddiol gan ei bod yn golygu y gallwn brofi'r holl god sy'n mynd i'r gadwrfa. Mae hyn yn eich galluogi i wybod a yw'r cod yn barod i'w ysgrifennu at y gangen. master, ac a fydd yn torri proses adeiladu'r prosiect. Yn y cyfluniad byd-eang hwn, rwy'n gosod popeth yn lleol, yn rhedeg y gweinydd Webpack dev yn y cefndir (mae hyn yn nodwedd o'm llif gwaith), ac yn rhedeg y profion.

Os ydych chi am i'ch ystorfa arddangos eiconau cwmpas cod, yma gallwch ddod o hyd i diwtorial cyflym ar sut i ddefnyddio Jest, Travis CI, a Coveralls i gasglu ac arddangos y wybodaeth hon.

Felly dyma gynnwys y ffeil .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

Dyma lle mae'r gweithredoedd a gyflawnir ar gyfer pob cangen o'r gadwrfa ac ar gyfer ceisiadau tynnu yn dod i ben.

▍ Defnydd

Yn seiliedig ar y rhagdybiaeth bod yr holl brofion awtomataidd wedi'u cwblhau'n llwyddiannus, gallwn ddefnyddio'r cod yn ddewisol i'r gweinydd cynhyrchu. Gan mai dim ond ar gyfer cod cangen yr ydym am wneud hyn master, rydym yn rhoi'r cyfarwyddiadau priodol i'r system yn y gosodiadau lleoli. Cyn i chi geisio defnyddio'r cod y byddwn yn edrych arno nesaf yn eich prosiect, hoffwn eich rhybuddio bod yn rhaid i chi gael sgript wirioneddol y gelwir ei defnyddio.

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

Mae'r sgript lleoli yn gwneud dau beth:

  • Adeiladu, tagio ac anfon y ddelwedd i Docker Hub gan ddefnyddio offeryn CI (Travis CI yn ein hachos ni).
  • Llwytho'r ddelwedd ar y gweinydd, atal yr hen gynhwysydd a dechrau un newydd (yn ein hachos ni, mae'r gweinydd yn rhedeg ar lwyfan DigitalOcean).

Yn gyntaf, mae angen i chi sefydlu proses awtomatig ar gyfer adeiladu, tagio a gwthio'r ddelwedd i Docker Hub. Mae hyn i gyd yn debyg iawn i'r hyn a wnaethom eisoes â llaw, ac eithrio bod angen strategaeth arnom yma ar gyfer aseinio tagiau unigryw i ddelweddau ac awtomeiddio mewngofnodi. Cefais anhawster gyda rhai manylion am y sgript defnyddio, megis strategaeth tagio, mewngofnodi, amgodio allweddi SSH, sefydlu cysylltiad SSH. Ond yn ffodus, mae fy nghariad yn dda iawn gyda bash, yn ogystal â llawer o bethau eraill. Fe helpodd fi i ysgrifennu'r sgript hon.

Felly, rhan gyntaf y sgript yw anfon y ddelwedd i Docker Hub. Mae gwneud hyn yn eithaf syml. Mae'r cynllun tagio rydw i wedi'i ddefnyddio yn golygu cyfuno'r hash git a'r tag git os yw'n bodoli. Mae hyn yn sicrhau bod y tag yn unigryw ac yn ei gwneud hi'n haws adnabod y cynulliad y mae'n seiliedig arno. DOCKER_USERNAME и DOCKER_PASSWORD yn newidynnau amgylchedd a ddiffinnir gan ddefnyddwyr y gellir eu gosod gan ddefnyddio rhyngwyneb Travis CI. Bydd Travis CI yn prosesu data sensitif yn awtomatig fel nad yw'n syrthio i'r dwylo anghywir.

Dyma ran gyntaf y sgript 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}

Mae beth fydd ail ran y sgript yn dibynnu'n llwyr ar ba westeiwr rydych chi'n ei ddefnyddio a sut mae'r cysylltiad ag ef wedi'i drefnu. Yn fy achos i, gan fy mod yn defnyddio Digital Ocean, defnyddir y gorchmynion i gysylltu â'r gweinydd doctl. Wrth weithio gydag Aws, bydd y cyfleustodau yn cael ei ddefnyddio aws, ac yn y blaen.

Nid oedd gosod y gweinydd yn arbennig o anodd. Felly, gosodais droplet yn seiliedig ar y ddelwedd sylfaenol. Dylid nodi bod y system a ddewisais yn gofyn am osod Docker â llaw un-amser a chychwyn Docker â llaw un-amser. Defnyddiais Ubuntu 18.04 i osod Docker, felly os ydych chi hefyd yn defnyddio Ubuntu gallwch chi ddilyn hwn arweiniad syml.

Nid wyf yn sôn am orchmynion penodol ar gyfer y gwasanaeth yma, gan y gall yr agwedd hon amrywio'n fawr mewn gwahanol achosion. Byddaf yn rhoi cynllun gweithredu cyffredinol i'w berfformio ar ôl cysylltu trwy SSH â'r gweinydd lle bydd y prosiect yn cael ei ddefnyddio:

  • Mae angen ichi ddod o hyd i'r cynhwysydd sy'n rhedeg ar hyn o bryd a'i atal.
  • Yna mae angen i chi ddechrau cynhwysydd newydd yn y cefndir.
  • Bydd angen i chi osod porthladd lleol y gweinydd i 80 - bydd hyn yn caniatáu ichi fynd i mewn i'r safle yng nghyfeiriad y ffurflen example.com, heb nodi porthladd, yn hytrach na defnyddio cyfeiriad fel example.com:5000.
  • Ac yn olaf, mae angen i chi gael gwared ar yr holl hen gynwysyddion a delweddau.

Dyma barhad y sgript.

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

Rhai pethau i wylio amdanynt

Mae'n bosibl pan fyddwch chi'n cysylltu â'r gweinydd trwy SSH gan Travis CI, fe welwch rybudd na fydd yn caniatáu ichi barhau â'r gosodiad, gan y bydd y system yn aros am ymateb y defnyddiwr.

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

Dysgais y gellir amgodio allwedd llinyn yn base64 er mwyn ei storio mewn ffurf y gellir ei gweithio'n gyfleus ac yn ddibynadwy ag ef. Yn y cam gosod, gallwch ddadgodio'r allwedd gyhoeddus a'i ysgrifennu i ffeil known_hosts er mwyn cael gwared ar y gwall uchod.

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

Yn ymarferol, gallai'r gorchymyn hwn edrych fel hyn:

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

A dyma beth mae'n ei roi allan - llinyn wedi'i amgodio base64:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Dyma'r gorchymyn a grybwyllir uchod

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

Gellir defnyddio'r un dull gydag allwedd breifat wrth sefydlu cysylltiad, oherwydd efallai y bydd angen allwedd breifat arnoch i gael mynediad i'r gweinydd. Wrth weithio gydag allwedd, does ond angen i chi sicrhau ei fod yn cael ei storio'n ddiogel mewn newidyn amgylchedd Travis CI, ac nad yw'n cael ei arddangos yn unman.

Peth arall i'w nodi yw efallai y bydd angen i chi redeg y sgript defnyddio gyfan fel llinell sengl, er enghraifft gyda doctl. Gall hyn olygu rhywfaint o ymdrech ychwanegol.

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

TLS/SSL a chydbwyso llwyth

Ar ôl i mi wneud yr uchod i gyd, y broblem olaf a gefais oedd nad oedd gan y gweinydd SSL. Gan fy mod yn defnyddio gweinydd Node.js, er mwyn gorfodi работать dirprwy gwrthdro Nginx a Let's Encrypt, mae angen i chi tincian llawer.

Doeddwn i ddim eisiau gwneud yr holl osodiadau SSL hyn â llaw, felly fe wnes i greu cydbwysedd llwyth a chofnodi gwybodaeth amdano yn DNS. Yn achos DigitalOcean, er enghraifft, mae creu tystysgrif hunan-lofnod adnewyddu auto ar y cydbwysedd llwyth yn weithdrefn syml, rhad ac am ddim a chyflym. Mae gan y dull hwn y fantais ychwanegol o'i gwneud hi'n hawdd iawn sefydlu SSL ar weinyddion lluosog sy'n rhedeg y tu ôl i gydbwysydd llwyth os oes angen. Mae hyn yn caniatáu i'r gweinyddwyr eu hunain beidio â "meddwl" am SSL o gwbl, ond ar yr un pryd defnyddio, fel arfer, y porthladd 80. Felly mae ffurfweddu SSL ar gydbwysedd llwyth yn llawer haws ac yn fwy cyfleus na dulliau cyfluniad SSL amgen.

Nawr gallwch chi gau pob porthladd ar y gweinydd sy'n derbyn cysylltiadau sy'n dod i mewn - ac eithrio'r porthladd 80, a ddefnyddir i gyfathrebu â'r balancer llwyth, a'r porthladd 22 ar gyfer SSH. O ganlyniad, bydd ymgais i gysylltu â'r gweinydd yn uniongyrchol ar unrhyw borthladdoedd heblaw'r ddau hyn yn methu.

Canlyniadau

Ar ôl i mi wneud popeth y soniais amdano yn yr erthygl hon, nid oedd platfform y Docker na'r cysyniad o gadwyni CI / CD awtomataidd yn fy nychryn mwyach. Llwyddais i sefydlu cadwyn integreiddio barhaus, pan fydd y cod yn cael ei brofi cyn iddo ddechrau cynhyrchu a chaiff y cod ei anfon yn awtomatig i'r gweinydd. Mae hyn i gyd yn dal yn gymharol newydd i mi, ac rwy'n siŵr bod yna ffyrdd o wella fy llif gwaith awtomataidd a'i wneud yn fwy effeithlon. Felly os oes gennych chi unrhyw syniadau am hyn - rhowch i mi gwybod. Rwy'n gobeithio bod yr erthygl hon wedi eich helpu yn eich busnes. Rwyf am gredu, trwy ei ddarllen, eich bod wedi dysgu cymaint ag y dysgais tra roeddwn yn delio â phopeth y dywedais amdano ynddo.

PS Yn ein marchnadle mae delw Docker, sy'n cael ei osod mewn un clic. Gallwch wirio bod y cynwysyddion yn gweithio ymlaen Datganiad Personol Dioddefwr. Rhoddir 3 diwrnod o brofi am ddim i bob cwsmer newydd.

Annwyl ddarllenwyr! Ydych chi'n defnyddio technolegau CI/CD yn eich prosiectau?

Creu cadwyn CI/CD ac awtomeiddio gwaith gyda Docker

Ffynhonnell: hab.com

Ychwanegu sylw