Mepụta yinye CI/CD yana ịrụ ọrụ akpaaka na Docker

Edere m weebụsaịtị mbụ m na ngwụcha 90s. N'oge ahụ, ọ dị nnọọ mfe itinye ha n'usoro. Enwere ihe nkesa Apache na ụfọdụ nnabata nkekọrịta, ị nwere ike ịbanye na nkesa a site na FTP site na ide ihe dị ka ftp://ftp.example.com. Mgbe ahụ ịkwesịrị itinye aha na paswọọdụ gị wee bulite faịlụ na sava ahụ. E nwere oge dị iche iche, ihe niile dị mfe mgbe ahụ karịa ugbu a.

Mepụta yinye CI/CD yana ịrụ ọrụ akpaaka na Docker

N'ime iri afọ abụọ kemgbe ahụ, ihe niile agbanweela nke ukwuu. Weebụsaịtị adịla mgbagwoju anya; a ga-achịkọta ha tupu ahapụ ha na mmepụta. Otu ihe nkesa ghọrọ ọtụtụ sava na-agba ọsọ n'azụ ndị na-edozi ibu, na iji usoro njikwa ụdị ghọrọ ebe a na-ahụkarị.

Maka ọrụ nkeonwe m enwere m nhazi pụrụ iche. Ma amaara m na achọrọ m ikike itinye saịtị ahụ na mmepụta site n'ime otu ihe: ide koodu na alaka ụlọ ọrụ master na GitHub. Na mgbakwunye, amaara m na iji hụ na arụ ọrụ nke obere ngwa weebụ m, achọghị m ijikwa nnukwu ụyọkọ Kubernetes, ma ọ bụ jiri teknụzụ Docker Swarm, ma ọ bụ na-echekwa ọtụtụ sava nwere pọd, ndị nnọchi anya na ụdị ndị ọzọ. mgbagwoju anya. Iji nweta ihe mgbaru ọsọ nke ime ka ọrụ dị mfe dị ka o kwere mee, ọ dị m mkpa ịmara CI/CD.

Ọ bụrụ na ị nwere obere ọrụ (na nke a, ọrụ Node.js) ma ị ga-achọ ịma otú e si akpaghị aka na ntinye nke ọrụ a, ebe ị na-ahụ na ihe echekwara na ebe nchekwa ahụ dabara kpọmkwem ihe na-arụ ọrụ na mmepụta, mgbe ahụ, m chere na ị nwere ike ịmasị akụkọ a.

Ihe ndị a chọrọ

A na-atụ anya ka onye na-agụ akụkọ a nwee nghọta bụ isi nke ahịrị iwu na ide ederede Bash. Na mgbakwunye, ọ ga-achọ akaụntụ Travis C.I. и Ogwe Docker.

Ebumnuche

Agaghị m ekwu na isiokwu a nwere ike ịkpọ "nkuzi". Nke a bụ akwụkwọ karịa nke m na-ekwu maka ihe m mụtara ma kọwaa usoro dabara m maka ịnwale na itinye koodu na mmepụta, nke a na-eme na otu ngafe akpaghị aka.

Nke a bụ ihe usoro ọrụ m mechara bụrụ.

Maka koodu ezigara na ngalaba nchekwa ọ bụla ewezuga master, a na-eme ihe ndị a:

  • Ọrụ a na-ewu na Travis CI na-amalite.
  • A na-eme otu ihe niile, njikọta na ule ngwụcha ruo ọgwụgwụ.

Naanị maka koodu dabara na ya master, a na-eme ihe ndị a:

  • Ihe niile a kpọtụrụ aha n'elu, gbakwunyere ...
  • Iwulite onyonyo Docker dabere na koodu, ntọala na gburugburu dị ugbu a.
  • Na-ebuga onyonyo a na Docker Hub.
  • Njikọ na ihe nkesa mmepụta.
  • Na-ebugo onyonyo site na Hub Docker na sava ahụ.
  • Ịkwụsị akpa dị ugbu a ma malite nke ọhụrụ dabere na ihe oyiyi ọhụrụ.

Ọ bụrụ na ịmaghị ihe ọ bụla gbasara Docker, onyonyo na arịa, echegbula. Aga m agwa gị ihe niile.

Kedu ihe bụ CI/CD?

Mbiri okwu CI/CD na-anọchi anya “njikọ na-aga n'ihu / ntinye aka na-aga n'ihu.”

▍Mwekota na-aga n'ihu

Mwekota na-aga n'ihu bụ usoro nke ndị mmepe na-etinye aka na ebe nchekwa koodu isi mmalite nke ọrụ ahụ (na-abụkarị alaka ụlọ ọrụ. master). N'otu oge ahụ, a na-ahụta ogo koodu ahụ site na nyocha akpaghị aka.

▍Nkwanye na-aga n'ihu

Mbugharị na-aga n'ihu bụ ntinye koodu na-akpaghị aka na-emekarị na mmepụta. A na-asụgharị akụkụ nke abụọ nke mkpọkpọ okwu CI/CD mgbe ụfọdụ ka “nfefe na-aga n'ihu.” Nke a bụ otu ihe ahụ dị ka "nkwanye na-aga n'ihu", mana "nfefe na-aga n'ihu" na-egosi mkpa ọ dị iji aka kwado mgbanwe tupu ịmalite usoro ntinye ọrụ.

-amalite Amalite

Ngwa m ji mụta ihe a niile ka a na-akpọ WereNote. Nke a bụ ọrụ webụ m na-arụ ọrụ, emebere maka idetu ihe. Na mbụ m gbalịrị ime JAMStack-project, ma ọ bụ naanị ngwa n'ihu na-enweghị ihe nkesa, iji nweta uru nke ọkọlọtọ Bochum na ike ibuga ọrụ nke ọ na-enye. Netify. Ka mgbagwoju anya nke ngwa ahụ na-etolite, ọ dị m mkpa ịmepụta akụkụ nkesa ya, nke pụtara na m ga-achọ ịmepụta atụmatụ nke m maka ntinye aka na-akpaghị aka na ntinye aka nke ọrụ ahụ.

N'ọnọdụ m, ngwa a bụ ihe nkesa Express na-agba ọsọ na gburugburu Node.js, na-eje ozi otu ibe React ngwa ma na-akwado API n'akụkụ sava echekwara. Ihe owuwu a na-agbaso atụmatụ enwere ike ịchọta ya nyere Ntuziaka nyocha nchịkọta zuru ezu.

Agwara m ya enyi, onye bụ ọkachamara akpaaka, wee jụọ ya ihe m kwesịrị ime iji mee ka ihe niile na-arụ ọrụ otú m chọrọ. O nyere m echiche nke ụdị ọrụ akpaghị aka kwesịrị ịdị ka nke akọwapụtara na ngalaba ebumnuche nke isiokwu a. Inwe ihe mgbaru ọsọ ndị a pụtara na achọrọ m ịchọpụta otu esi eji Docker.

Docker

Docker bụ ngwá ọrụ na-ekele maka nkà na ụzụ na-emepụta ihe, na-enye ohere ka a na-ekesa ngwa ngwa, tinye ya ma na-agba ọsọ n'otu gburugburu ebe obibi, ọ bụrụgodị na ikpo okwu Docker n'onwe ya na-agba ọsọ na gburugburu dị iche iche. Nke mbụ, achọrọ m itinye aka m na ngwa ahịrị ahịrị iwu Docker (CLI). ntụziaka Enweghị ike ịkpọ ntuziaka nrụnye Docker nke ọma ma nwee nghọta, mana site na ya ị nwere ike ịmụta na iji were usoro nrụnye mbụ, ịkwesịrị ibudata Docker Desktop (maka Mac ma ọ bụ Windows).

Docker Hub bụ ihe dị ka GitHub maka git repositories, ma ọ bụ ndekọ npm maka ngwugwu Javascript. Nke a bụ ebe nchekwa ihe onyonyo Docker n'ịntanetị. Nke a bụ ihe Docker Desktop jikọtara.

Yabụ, ka ịmalite Docker, ịkwesịrị ịme ihe abụọ:

Mgbe nke a gasịrị, ị nwere ike ịlele ma Docker CLI na-arụ ọrụ site na iji iwu na-esonụ iji lelee ụdị Docker:

docker -v

Ọzọ, banye na Docker Hub site na itinye aha njirimara na paswọọdụ gị mgbe a jụrụ ya:

docker login

Iji Docker, ị ga-aghọtarịrị echiche nke onyonyo na arịa.

▍ Foto

Onyonyo bụ ihe dị ka ụkpụrụ nke nwere ntuziaka maka ịgbakọta akpa. Nke a bụ nseta ihuenyo na-enweghị mgbanwe nke sistemụ faịlụ na ntọala ngwa. Ndị nrụpụta nwere ike kesaa onyonyo n'ụzọ dị mfe.

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

Iwu a ga-ewepụta tebụl nwere nkụnye eji isi mee nke a:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Ọzọ, anyị ga-eleba anya na ụfọdụ ihe atụ nke iwu n'otu usoro - mbụ e nwere a iwu na a ikwu, na mgbe ahụ ihe atụ nke ihe ọ pụrụ mmepụta.

▍ Efere

Akpa bụ ngwugwu enwere ike ime nke nwere ihe niile achọrọ iji mee ngwa. Ngwa nwere usoro a ga-arụ ọrụ mgbe niile, n'agbanyeghị akụrụngwa: na ebe dịpụrụ adịpụ na n'otu gburugburu. Isi ihe bụ na a na-ewepụta ihe atụ nke otu onyonyo na gburugburu dị iche iche.

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

▍Tags

Mkpado bụ ihe ngosi nke otu ụdị onyonyo.

▍ Ntụ aka ngwa ngwa na iwu Docker

Nke a bụ nkọwapụta nke ụfọdụ iwu Docker a na-ejikarị.

otu

Agaba

mmetụta

docker ewu

Foto

Wulite onyonyo site na Dockerfile

mkpado docker

Foto

Nkpado onyonyo

ihe oyiyi docker

Foto

Na-edepụta onyonyo

docker na-agba ọsọ

Igbe

Na-agba ọsọ akpa dabere na onyonyo

docker push

Foto

Na-ebugote onyonyo na ndekọ

docker ịdọrọ

Foto

Na-ebugo onyonyo site na ndekọ

ps docker

Igbe

Ndepụta akpa

usoro docker kwachaa

Ihe onyonyo/akpa

Na-ewepu akpa na onyonyo ejighi ya

▍ Dockerfile

Amaara m otu esi agba ngwa mmepụta na mpaghara. Enwere m nhazi Webpack emebere iji wuo ngwa React emebere. Na-esote, enwere m iwu na-amalite ihe nkesa Node.js na ọdụ ụgbọ mmiri 5000. Ọ dị ka nke a:

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

Okwesiri iburu n'uche na enweghi m ngwa ihe omuma maka ihe a. Mana ebe a, maka nnwale, ngwa Node ọ bụla dị mfe ga-eme.

Iji jiri akpa ahụ, ị ​​ga-achọ ịnye Docker ntụziaka. A na-eme nke a site na faịlụ a na-akpọ Dockerfile, dị na mgbọrọgwụ ndekọ nke oru ngo. Faịlụ a, na mbụ, ọ dị ka enweghị nghọta.

Mana ihe ọ nwere na-akọwa naanị, yana iwu pụrụ iche, ihe yiri ịtọlite ​​ebe ọrụ. Nke a bụ ụfọdụ iwu ndị a:

  • SITE - Iwu a na-amalite faịlụ. Ọ na-akọwapụta ihe oyiyi ntọala nke etinyere akpa ahụ.
  • Detuo - Na-eṅomi faịlụ site na isi iyi mpaghara gaa na akpa.
  • ỌRỤ - Ịtọlite ​​​​akwụkwọ ndekọ aha maka iwu ndị a.
  • na-agba ọsọ - Gbaa iwu.
  • Ikpughe - Ntọala ọdụ ụgbọ mmiri.
  • ENTERRYPOINT - Ngosipụta nke iwu a ga-egbu.

Dockerfile nwere ike ịdị ka nke 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

Dabere na onyonyo ntọala ị họọrọ, ị nwere ike ịwụnye ndabere ndị ọzọ. Nke bụ eziokwu bụ na a na-emepụta ụfọdụ ihe oyiyi ntọala (dị ka Node Alpine Linux) na ebumnuche nke ime ka ha dị ka kọmpat dị ka o kwere mee. N'ihi ya, ha nwere ike ha agaghị enwe ụfọdụ mmemme ị tụrụ anya ya.

▍ Ịrụ ụlọ, ịkpado ma na-agbagharị akpa ahụ

Mgbakọ mpaghara na mmalite nke akpa bụ mgbe anyị nwere Dockerfile, ọrụ ndị dị nnọọ mfe. Tupu ịkwanye onyonyo a na Docker Hub, ịkwesịrị ịnwale ya na mpaghara.

▍ Mgbakọ

Mbụ ịkwesịrị ịnakọta oyiyi, ezipụta aha na, nhọrọ, mkpado (ọ bụrụ na akọwapụtaghị mkpado, usoro ahụ ga-ekenye mkpado na onyonyo a ozugbo. latest).

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

Mgbe ịmechara iwu a, ị nwere ike ilele Docker na-ewu onyonyo a.

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

Owuwu ahụ nwere ike were nkeji ole na ole - ihe niile dabere na dabere ole ị nwere. Ozugbo arụchara arụ ọrụ, ị nwere ike ịme iwu ahụ docker images ma lee nkọwa nke onyonyo ọhụrụ gị.

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

▍Mwepụta

Emeela ihe onyonyo a. Nke a pụtara na ị nwere ike ịgbanye akpa na-adabere na ya. N'ihi na m chọrọ inwe ike ịnweta ngwa na-agba ọsọ na akpa na localhost:5000, m, n'akụkụ aka ekpe nke ụzọ abụọ ahụ 5000:5000 na iwu na-esote arụnyere 5000. N'akụkụ aka nri bụ ọdụ ụgbọ mmiri.

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

Ugbu a na-emepụta akpa ahụ ma na-agba ọsọ, ị nwere ike iji iwu ahụ docker ps ilele ozi gbasara akpa a (ma ọ bụ ị nwere ike iji iwu ahụ docker ps -a, nke na-egosiputa ozi gbasara arịa niile, ọ bụghị naanị ndị na-agba ọsọ).

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

Ọ bụrụ na ị gaa na adreesị localhost:5000 - ị nwere ike ịhụ ibe nke ngwa na-agba ọsọ na-adị ka ibe nke ngwa na-agba ọsọ na gburugburu mmepụta.

▍Tagging na ibipụta

Iji jiri otu onyonyo emepụtara na sava nrụpụta, anyị kwesịrị ịnwe ike budata onyonyo a na Docker Hub. Nke a pụtara na ị ga-ebu ụzọ mepụta ebe nchekwa maka ọrụ a na Docker Hub. Mgbe nke a gasịrị, anyị ga-enwe ebe anyị nwere ike izipu ihe oyiyi ahụ. Ekwesịrị ịgbanwe aha onyonyo a ka aha ya malite na aha njirimara Docker Hub anyị. Nke a ga-esochi aha nke ebe nchekwa. Enwere ike itinye mkpado ọ bụla na njedebe nke aha ahụ. N'okpuru bụ ọmụmaatụ ịkpọ aha onyonyo site na iji atụmatụ a.

Ugbu a ị nwere ike iji aha ọhụrụ wuo onyonyo a wee mee iwu ahụ docker push ịkwaga ya na ebe nchekwa 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

Ọ bụrụ na ihe niile na-aga nke ọma, onyonyo a ga-adị na Docker Hub na enwere ike ibugo ya na sava ma ọ bụ bufee ya na ndị nrụpụta ndị ọzọ.

Nzọụkwụ ndị ọzọ

Ka ọ dị ugbu a, anyị enyochala na ngwa ahụ, n'ụdị akpa Docker, na-agba ọsọ na mpaghara. Anyị ebugola akpa ahụ na Docker Hub. Ihe a niile pụtara na anyị enweela ezigbo ọganihu n'ebumnobi anyị. Ugbu a, anyị kwesịrị idozi ajụjụ abụọ ọzọ:

  • Ịtọlite ​​​​ngwaọrụ CI maka nnwale na itinye koodu.
  • Ịtọlite ​​​​ihe nkesa mmepụta ka ọ nwee ike ibudata ma mee koodu anyị.

N'ọnọdụ anyị, anyị na-eji Travis C.I.. Dị ka ihe nkesa - DitigalOsimiri.

Ekwesiri ighota na ebe a i nwere ike iji nchikota oru ozo. Dịka ọmụmaatụ, kama Travis CI, ị nwere ike iji CircleCI ma ọ bụ Github Actions. Na kama DigitalOcean - AWS ma ọ bụ Lindode.

Anyị kpebiri ịrụ ọrụ na Travis CI, enwekwara m ihe ahaziri na ọrụ a. Ya mere, ugbu a, m ga-ekwu nkenke banyere otú e si akwadebe ya maka ọrụ.

Travis C.I.

Travis CI bụ ngwa maka nnwale na itinye koodu. Agaghị m achọ ịbanye na mgbagwoju anya nke ịtọ Travis CI, ebe ọ bụ na ọrụ ọ bụla dị iche iche, nke a agaghị eweta uru dị ukwuu. Mana m ga-ekpuchi isi ihe ka ịmalite gị ma ọ bụrụ na ị kpebie iji Travis CI. Ma ị na-ahọrọ Travis CI, CircleCI, Jenkins, ma ọ bụ ihe ọzọ, a ga-eji usoro nhazi ndị yiri ya mee ihe n'ebe niile.

Iji malite Travis CI, gaa na nwere ike ma mepụta akaụntụ. Wee tinye Travis CI na akaụntụ GitHub gị. Mgbe ị na-edozi usoro ahụ, ị ​​​​ga-achọ ịkọwapụta ebe nchekwa nke ịchọrọ iji rụọ ọrụ na-akpaghị aka ma mee ka ịnweta ya. (M na-eji GitHub, ma ejiri m n'aka na Travis CI nwere ike ijikọta na BitBucket, na GitLab, na ọrụ ndị ọzọ yiri ya).

Oge ọ bụla Travis CI malitere, a na-ewepụta ihe nkesa ahụ, na-emezu iwu ndị akọwapụtara na faịlụ nhazi, gụnyere ibuga alaka ụlọ ọrụ kwekọrọ.

▍ Usoro ndụ ọrụ

A na-akpọ faịlụ nhazi Travis CI .travis.yml na echekwara na oru ngo mgbọrọgwụ ndekọ, na-akwado echiche nke ihe omume okirikiri ndụ ọrụ. Edepụtara ihe omume ndị a n'usoro ha mere:

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

▍Nnwale

Na faịlụ nhazi, aga m ahazi sava Travis CI mpaghara. M họọrọ Node 12 dị ka asụsụ ahụ wee gwa sistemụ ahụ ka ọ wụnye ihe ndabere achọrọ iji Docker.

Ihe niile edepụtara n'elu .travis.yml, a ga-egbu mgbe arịọrọ arịrịọ niile na ngalaba niile nke ebe nchekwa ahụ, ọ gwụla ma akọwapụtara ya ọzọ. Nke a bụ njirimara bara uru n'ihi na ọ pụtara na anyị nwere ike ịnwale koodu niile na-abata na ebe nchekwa. Nke a na-eme ka ị mara ma koodu ahụ adịla njikere idegara alaka ụlọ ọrụ ahụ. master, na ma ọ ga-emebi usoro iwu ụlọ ọrụ. Na nhazi zuru ụwa ọnụ a, m na-etinye ihe niile na mpaghara, na-agba ọsọ Webpack dev server na ndabere (nke a bụ akụkụ nke ọrụ m), na-agba ọsọ ule.

Ọ bụrụ na ịchọrọ ka ebe nchekwa gị gosipụta baajị na-egosi mkpuchi ule, ebe a Ị nwere ike ịchọta ntụziaka dị mkpirikpi na iji Jest, Travis CI na Coveralls iji nakọta ma gosipụta ozi a.

Yabụ ebe a bụ ọdịnaya nke faịlụ ahụ .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

Nke a bụ ebe omume ndị a na-eme maka ngalaba niile nke ebe nchekwa na maka ịdọrọ arịrịọ kwụsịrị.

▍ Nkwanye ọrụ

Dabere n'echiche ahụ na ule niile akpaaka mezuru nke ọma, anyị nwere ike, nke bụ nhọrọ, tinye koodu ahụ na ihe nkesa mmepụta. Ebe ọ bụ na anyị chọrọ ime nke a naanị maka koodu sitere na alaka ụlọ ọrụ master, anyị na-enye usoro ntụziaka kwesịrị ekwesị na ntọala ntinye. Tupu ị nwaa iji koodu nke anyị ga-eleba anya na-esote na ọrụ gị, a ga m adọ gị aka na ntị na ị ga-enwerịrị edemede n'ezie nke a na-akpọ maka mbugharị.

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

Edemede mbugharị na-edozi nsogbu abụọ:

  • Wulite, kpado ma ziga onyonyo a na Docker Hub site na iji ngwa CI (n'ọnọdụ anyị, Travis CI).
  • Na-ebugo ihe oyiyi na ihe nkesa, ịkwụsị akpa ochie na ịmalite ọhụrụ (n'ọnọdụ anyị, ihe nkesa na-agba ọsọ na DigitalOcean n'elu ikpo okwu).

Nke mbụ, ịkwesịrị ịtọlite ​​​​usoro akpaaka maka iwulite, ịkpado, na ịkwanye onyonyo na Docker Hub. Ihe a niile yiri ihe anyị ji aka mee, belụsọ na anyị chọrọ atụmatụ maka ikenye mkpado pụrụ iche na onyonyo yana nbanye akpaaka. Ọ na-esiri m ike na nkọwa ụfọdụ nke edemede mbugharị, dị ka atụmatụ mkpado, nbanye, ntinye igodo SSH, ntọala njikọ SSH. Mana ihu ọma enyi m nwoke na bash mara mma, dịka ọ dị n'ọtụtụ ihe ndị ọzọ. O nyeere m aka dee edemede a.

Yabụ, akụkụ mbụ nke edemede a na-ebugo onyonyo a na Docker Hub. Nke a dị nnọọ mfe ime. Atụmatụ mkpado m ji mee ihe gụnyere ijikọta git hash na git tag, ọ bụrụ na ọ dị. Nke a na-eme ka mkpado ahụ dị iche iche ma mee ka ọ dịkwuo mfe ịmata mgbakọ nke dabeere na ya. DOCKER_USERNAME и DOCKER_PASSWORD bụ mgbanwe gburugburu ebe ọrụ nwere ike ịtọ site na iji interface Travis CI. Travis CI ga-ahazi data nwere mmetụta na-akpaghị aka ka ọ ghara ịdaba n'aka na-ezighi ezi.

Nke a bụ akụkụ mbụ nke edemede ahụ 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}

Ihe akụkụ nke abụọ nke edemede ga-adabere kpamkpam na onye ọbịa ị na-eji yana otu esi ahazi njikọ ya. N'ọnọdụ m, ebe m na-eji Digital Ocean, m na-eji iwu iji jikọọ na ihe nkesa doctl. Mgbe ị na-arụ ọrụ na AWS, a ga-eji uru ahụ aws, were gabazie.

Ịtọlite ​​ihe nkesa ahụ esichaghị ike. Ya mere, m na-edozi droplet dabeere na isi ihe oyiyi. Ekwesiri ighota na sistemu m họọrọ choro ntinye ntuziaka nke otu oge nke Docker na ntinye akwụkwọ ntuziaka nke Docker otu oge. Ejiri m Ubuntu 18.04 iji wụnye Docker, yabụ ọ bụrụ na ị na-ejikwa Ubuntu na-eme otu ihe ahụ, ị ​​nwere ike iso. ihe a ndu ndu.

Anaghị m ekwu okwu ebe a gbasara iwu akọwapụtara maka ọrụ ahụ, ebe ọ bụ na akụkụ a nwere ike ịdịgasị iche n'ọnọdụ dị iche iche. M ga-enye atụmatụ ime ihe n'ozuzu ka a ga-eme mgbe ejikọtara site na SSH na sava nke a ga-ebuga ọrụ ahụ:

  • Anyị kwesịrị ịchọta akpa nke na-agba ọsọ ugbu a ma kwụsị ya.
  • Mgbe ahụ ịkwesịrị ịmalite akpa ọhụrụ n'azụ.
  • Ị ga-achọ ịtọ ọdụ ụgbọ mmiri mpaghara nke sava ahụ 80 - nke a ga-enye gị ohere ịbanye saịtị na adreesị dị ka example.com, na-akọwapụtaghị ọdụ ụgbọ mmiri, kama iji adreesị dị ka example.com:5000.
  • N'ikpeazụ, ịkwesịrị ihichapụ ihe niile ochie na onyonyo.

Nke a bụ n'ihu nke edemede.

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

Ụfọdụ ihe ị ga-aṅa ntị

Ọ ga-ekwe omume na mgbe ị jikọọ na ihe nkesa site na SSH site na Travis CI, ị ga-ahụ ịdọ aka ná ntị nke ga-egbochi gị ịga n'ihu na ntinye dịka usoro ahụ ga-echere nzaghachi onye ọrụ.

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

Amụtara m na enwere ike itinye igodo eriri na base64 iji chekwaa ya n'ụdị nke enwere ike iji ya rụọ ọrụ nke ọma na ntụkwasị obi. Na ọkwa nrụnye, ị nwere ike decode igodo ọha wee dee ya na faịlụ known_hosts iji wepụ njehie dị n'elu.

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

Na omume, iwu a nwere ike ịdị ka nke 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

Ma nke a bụ ihe ọ na-emepụta - eriri agbakwunyere base64:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Nke a bụ iwu ahụ a kpọtụrụ aha n'elu

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

Enwere ike iji otu ụzọ ahụ jiri igodo nzuzo mee ihe mgbe ị na-emepụta njikọ, ebe ọ bụ na ị nwere ike ịchọ igodo nzuzo iji nweta sava ahụ. Mgbe ị na-eji igodo na-arụ ọrụ, naanị ị ga-achọ ijide n'aka na echekwara ya nke ọma na mgbanwe gburugburu ebe obibi Travis CI yana egosighi ya ebe ọ bụla.

Ihe ọzọ ị ga-amata bụ na ọ nwere ike ịdị mkpa ka ị na-agba ọsọ script nsonye dị ka otu ahịrị, dịka ọmụmaatụ - na doctl. Nke a nwere ike ịchọ mgbakwunye mgbakwunye.

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

TLS/SSL na nha nha nha

Mgbe m mechara ihe niile a kpọtụrụ aha n'elu, nsogbu ikpeazụ m zutere bụ na ihe nkesa enweghị SSL. Ebe m na-eji ihe nkesa Node.js, iji manye ịrụ ọrụ reverse proxy Nginx na Let's Encrypt, ị kwesịrị ị tinker nke ukwuu.

Achọghị m n'ezie iji aka mee nhazi SSL a niile, yabụ ka m mepụtara ihe nkwụnye ibu wee dekọọ nkọwa ya na DNS. N'ihe banyere DigitalOcean, dịka ọmụmaatụ, ịmepụta akwụkwọ ntinye aka na-eme ka ọ dị ọhụrụ na ihe nkwụnye ibu bụ usoro dị mfe, n'efu na ngwa ngwa. Ụzọ a nwere uru agbakwunyere na ọ na-eme ka ọ dị mfe ịtọlite ​​​​SSL na ọtụtụ sava na-agba ọsọ n'azụ ihe nkwụnye ibu ma ọ bụrụ na ọ dị mkpa. Nke a na-enye ohere ka ndị sava onwe ha ghara "iche echiche" banyere SSL ma ọlị, ma n'otu oge ahụ na-eji ọdụ ụgbọ mmiri dị ka ọ dị na mbụ 80. Ya mere, ịtọlite ​​​​SSL na ihe nkwụnye ibu dị mfe ma dị mfe karịa ụzọ ọzọ nke ịtọlite ​​SSL.

Ugbu a ị nwere ike mechie ọdụ ụgbọ mmiri niile na ihe nkesa na-anabata njikọ mbata - ewezuga ọdụ ụgbọ mmiri 80, eji na-ekwurịta okwu na ibu balancer, na ọdụ ụgbọ mmiri 22 maka SSH. N'ihi ya, mgbalị iji nweta ihe nkesa ozugbo na ọdụ ụgbọ mmiri ọ bụla na-abụghị abụọ a ga-ada.

Nsonaazụ

Mgbe m mechara ihe niile m kwuru gbasara ya n'ihe a, ọbụghị ikpo okwu Docker ma ọ bụ echiche nke ụdọ CI/CD akpaaka anaghị atụ m egwu ọzọ. Enwere m ike ịtọ ụdọ njikọ na-aga n'ihu, n'oge a na-anwale koodu ahụ tupu ya abanye na mmepụta na koodu ahụ na-akpaghị aka na-etinye na ihe nkesa. Ihe a niile ka dị ọhụrụ nye m, ejiri m n'aka na enwere ụzọ m ga-esi melite usoro ọrụ akpaaka m wee mee ka ọ rụọ ọrụ nke ọma. Yabụ ọ bụrụ na ị nwere echiche ọ bụla gbasara okwu a, biko mee ka m mara. m mara. Enwere m olileanya na akụkọ a enyerela gị aka na mbọ gị. Achọrọ m ikwere na mgbe ị gụchara ya, ị mụtara ihe m mụtara ka m na-achọpụta ihe niile m kwuru na ya.

PS Na nke anyi ahịa enwere onyonyo Docker, nke enwere ike itinye n'otu pịa. Ị nwere ike ịlele ọrụ nke containers na VPS. A na-enye ndị ahịa ọhụrụ niile ụbọchị 3 nnwale n'efu.

Ezigbo ndị na-agụ akwụkwọ! Ị na-eji teknụzụ CI/CD na ọrụ gị?

Mepụta yinye CI/CD yana ịrụ ọrụ akpaaka na Docker

isi: www.habr.com

Tinye a comment