Ṣiṣẹda pq CI / CD ati adaṣe adaṣe pẹlu Docker

Mo kọ awọn oju opo wẹẹbu akọkọ mi ni awọn 90s ti o kẹhin. Pada lẹhinna o rọrun pupọ lati fi wọn sinu aṣẹ iṣẹ. Olupin Apache kan wa lori diẹ ninu alejo gbigba pinpin, o le wọle si olupin yii nipasẹ FTP nipa kikọ nkan bii ftp://ftp.example.com. Lẹhinna o ni lati tẹ orukọ rẹ ati ọrọ igbaniwọle sii ati gbe awọn faili si olupin naa. Awọn akoko oriṣiriṣi wa, ohun gbogbo rọrun lẹhinna ju bayi lọ.

Ṣiṣẹda pq CI / CD ati adaṣe adaṣe pẹlu Docker

Ni awọn ọdun meji lati igba naa, ohun gbogbo ti yipada pupọ. Awọn oju opo wẹẹbu ti di eka sii; wọn gbọdọ pejọ ṣaaju ki wọn to tu silẹ sinu iṣelọpọ. Olupin kan ṣoṣo di ọpọlọpọ awọn olupin ti n ṣiṣẹ lẹhin awọn iwọntunwọnsi fifuye, ati lilo awọn eto iṣakoso ẹya di ibi ti o wọpọ.

Fun mi ti ara ẹni ise agbese Mo ní pataki kan iṣeto ni. Ati pe Mo mọ pe Mo nilo agbara lati mu aaye naa ṣiṣẹ ni iṣelọpọ nipasẹ ṣiṣe iṣe kan kan: koodu kikọ si ẹka kan master lori GitHub. Ni afikun, Mo mọ pe lati rii daju iṣẹ ti ohun elo wẹẹbu kekere mi, Emi ko fẹ lati ṣakoso iṣupọ Kubernetes nla kan, tabi lo imọ-ẹrọ Docker Swarm, tabi ṣetọju ọkọ oju-omi kekere ti awọn olupin pẹlu awọn adarọ-ese, awọn aṣoju ati gbogbo iru awọn miiran. complexities. Lati le ṣaṣeyọri ibi-afẹde ti ṣiṣe iṣẹ ni irọrun bi o ti ṣee, Mo nilo lati faramọ pẹlu CI/CD.

Ti o ba ni iṣẹ akanṣe kekere kan (ninu ọran yii, iṣẹ akanṣe Node.js) ati pe iwọ yoo fẹ lati mọ bi o ṣe le ṣe adaṣe imuṣiṣẹ ti iṣẹ akanṣe yii, lakoko ti o rii daju pe ohun ti o fipamọ sinu ibi-ipamọ ni deede ohun ti o ṣiṣẹ ni iṣelọpọ, lẹhinna Mo ro o le jẹ nife ninu yi article.

Awọn ohun pataki

Oluka ti nkan yii ni a nireti lati ni oye ipilẹ ti laini aṣẹ ati kikọ awọn iwe afọwọkọ Bash. Ni afikun, oun yoo nilo awọn akọọlẹ Travis C.I. и Docker ibudo.

Awọn ifojusi

Emi kii yoo sọ pe nkan yii le pe lainidi ni “ẹkọ ikẹkọ”. Eyi jẹ diẹ sii ti iwe-ipamọ ninu eyiti Mo sọrọ nipa ohun ti Mo ti kọ ati ṣapejuwe ilana ti o baamu fun mi fun idanwo ati fifi koodu ranṣẹ si iṣelọpọ, ti a ṣe ni adaṣe adaṣe kan.

Eyi ni ohun ti iṣan-iṣẹ mi pari ni jije.

Fun koodu ti a fiweranṣẹ si eyikeyi ẹka ibi ipamọ ayafi master, awọn iṣe wọnyi ni a ṣe:

  • Ise agbese kọ lori Travis CI bẹrẹ.
  • Gbogbo ẹyọkan, isọpọ ati awọn idanwo ipari-si-opin ni a ṣe.

Nikan fun koodu ti o ṣubu sinu master, atẹle naa ni a ṣe:

  • Ohun gbogbo ti a mẹnuba loke, pẹlu ...
  • Ṣiṣe aworan Docker kan ti o da lori koodu lọwọlọwọ, awọn eto ati agbegbe.
  • Gbigbe aworan naa si Ipele Docker.
  • Asopọ si olupin iṣelọpọ.
  • Ikojọpọ aworan lati Docker Hub si olupin naa.
  • Idaduro eiyan lọwọlọwọ ati bẹrẹ tuntun kan ti o da lori aworan tuntun.

Ti o ko ba mọ nkankan rara nipa Docker, awọn aworan ati awọn apoti, maṣe yọ ara rẹ lẹnu. Emi yoo sọ gbogbo rẹ fun ọ.

Kini CI/CD?

Abbreviation CI/CD duro fun “isọdọkan tẹsiwaju / imuṣiṣẹ tẹsiwaju.”

▍Idapọ ti o tẹsiwaju

Isọpọ tẹsiwaju jẹ ilana kan ninu eyiti awọn olupilẹṣẹ ṣe awọn adehun si ibi ipamọ koodu orisun akọkọ ti iṣẹ akanṣe (nigbagbogbo ẹka kan master). Ni akoko kanna, didara koodu naa ni idaniloju nipasẹ idanwo adaṣe.

▍Ilọsiwaju ilọsiwaju

Ilọsiwaju ilọsiwaju jẹ loorekoore, imuṣiṣẹ adaṣe ti koodu sinu iṣelọpọ. Apa keji ti adape CI/CD ni a maa n sọ jade bi “ifijiṣẹ tẹsiwaju.” Eyi jẹ ipilẹ kanna bii “imuṣiṣẹ ilọsiwaju”, ṣugbọn “ifijiṣẹ tẹsiwaju” tumọ si iwulo lati jẹrisi awọn ayipada pẹlu ọwọ ṣaaju bẹrẹ ilana imuṣiṣẹ iṣẹ akanṣe.

Bibẹrẹ

App ti mo lo lati ko gbogbo eyi ni a npe ni Mu Akọsilẹ. Eyi jẹ iṣẹ akanṣe wẹẹbu ti Mo n ṣiṣẹ lori, ti a ṣe apẹrẹ fun ṣiṣe awọn akọsilẹ. Ni akọkọ Mo gbiyanju lati ṣe JAMStack-project, tabi o kan ohun elo ipari-iwaju laisi olupin kan, lati le ni anfani ti alejo gbigba boṣewa ati awọn agbara imuṣiṣẹ iṣẹ akanṣe ti o funni Netlify. Bi idiju ohun elo naa ṣe dagba, Mo nilo lati ṣẹda apakan olupin rẹ, eyiti o tumọ si pe Emi yoo nilo lati ṣe agbekalẹ ilana ti ara mi fun isọpọ adaṣe ati imuṣiṣẹ adaṣe adaṣe ti iṣẹ naa.

Ninu ọran mi, ohun elo naa jẹ olupin KIAKIA ti nṣiṣẹ ni agbegbe Node.js, ṣiṣe ohun elo React oju-iwe kan ṣoṣo ati atilẹyin API ẹgbẹ olupin to ni aabo. Yi faaji telẹ awọn nwon.Mirza ti o le ri ni fun Itọsọna ìfàṣẹsí akopọ ni kikun.

Mo ti gbimọran pẹlu ore, ti o jẹ alamọdaju adaṣe, o beere lọwọ rẹ kini MO nilo lati ṣe lati jẹ ki gbogbo rẹ ṣiṣẹ ni ọna ti Mo fẹ. O fun mi ni imọran kini iṣan-iṣẹ adaṣe adaṣe yẹ ki o dabi, ti ṣe ilana ni apakan Awọn ibi-afẹde ti nkan yii. Nini awọn ibi-afẹde wọnyi tumọ si pe Mo nilo lati ro ero bi o ṣe le lo Docker.

Docker

Docker jẹ ohun elo ti, o ṣeun si imọ-ẹrọ iṣipopada, ngbanilaaye awọn ohun elo lati pin ni irọrun, gbejade ati ṣiṣẹ ni agbegbe kanna, paapaa ti Syeed Docker funrararẹ n ṣiṣẹ ni awọn agbegbe oriṣiriṣi. Ni akọkọ, Mo nilo lati gba ọwọ mi lori awọn irinṣẹ laini aṣẹ Docker (CLI). itọnisọna Itọsọna fifi sori Docker ko le pe ni kedere ati oye, ṣugbọn lati ọdọ rẹ o le kọ ẹkọ pe lati le ṣe igbesẹ fifi sori akọkọ, o nilo lati ṣe igbasilẹ Ojú-iṣẹ Docker (fun Mac tabi Windows).

Docker Hub jẹ aijọju ohun kanna bi GitHub fun awọn ibi ipamọ git, tabi iforukọsilẹ npm fun JavaScript jo. Eyi jẹ ibi ipamọ ori ayelujara fun awọn aworan Docker. Eyi ni ohun ti Docker Desktop sopọ si.

Nitorinaa, lati le bẹrẹ pẹlu Docker, o nilo lati ṣe awọn nkan meji:

Lẹhin eyi, o le ṣayẹwo boya Docker CLI n ṣiṣẹ nipa ṣiṣe pipaṣẹ atẹle lati ṣayẹwo ẹya Docker:

docker -v

Nigbamii, wọle si Docker Hub nipa titẹ orukọ olumulo ati ọrọ igbaniwọle rẹ nigbati o beere:

docker login

Lati lo Docker, o gbọdọ loye awọn imọran ti awọn aworan ati awọn apoti.

▍ Awọn aworan

Aworan jẹ nkan ti o dabi awoṣe ti o ni awọn ilana fun iṣakojọpọ apoti naa. Eyi jẹ aworan alaileyipada ti eto faili ati eto ohun elo naa. Awọn olupilẹṣẹ le pin awọn aworan ni rọọrun.

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

Aṣẹ yii yoo gbe tabili kan jade pẹlu akọsori atẹle:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Nigbamii ti a yoo wo diẹ ninu awọn apẹẹrẹ ti awọn aṣẹ ni ọna kika kanna - akọkọ aṣẹ kan wa pẹlu asọye, lẹhinna apẹẹrẹ ti ohun ti o le jade.

▍ Awọn apoti

Apoti jẹ package ti o le ṣiṣẹ ti o ni ohun gbogbo ti o nilo lati ṣiṣẹ ohun elo kan. Ohun elo pẹlu ọna yii yoo ṣiṣẹ nigbagbogbo kanna, laibikita awọn amayederun: ni agbegbe ti o ya sọtọ ati ni agbegbe kanna. Oro naa ni pe awọn iṣẹlẹ ti aworan kanna ni a ṣe ifilọlẹ ni awọn agbegbe oriṣiriṣi.

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

▍Tags

Aami aami jẹ itọkasi ti ẹya kan pato ti aworan kan.

▍Itọkasi iyara si awọn aṣẹ Docker

Eyi ni awotẹlẹ diẹ ninu awọn aṣẹ Docker ti o wọpọ julọ.

Egbe

Àyíká

Iṣe

docker kọ

Aworan

Ṣiṣe aworan kan lati Dockerfile kan

aami docker

Aworan

Ifi aami si aworan

Awọn aworan docker

Aworan

Awọn aworan atokọ

ṣiṣe docker

Apoti

Nṣiṣẹ a eiyan da lori aworan kan

docker titari

Aworan

Ikojọpọ aworan si iforukọsilẹ

docker fa

Aworan

Ikojọpọ aworan kan lati iforukọsilẹ

ps docker

Apoti

Awọn apoti akojọ

docker eto piruni

Aworan / Apoti

Yiyọ ajeku awọn apoti ati awọn aworan

▍Dockerfile

Mo mọ bi o ṣe le ṣiṣẹ ohun elo iṣelọpọ ni agbegbe. Mo ni a Webpack iṣeto ni a še lati kọ kan setan-ṣe React ohun elo. Nigbamii ti, Mo ni aṣẹ kan ti o bẹrẹ olupin orisun Node.js lori ibudo naa 5000. O dabi eleyi:

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

O yẹ ki o ṣe akiyesi pe Emi ko ni ohun elo apẹẹrẹ fun ohun elo yii. Ṣugbọn nibi, fun awọn idanwo, eyikeyi ohun elo Node ti o rọrun yoo ṣe.

Lati le lo eiyan, iwọ yoo nilo lati fun awọn itọnisọna si Docker. Eyi ni a ṣe nipasẹ faili ti a npe ni Dockerfile, be ni root liana ti ise agbese. Faili yii, ni akọkọ, dabi ohun ti ko ni oye.

Ṣugbọn ohun ti o ni nikan ṣapejuwe, pẹlu awọn aṣẹ pataki, nkan ti o jọra si iṣeto agbegbe iṣẹ kan. Eyi ni diẹ ninu awọn aṣẹ wọnyi:

  • LATI - Aṣẹ yii bẹrẹ faili kan. O pato awọn mimọ aworan lori eyi ti awọn eiyan ti wa ni itumọ ti.
  • ẸKỌ - Didaakọ awọn faili lati orisun agbegbe si apoti kan.
  • WORKDIR - Ṣiṣeto itọsọna iṣẹ fun awọn aṣẹ wọnyi.
  • RUN - Ṣiṣe awọn aṣẹ.
  • ṢEYA - Awọn eto ibudo.
  • OPO iwọle - Itọkasi aṣẹ lati ṣiṣẹ.

Dockerfile le wo nkan bi eyi:

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

Da lori aworan ipilẹ ti o yan, o le nilo lati fi awọn igbẹkẹle afikun sii. Otitọ ni pe diẹ ninu awọn aworan ipilẹ (bii Node Alpine Linux) ni a ṣẹda pẹlu ibi-afẹde ti ṣiṣe wọn bi iwapọ bi o ti ṣee. Bi abajade, wọn le ma ni diẹ ninu awọn eto ti o nireti.

▍ Ṣiṣeto, fifi aami si ati ṣiṣe apoti naa

Apejọ agbegbe ati ifilọlẹ ti eiyan jẹ lẹhin ti a ni Dockerfile, awọn iṣẹ-ṣiṣe jẹ ohun rọrun. Ṣaaju ki o to Titari aworan naa si Docker Hub, o nilo lati ṣe idanwo ni agbegbe.

▍Apejọ

Ni akọkọ o nilo lati gba aworan kan, ti n ṣalaye orukọ kan ati, ni yiyan, tag kan (ti ko ba jẹ ami kan pato, eto naa yoo fi aami kan si aworan laifọwọyi. latest).

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

Lẹhin ṣiṣe aṣẹ yii, o le wo Docker kọ aworan naa.

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

Kọ le gba to iṣẹju diẹ - gbogbo rẹ da lori iye awọn igbẹkẹle ti o ni. Ni kete ti ikole ti pari, o le ṣiṣe aṣẹ naa docker images ki o si wo apejuwe aworan titun rẹ.

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

▍ Ifilọlẹ

Aworan naa ti ṣẹda. Eyi tumọ si pe o le ṣiṣe apoti ti o da lori rẹ. Nitori ti mo fẹ lati ni anfani lati wọle si awọn ohun elo nṣiṣẹ ninu awọn eiyan ni localhost:5000, emi, ni apa osi ti awọn bata 5000:5000 ni nigbamii ti pipaṣẹ sori ẹrọ 5000. Ni apa ọtun ni ibudo eiyan naa.

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

Ni bayi pe eiyan ti ṣẹda ati ṣiṣiṣẹ, o le lo aṣẹ naa docker ps lati wo alaye nipa eiyan yii (tabi o le lo aṣẹ naa docker ps -a, eyi ti o ṣe afihan alaye nipa gbogbo awọn apoti, kii ṣe awọn nṣiṣẹ nikan).

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

Ti o ba bayi lọ si adirẹsi localhost:5000 - o le wo oju-iwe kan ti ohun elo nṣiṣẹ ti o dabi oju-iwe ti ohun elo ti n ṣiṣẹ ni agbegbe iṣelọpọ kan.

▍Tagging ati ki o te

Lati le lo ọkan ninu awọn aworan ti a ṣẹda lori olupin iṣelọpọ, a nilo lati ni anfani lati ṣe igbasilẹ aworan yii lati Docker Hub. Eyi tumọ si pe o nilo akọkọ lati ṣẹda ibi ipamọ kan fun iṣẹ akanṣe lori Ipele Docker. Lẹhin eyi, a yoo ni aaye kan nibiti a ti le fi aworan ranṣẹ. Aworan naa nilo lati tunrukọ jẹ ki orukọ rẹ bẹrẹ pẹlu orukọ olumulo Docker Hub wa. Eyi yẹ ki o tẹle orukọ ibi ipamọ naa. Eyikeyi tag le wa ni gbe ni opin ti awọn orukọ. Ni isalẹ jẹ apẹẹrẹ ti sisọ awọn aworan ni lilo ero yii.

Bayi o le kọ aworan naa pẹlu orukọ titun ati ṣiṣe aṣẹ naa docker push lati Titari si ibi ipamọ 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

Ti ohun gbogbo ba lọ daradara, aworan naa yoo wa lori Docker Hub ati pe o le ni irọrun gbe si olupin tabi gbe lọ si awọn olupilẹṣẹ miiran.

Next awọn igbesẹ

Ni bayi a ti rii daju pe ohun elo naa, ni irisi apoti Docker kan, n ṣiṣẹ ni agbegbe. A ti gbe apoti si Docker Hub. Gbogbo eyi tumọ si pe a ti ni ilọsiwaju pupọ si ibi-afẹde wa tẹlẹ. Bayi a nilo lati yanju awọn ibeere meji diẹ sii:

  • Ṣiṣeto ohun elo CI kan fun idanwo ati fifi koodu ranṣẹ.
  • Ṣiṣeto olupin iṣelọpọ ki o le ṣe igbasilẹ ati ṣiṣẹ koodu wa.

Ninu ọran wa, a lo Travis C.I.. Gẹgẹbi olupin - DitigalOcean.

O yẹ ki o ṣe akiyesi pe nibi o le lo apapo awọn iṣẹ miiran. Fun apẹẹrẹ, dipo Travis CI, o le lo CircleCI tabi Awọn iṣe Github. Ati dipo DigitalOcean - AWS tabi Lindode.

A pinnu a iṣẹ pẹlu Travis CI, ati ki o Mo ti tẹlẹ nkankan ni tunto ni yi iṣẹ. Nitorinaa, ni bayi Emi yoo sọ ni ṣoki nipa bi a ṣe le murasilẹ fun iṣẹ.

Travis C.I.

Travis CI jẹ ohun elo fun idanwo ati fifi koodu ranṣẹ. Emi kii yoo fẹ lati lọ sinu awọn intricacies ti iṣeto Travis CI, nitori iṣẹ akanṣe kọọkan jẹ alailẹgbẹ, ati pe eyi kii yoo mu anfani pupọ wa. Ṣugbọn Emi yoo bo awọn ipilẹ lati jẹ ki o bẹrẹ ti o ba pinnu lati lo Travis CI. Boya o yan Travis CI, CircleCI, Jenkins, tabi nkan miiran, awọn ọna iṣeto ni yoo ṣee lo nibi gbogbo.

Lati bẹrẹ pẹlu Travis CI, lọ si le ṣee ṣe ki o si ṣẹda iroyin. Lẹhinna ṣepọ Travis CI pẹlu akọọlẹ GitHub rẹ. Nigbati o ba ṣeto eto naa, iwọ yoo nilo lati pato ibi-ipamọ pẹlu eyiti o fẹ lati ṣe adaṣe iṣẹ ati mu iraye si. (Mo lo GitHub, ṣugbọn Mo ni idaniloju pe Travis CI le ṣepọ pẹlu BitBucket, ati GitLab, ati awọn iṣẹ miiran ti o jọra).

Nigbakugba ti Travis CI ti bẹrẹ, olupin naa ti ṣe ifilọlẹ, ṣiṣe awọn aṣẹ ti o pato ninu faili iṣeto ni, pẹlu gbigbe awọn ẹka ibi ipamọ ti o baamu.

▍Ipo aye iṣẹ

Travis CI iṣeto ni faili ti a npe ni .travis.yml ati ti o ti fipamọ ni awọn ise agbese root liana, atilẹyin awọn Erongba ti awọn iṣẹlẹ igba aye awọn iṣẹ-ṣiṣe. Awọn iṣẹlẹ wọnyi ti wa ni atokọ ni ọna ti wọn waye:

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

▍ Idanwo

Ninu faili iṣeto ni Emi yoo tunto olupin Travis CI agbegbe. Mo ti yan Node 12 bi ede naa o sọ fun eto naa lati fi sori ẹrọ awọn igbẹkẹle ti o nilo lati lo Docker.

Ohun gbogbo ti o ti wa ni akojọ .travis.yml, yoo ṣee ṣe nigbati gbogbo awọn ibeere fifa ni a ṣe si gbogbo awọn ẹka ti ibi ipamọ, ayafi bibẹẹkọ pato. Eyi jẹ ẹya ti o wulo nitori pe o tumọ si pe a le ṣe idanwo gbogbo koodu ti n bọ sinu ibi ipamọ naa. Eyi jẹ ki o mọ boya koodu naa ti ṣetan lati kọ si ẹka naa. master, ati boya o yoo fọ ilana iṣẹ akanṣe naa. Ni iṣeto ni agbaye yii, Mo fi ohun gbogbo sori agbegbe, ṣiṣe olupin dev Webpack ni abẹlẹ (eyi jẹ ẹya ti iṣan-iṣẹ mi), ati ṣiṣe awọn idanwo.

Ti o ba fẹ ki ibi ipamọ rẹ ṣe afihan awọn baagi ti o nfihan agbegbe idanwo, nibi O le wa awọn itọnisọna kukuru lori lilo Jest, Travis CI ati Coveralls lati gba ati ṣafihan alaye yii.

Nitorina eyi ni akoonu ti faili naa .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

Eyi ni ibi ti awọn iṣe ti o ṣe fun gbogbo awọn ẹka ibi ipamọ ati fun awọn ibeere fa dopin.

▍ Ifijiṣẹ

Da lori ero pe gbogbo awọn idanwo adaṣe ti pari ni aṣeyọri, a le, eyiti o jẹ iyan, fi koodu naa ranṣẹ si olupin iṣelọpọ. Niwọn igba ti a fẹ ṣe eyi nikan fun koodu lati ẹka master, a fun eto awọn ilana ti o yẹ ni awọn eto imuṣiṣẹ. Ṣaaju ki o to gbiyanju lati lo koodu ti a yoo wo atẹle ninu iṣẹ akanṣe rẹ, Emi yoo fẹ lati kilo fun ọ pe o gbọdọ ni iwe afọwọkọ gangan ti a pe fun imuṣiṣẹ.

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

Iwe afọwọkọ imuṣiṣẹ yanju awọn iṣoro meji:

  • Kọ, samisi ati fi aworan ranṣẹ si Docker Hub nipa lilo ohun elo CI kan (ninu ọran wa, Travis CI).
  • Ikojọpọ aworan lori olupin, didaduro eiyan atijọ ati bẹrẹ ọkan tuntun (ninu ọran wa, olupin naa nṣiṣẹ lori pẹpẹ DigitalOcean).

Ni akọkọ, o nilo lati ṣeto ilana adaṣe kan fun kikọ, fifi aami si, ati titari aworan si Docker Hub. Eyi jẹ gbogbo iru pupọ si ohun ti a ti ṣe pẹlu ọwọ, ayafi pe a nilo ilana kan fun yiyan awọn ami alailẹgbẹ si awọn aworan ati awọn iwọle adaṣe adaṣe. Mo ni iṣoro pẹlu diẹ ninu awọn alaye ti iwe afọwọkọ imuṣiṣẹ, gẹgẹbi ilana fifi aami si, iwọle, fifi koodu SSH, idasile asopọ SSH. Ṣugbọn ni Oriire ọrẹkunrin mi dara pupọ pẹlu bash, bi pẹlu ọpọlọpọ awọn ohun miiran. O ṣe iranlọwọ fun mi lati kọ iwe afọwọkọ yii.

Nitorinaa, apakan akọkọ ti iwe afọwọkọ naa n gbe aworan si Docker Hub. Eyi jẹ ohun rọrun lati ṣe. Eto fifi aami si ti Mo lo pẹlu apapọ git hash ati tag git kan, ti ọkan ba wa. Eyi ṣe idaniloju pe tag jẹ alailẹgbẹ ati ki o jẹ ki o rọrun lati ṣe idanimọ apejọ ti o da lori. DOCKER_USERNAME и DOCKER_PASSWORD jẹ awọn oniyipada ayika olumulo ti o le ṣeto nipa lilo wiwo Travis CI. Travis CI yoo ṣe ilana data ifura laifọwọyi ki o ko ṣubu sinu awọn ọwọ ti ko tọ.

Eyi ni apakan akọkọ ti iwe afọwọkọ naa 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}

Kini apakan keji ti iwe afọwọkọ naa yoo dale patapata lori iru agbalejo ti o nlo ati bi a ṣe ṣeto asopọ si rẹ. Ninu ọran mi, niwon Mo lo Digital Ocean, Mo lo awọn aṣẹ lati sopọ si olupin naa doctl. Nigbati o ba n ṣiṣẹ pẹlu AWS, ohun elo naa yoo ṣee lo aws, ati bẹbẹ lọ.

Ṣiṣeto olupin naa ko nira paapaa. Nitorinaa, Mo ṣeto droplet kan ti o da lori aworan ipilẹ. O yẹ ki o ṣe akiyesi pe eto ti Mo yan nilo fifi sori afọwọṣe akoko kan ti Docker ati ifilọlẹ afọwọṣe akoko kan ti Docker. Mo lo Ubuntu 18.04 lati fi Docker sori ẹrọ, nitorinaa ti o ba tun nlo Ubuntu lati ṣe kanna, o le kan tẹle eyi o rọrun guide.

Emi ko sọrọ nibi nipa awọn aṣẹ kan pato fun iṣẹ naa, nitori abala yii le yatọ pupọ ni awọn ọran oriṣiriṣi. Emi yoo kan fun ero gbogbogbo ti iṣe lati ṣe lẹhin sisopọ nipasẹ SSH si olupin lori eyiti yoo gbe iṣẹ naa lọ:

  • A nilo lati wa apoti ti o nṣiṣẹ lọwọlọwọ ki o da duro.
  • Lẹhinna o nilo lati ṣe ifilọlẹ eiyan tuntun ni abẹlẹ.
  • Iwọ yoo nilo lati ṣeto ibudo agbegbe olupin si 80 - Eyi yoo gba ọ laaye lati tẹ aaye sii ni adirẹsi bii example.com, laisi pato ibudo, dipo lilo adirẹsi bi example.com:5000.
  • Nikẹhin, o nilo lati pa gbogbo awọn apoti atijọ ati awọn aworan rẹ.

Eyi ni itesiwaju iwe afọwọkọ naa.

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

Diẹ ninu awọn nkan lati san ifojusi si

O ṣee ṣe pe nigbati o ba sopọ si olupin nipasẹ SSH lati Travis CI, iwọ yoo rii ikilọ kan ti yoo ṣe idiwọ fun ọ lati tẹsiwaju pẹlu fifi sori ẹrọ bi eto naa yoo duro fun esi olumulo.

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

Mo kọ pe bọtini okun le wa ni koodu ni base64 lati le fipamọ ni fọọmu kan ninu eyiti o le ni irọrun ati ni igbẹkẹle ṣiṣẹ pẹlu. Ni ipele fifi sori ẹrọ, o le pinnu bọtini ita gbangba ki o kọ si faili kan known_hosts lati le yọ aṣiṣe ti o wa loke kuro.

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

Ni iṣe, aṣẹ yii le dabi eyi:

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

Ati pe eyi ni ohun ti o gbejade - okun ti koodu koodu base64:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Eyi ni aṣẹ ti a mẹnuba loke

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

Ọna kanna le ṣee lo pẹlu bọtini ikọkọ nigbati o ba ṣeto asopọ kan, nitori o le nilo bọtini ikọkọ lati wọle si olupin naa. Nigbati o ba n ṣiṣẹ pẹlu bọtini, o kan nilo lati rii daju pe o wa ni ipamọ ni aabo ni iyipada agbegbe Travis CI ati pe ko han nibikibi.

Ohun miiran lati ṣe akiyesi ni pe o le nilo lati ṣiṣe gbogbo iwe afọwọkọ imuṣiṣẹ bi laini kan, fun apẹẹrẹ - pẹlu doctl. Eleyi le nilo diẹ ninu awọn afikun akitiyan.

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

TLS/SSL ati Iwontunwosi fifuye

Lẹhin ti Mo ṣe ohun gbogbo ti a mẹnuba loke, iṣoro ikẹhin ti Mo pade ni pe olupin naa ko ni SSL. Niwọn igba ti Mo lo olupin Node.js, lati fi ipa mu lati ṣiṣẹ yiyipada aṣoju Nginx ati Jẹ ki a Encrypt, o nilo lati tinker pupọ.

Emi ko fẹ lati ṣe gbogbo iṣeto SSL yii pẹlu ọwọ, nitorinaa Mo kan ṣẹda iwọntunwọnsi fifuye kan ati ṣe igbasilẹ awọn alaye rẹ ni DNS. Ninu ọran ti DigitalOcean, fun apẹẹrẹ, ṣiṣẹda ijẹrisi ti ara ẹni isọdọtun adaṣe lori iwọntunwọnsi fifuye jẹ ilana ti o rọrun, ọfẹ ati iyara. Ọna yii ni anfani ti a ṣafikun pe o jẹ ki o rọrun pupọ lati ṣeto SSL lori awọn olupin pupọ ti n ṣiṣẹ lẹhin iwọntunwọnsi fifuye ti o ba nilo. Eyi ngbanilaaye awọn olupin funrararẹ ko “ronu” nipa SSL rara, ṣugbọn ni akoko kanna lo ibudo naa bi o ti ṣe deede 80. Nitorinaa iṣeto SSL lori iwọntunwọnsi fifuye jẹ rọrun pupọ ati irọrun diẹ sii ju awọn ọna yiyan ti iṣeto SSL.

Bayi o le pa gbogbo awọn ebute oko oju omi lori olupin ti o gba awọn asopọ ti nwọle - ayafi ibudo naa 80, ti a lo lati ṣe ibaraẹnisọrọ pẹlu iwọntunwọnsi fifuye, ati ibudo 22 fun SSH. Bi abajade, igbiyanju lati wọle si olupin taara lori eyikeyi awọn ebute oko oju omi miiran ju awọn meji wọnyi yoo kuna.

Awọn esi

Lẹhin ti Mo ti ṣe ohun gbogbo ti Mo sọrọ nipa ninu ohun elo yii, bẹni pẹpẹ Docker tabi awọn imọran ti awọn ẹwọn CI/CD adaṣe ti ko bẹru mi mọ. Mo ni anfani lati ṣeto pq isọpọ lemọlemọfún, lakoko eyiti koodu ti ni idanwo ṣaaju ki o lọ sinu iṣelọpọ ati pe koodu naa ti gbejade laifọwọyi lori olupin naa. Eyi tun jẹ tuntun tuntun si mi, ati pe Mo ni idaniloju pe awọn ọna wa lati ṣe ilọsiwaju iṣan-iṣẹ adaṣe adaṣe mi ati jẹ ki o munadoko diẹ sii. Nitorina ti o ba ni awọn ero eyikeyi lori ọrọ yii, jọwọ jẹ ki mi mọ. si mi mọ. Mo nireti pe nkan yii ti ṣe iranlọwọ fun ọ ninu awọn igbiyanju rẹ. Mo fẹ lati gbagbọ pe lẹhin kika rẹ, o kọ ẹkọ pupọ bi mo ti kọ lakoko ti o n ṣalaye ohun gbogbo ti Mo sọrọ nipa rẹ.

PS Ninu wa ọjà aworan kan wa Docker, eyi ti o le fi sori ẹrọ ni ọkan tẹ. O le ṣayẹwo iṣẹ awọn apoti ni VPS. Gbogbo awọn alabara tuntun ni a fun ni awọn ọjọ mẹta ti idanwo ọfẹ.

Eyin onkawe! Ṣe o lo awọn imọ-ẹrọ CI/CD ninu awọn iṣẹ akanṣe rẹ?

Ṣiṣẹda pq CI / CD ati adaṣe adaṣe pẹlu Docker

orisun: www.habr.com

Fi ọrọìwòye kun