Tsim CI / CD saw thiab automating ua hauj lwm nrog Docker

Kuv tau sau kuv thawj lub vev xaib hauv 90s lig. Tom qab ntawd nws yooj yim heev los muab lawv tso rau hauv kev ua haujlwm. Muaj Apache server ntawm qee qhov sib koom hosting, koj tuaj yeem nkag mus rau hauv lub server ntawm FTP los ntawm kev sau qee yam zoo li ftp://ftp.example.com. Tom qab ntawd koj yuav tsum sau koj lub npe thiab lo lus zais thiab upload cov ntaub ntawv mus rau lub server. Muaj ntau lub sijhawm sib txawv, txhua yam yooj yim dua li tam sim no.

Tsim CI / CD saw thiab automating ua hauj lwm nrog Docker

Hauv ob xyoo caum txij thaum ntawd los, txhua yam tau hloov pauv ntau. Cov vev xaib tau dhau los ua nyuaj; lawv yuav tsum tau sib sau ua ntej tso tawm rau hauv ntau lawm. Ib tus neeg rau zaub mov tau dhau los ua ntau lub servers khiav tom qab load balancers, thiab kev siv cov tshuab tswj hwm tau dhau los ua qhov qub.

Rau kuv tus kheej qhov project kuv muaj ib tug tshwj xeeb configuration. Thiab kuv paub tias kuv xav tau lub peev xwm los siv lub xaib hauv kev tsim khoom los ntawm kev ua ib qho nkaus xwb: sau cov lej rau ib ceg master ntawm GitHub. Tsis tas li ntawd, kuv paub tias txhawm rau txhawm rau ua haujlwm ntawm kuv daim ntawv thov lub vev xaib me me, kuv tsis xav tswj hwm Kubernetes pawg loj, lossis siv Docker Swarm thev naus laus zis, lossis tuav lub nkoj ntawm cov servers nrog cov pods, tus neeg sawv cev thiab txhua yam ntawm lwm yam. nyuaj. Txhawm rau ua tiav lub hom phiaj ntawm kev ua haujlwm yooj yim li sai tau, kuv yuav tsum paub txog CI / CD.

Yog tias koj muaj ib txoj haujlwm me me (qhov no, qhov project Node.js) thiab koj xav paub yuav ua li cas thiaj li siv tau qhov kev xa tawm ntawm qhov project no, thaum ua kom ntseeg tau tias dab tsi yog khaws cia hauv qhov chaw cia khoom raws nraim qhov ua haujlwm hauv kev tsim khoom, ces kuv xav tias tej zaum koj yuav txaus siab rau tsab xov xwm no.

Yam yuavtsum tau kawm uantej

Tus nyeem ntawv ntawm tsab xov xwm no yuav tsum muaj kev nkag siab yooj yim ntawm kab hais kom ua thiab sau ntawv Bash. Tsis tas li ntawd, nws yuav xav tau nyiaj Travis IB ΠΈ Docker hub.

Cov hom phiaj

Kuv yuav tsis hais tias tsab xov xwm no tuaj yeem raug hu ua "tutorial". Qhov no yog ntau dua ntawm cov ntaub ntawv uas kuv tham txog qhov kuv tau kawm thiab piav qhia txog cov txheej txheem uas haum rau kuv rau kev sim thiab xa cov lej rau kev tsim khoom, ua tiav hauv ib qho kev ua haujlwm.

Qhov no yog qhov kuv txoj haujlwm ua tiav.

Rau cov cai tshaj tawm rau txhua ceg repository tshwj tsis yog master, cov kev ua hauv qab no tau ua:

  • Qhov project tsim ntawm Travis CI pib.
  • Tag nrho cov chav tsev, kev sib koom ua ke thiab qhov kawg-rau-kawg xeem yog ua.

Tsuas yog rau code uas poob rau hauv master, cov hauv qab no tau ua:

  • Txhua yam hais saum toj no, ntxiv rau ...
  • Tsim cov duab Docker raws li cov cai tam sim no, kev teeb tsa thiab ib puag ncig.
  • Deploying the image to Docker Hub.
  • Kev sib txuas rau cov khoom siv ntau lawm.
  • Uploading ib daim duab los ntawm Docker Hub rau lub server.
  • Tso tseg lub thawv tam sim no thiab pib ib qho tshiab raws li daim duab tshiab.

Yog tias koj paub tsis muaj dab tsi txog Docker, cov duab thiab cov thawv, tsis txhob txhawj. Kuv mam qhia nej txhua tus paub.

CI/CD yog dab tsi?

Cov ntawv luv CI / CD sawv cev rau "kev koom ua ke txuas ntxiv / kev xa mus txuas ntxiv."

▍ Kev sib koom ua ke tsis tu ncua

Kev sib koom ua ke tsis tu ncua yog ib txoj hauv kev uas cov neeg tsim khoom tau cog lus rau qhov project lub ntsiab cai qhov chaw cia khoom (feem ntau yog ib ceg master). Nyob rau tib lub sij hawm, qhov zoo ntawm cov cai yog ua kom ntseeg tau los ntawm kev ntsuas automated.

▍ Kev xa tawm mus tas li

Kev xa tawm mus tas li yog qhov nquag, automated deployment code rau hauv ntau lawm. Qhov thib ob ntawm CI / CD acronym yog qee zaum sau tias "kev xa mus txuas ntxiv." Qhov no yog qhov pib zoo ib yam li "kev xa mus tsis tu ncua", tab sis "kev xa mus tas li" txhais tau tias yuav tsum tau ua kom paub meej cov kev hloov pauv ua ntej pib txoj haujlwm xa tawm.

Pib

Lub app kuv siv los kawm tag nrho cov no yog hu ua TakeNote. Nov yog lub vev xaib uas kuv tab tom ua haujlwm, tsim los sau ntawv. Thaum xub thawj kuv sim ua JAMStack-txoj haujlwm, lossis tsuas yog daim ntawv thov pem hauv ntej uas tsis muaj server, txhawm rau ua kom zoo dua ntawm tus qauv hosting thiab lub peev xwm xa tawm qhov project uas nws muaj Netlify. Raws li qhov nyuaj ntawm daim ntawv thov loj hlob, kuv xav tau los tsim nws cov neeg rau zaub mov, uas txhais tau hais tias kuv yuav tsum tau tsim kuv tus kheej lub tswv yim rau kev sib koom ua ke thiab kev xa tawm ntawm qhov project.

Hauv kuv qhov xwm txheej, daim ntawv thov yog Express server khiav hauv Node.js ib puag ncig, ua haujlwm rau ib nplooj ntawv React daim ntawv thov thiab txhawb kev ruaj ntseg server-sab API. Qhov no architecture ua raws li lub tswv yim uas tuaj yeem pom hauv muab Full stack authentication phau ntawv qhia.

Kuv sab laj nrog phooj ywg, uas yog tus kws tshaj lij automation, thiab nug nws seb kuv yuav tsum ua dab tsi los ua kom nws ua haujlwm txhua yam kuv xav tau. Nws muab kuv lub tswv yim ntawm qhov kev ua haujlwm automated yuav tsum zoo li cas, tau piav qhia hauv Cov Hom Phiaj tshooj ntawm kab lus no. Muaj cov hom phiaj no txhais tau tias kuv yuav tsum paub seb yuav siv Docker li cas.

docker

Docker yog ib qho cuab yeej uas, ua tsaug rau kev siv tshuab ntim khoom, tso cai rau cov ntawv thov kom yooj yim faib, xa tawm thiab khiav hauv tib qhov chaw, txawm tias Docker platform nws tus kheej khiav hauv ib puag ncig sib txawv. Ua ntej, kuv yuav tsum tau txais kuv txhais tes ntawm Docker hais kom ua kab cov cuab yeej (CLI). kev qhia Phau ntawv qhia kev teeb tsa Docker tsis tuaj yeem hu ua qhov tseeb thiab nkag siab, tab sis los ntawm nws koj tuaj yeem kawm tau tias txhawm rau ua thawj kauj ruam, koj yuav tsum rub tawm Docker Desktop (rau Mac lossis Windows).

Docker Hub yog roughly tib yam li GitHub rau git repositories, los yog npe npm rau JavaScript pob. Nov yog qhov chaw cia khoom online rau Docker cov duab. Nov yog qhov Docker Desktop txuas rau.

Yog li, txhawm rau pib nrog Docker, koj yuav tsum ua ob yam:

Tom qab ntawd, koj tuaj yeem tshawb xyuas yog tias Docker CLI ua haujlwm los ntawm kev khiav cov lus txib hauv qab no los xyuas Docker version:

docker -v

Tom ntej no, nkag mus rau Docker Hub los ntawm kev nkag mus rau koj lub npe siv thiab tus password thaum nug:

docker login

Txhawm rau siv Docker, koj yuav tsum nkag siab cov ntsiab lus ntawm cov duab thiab ntim.

▍ Cov duab

Ib daim duab yog ib yam zoo li daim duab qhia uas muaj cov lus qhia rau kev sib sau lub thawv. Qhov no yog ib qho immutable snapshot ntawm daim ntawv thov cov ntaub ntawv system thiab chaw. Cov neeg tsim khoom tuaj yeem faib cov duab yooj yim.

# Π’Ρ‹Π²ΠΎΠ΄ свСдСний ΠΎΠ±ΠΎ всСх ΠΎΠ±Ρ€Π°Π·Π°Ρ…
docker images

Cov lus txib no yuav tso tawm ib lub rooj nrog cov hauv qab no header:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Tom ntej no peb yuav saib qee qhov piv txwv ntawm cov lus txib hauv tib hom - ua ntej muaj cov lus txib nrog cov lus pom, thiab tom qab ntawd ib qho piv txwv ntawm qhov nws tuaj yeem tso tawm.

▍ Ntim

Ib lub thawv yog ib pob executable uas muaj txhua yam xav tau los khiav daim ntawv thov. Ib daim ntawv thov nrog rau txoj hauv kev no yuav ua haujlwm zoo ib yam, tsis hais txog kev tsim kho vaj tse: nyob rau hauv ib puag ncig ib puag ncig thiab tib qhov chaw. Lub ntsiab lus yog tias qhov piv txwv ntawm tib daim duab tau tso tawm hauv ib puag ncig sib txawv.

# ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΠ΅ всСх ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ²
docker ps -a
CONTAINER ID     IMAGE     COMMAND     CREATED     STATUS     PORTS     NAMES
---

▍ Tag

Ib lub cim yog qhov qhia txog qhov tshwj xeeb ntawm cov duab.

▍ Kev siv ceev ceev rau Docker cov lus txib

Nov yog cov lus piav qhia ntawm qee cov lus txib Docker uas nquag siv.

pab neeg

Ntsiab Lus

nyhuv

docker tsim

Duab

Tsim ib daim duab los ntawm Dockerfile

docker tag

Duab

Duab tag

docker dluab

Duab

Sau cov duab

docker khiav

Thawv

Khiav ib lub thawv raws li daim duab

docker zog

Duab

Uploading ib tug duab rau lub npe

docker rub

Duab

Loading ib daim duab los ntawm lub npe

docker ps

Thawv

Sau cov thawv

docker system prune

Duab / thawv

Tshem tawm cov thawv tsis siv thiab cov duab

▍ Dockerfile

Kuv paub yuav ua li cas khiav daim ntawv thov kev tsim khoom hauv zos. Kuv muaj Webpack configuration tsim los tsim ib daim ntawv thov React npaj txhij. Tom ntej no, kuv muaj cov lus txib uas pib lub Node.js raws li server ntawm qhov chaw nres nkoj 5000. Nws zoo li no:

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

Nws yuav tsum raug sau tseg tias kuv tsis muaj daim ntawv thov piv txwv rau cov khoom siv no. Tab sis ntawm no, rau kev sim, txhua daim ntawv thov Node yooj yim yuav ua.

Txhawm rau siv lub thawv, koj yuav tsum tau muab cov lus qhia rau Docker. Qhov no yog ua los ntawm cov ntaub ntawv hu ua Dockerfile, nyob rau hauv lub hauv paus directory ntawm qhov project. Cov ntaub ntawv no, thaum xub thawj, zoo nkaus li incomprehensible.

Tab sis dab tsi nws muaj tsuas yog piav qhia, nrog rau cov lus txib tshwj xeeb, qee yam zoo ib yam li kev teeb tsa ib puag ncig ua haujlwm. Nov yog qee cov lus txib no:

  • LOS NTAWM - Cov lus txib no pib ib cov ntaub ntawv. Nws qhia txog lub hauv paus duab uas lub thawv tsim.
  • COPY - Luam cov ntaub ntawv los ntawm qhov chaw hauv zos mus rau lub thawv.
  • KEV PAB CUAM - Teem lub npe ua haujlwm rau cov lus txib hauv qab no.
  • KHIAV - Khiav cov lus txib.
  • EXPOSE - Chaw nres nkoj teeb tsa.
  • ENTRYPOINT - Kev taw qhia ntawm cov lus txib kom ua tiav.

Dockerfile tej zaum yuav zoo li no:

# Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π·
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

Nyob ntawm lub hauv paus duab koj xaiv, tej zaum koj yuav tau rau nruab ntxiv dependencies. Qhov tseeb yog tias qee cov duab hauv paus (xws li Node Alpine Linux) tau tsim nrog lub hom phiaj ntawm kev ua kom lawv compact li sai tau. Yog li ntawd, lawv yuav tsis muaj qee qhov kev pab cuam uas koj xav tau.

▍ Kev tsim, sau npe thiab khiav lub thawv

Kev sib dhos hauv zos thiab tso tawm lub thawv yog tom qab peb muaj Dockerfile, cov dej num yog heev yooj yim. Ua ntej koj thawb daim duab mus rau Docker Hub, koj yuav tsum sim nws hauv zos.

▍ Sib dhos

Ua ntej koj yuav tsum sau duab, qhia lub npe thiab, xaiv tau, lub cim (yog tias tsis tau teev tseg, lub kaw lus yuav cia li muab ib daim ntawv rau daim duab latest).

# Π‘Π±ΠΎΡ€ΠΊΠ° ΠΎΠ±Ρ€Π°Π·Π°
docker build -t <image>:<tag> .

Tom qab khiav cov lus txib no, koj tuaj yeem saib Docker tsim cov duab.

Sending build context to Docker daemon   2.88MB
Step 1/9 : FROM node:12-alpine
 ---> ...Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этапов сборки...
Successfully built 123456789123
Successfully tagged <image>:<tag>

Kev tsim yuav siv sijhawm li ob peb feeb - nws tag nrho yog nyob ntawm seb koj muaj pes tsawg qhov kev vam meej. Thaum qhov tsim tiav, koj tuaj yeem khiav cov lus txib docker images thiab saib cov lus piav qhia ntawm koj daim duab tshiab.

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

▍ Launch

Cov duab tau tsim. Qhov no txhais tau tias koj tuaj yeem khiav lub thawv raws li nws. Vim kuv xav kom muaj peev xwm nkag tau rau hauv daim ntawv thov khiav hauv lub thawv ntawm localhost:5000, kuv, ntawm sab laug ntawm khub 5000:5000 nyob rau hauv cov lus txib tom ntej ntsia 5000. Ntawm sab xis yog lub thawv ntim khoom.

# Запуск с использованиСм локального ΠΏΠΎΡ€Ρ‚Π° 5000 ΠΈ ΠΏΠΎΡ€Ρ‚Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° 5000
docker run -p 5000:5000 <image>:<tag>

Tam sim no lub thawv tau tsim thiab khiav, koj tuaj yeem siv cov lus txib docker ps saib cov ntaub ntawv hais txog lub thawv no (lossis koj tuaj yeem siv cov lus txib docker ps -a, uas qhia cov ntaub ntawv hais txog tag nrho cov ntim khoom, tsis yog khiav ib leeg xwb).

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

Yog koj tam sim no mus rau qhov chaw nyob localhost:5000 - koj tuaj yeem pom ib nplooj ntawv ntawm daim ntawv thov khiav uas zoo ib yam li nplooj ntawv ntawm daim ntawv thov khiav hauv qhov chaw tsim khoom.

▍ Tag thiab tshaj tawm

Txhawm rau siv ib qho ntawm cov duab tsim ntawm cov neeg siv khoom tsim khoom, peb yuav tsum muaj peev xwm rub tawm cov duab no los ntawm Docker Hub. Qhov no txhais tau tias koj thawj zaug yuav tsum tau tsim ib lub chaw cia khoom rau qhov project ntawm Docker Hub. Tom qab no, peb yuav muaj qhov chaw uas peb tuaj yeem xa daim duab. Daim duab yuav tsum tau hloov npe kom nws lub npe pib nrog peb Docker Hub username. Qhov no yuav tsum tau ua raws li lub npe ntawm lub chaw cia khoom. Txhua daim ntawv tuaj yeem muab tso rau tom kawg ntawm lub npe. Hauv qab no yog ib qho piv txwv ntawm naming dluab siv lub tswv yim no.

Tam sim no koj tuaj yeem tsim cov duab nrog lub npe tshiab thiab khiav cov lus txib docker push thawb nws mus rau Docker Hub repository.

docker build -t <username>/<repository>:<tag> .
docker tag <username>/<repository>:<tag> <username>/<repository>:latest
docker push <username>/<repository>:<tag>

# На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ это ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ:
docker build -t user/app:v1.0.0 .
docker tag user/app:v1.0.0 user/app:latest
docker push user/app:v1.0.0

Yog tias txhua yam mus zoo, cov duab yuav muaj nyob rau ntawm Docker Hub thiab tuaj yeem yooj yim muab tso rau hauv server lossis xa mus rau lwm tus tsim tawm.

Cov kauj ruam tom ntej

Txog tam sim no peb tau txheeb xyuas tias daim ntawv thov, nyob rau hauv daim ntawv ntawm Docker thawv, tab tom khiav hauv zos. Peb tau xa lub thawv rau Docker Hub. Tag nrho qhov no txhais tau hais tias peb twb tau ua tiav zoo heev rau peb lub hom phiaj. Tam sim no peb yuav tsum daws ob lo lus nug ntxiv:

  • Teeb tsa CI cuab yeej rau kev sim thiab xa cov lej.
  • Teeb tsa cov neeg rau zaub mov ntau lawm kom nws tuaj yeem rub tawm thiab khiav peb cov cai.

Hauv peb qhov xwm txheej, peb siv Travis IB. Raws li lub server - DitigalOcean.

Nws yuav tsum raug sau tseg tias ntawm no koj tuaj yeem siv lwm cov kev pabcuam ua ke. Piv txwv li, tsis yog Travis CI, koj tuaj yeem siv CircleCI lossis Github Actions. Thiab tsis yog DigitalOcean - AWS lossis Linode.

Peb tau txiav txim siab ua haujlwm nrog Travis CI, thiab kuv twb muaj qee yam teeb tsa hauv qhov kev pabcuam no. Yog li ntawd, tam sim no kuv yuav tham luv luv txog yuav ua li cas npaj nws rau kev ua haujlwm.

Travis IB

Travis CI yog ib qho cuab yeej rau kev sim thiab xa cov lej. Kuv tsis xav mus rau qhov tsis sib xws ntawm kev teeb tsa Travis CI, vim tias txhua qhov haujlwm tshwj xeeb, thiab qhov no yuav tsis muaj txiaj ntsig ntau. Tab sis kuv mam li npog cov hauv paus kom koj pib yog tias koj txiav txim siab siv Travis CI. Txawm hais tias koj xaiv Travis CI, CircleCI, Jenkins, lossis lwm yam, cov txheej txheem kev teeb tsa zoo sib xws yuav raug siv txhua qhov chaw.

Txhawm rau pib nrog Travis CI, mus rau ua tsaug thiab tsim ib tus account. Tom qab ntawd koom nrog Travis CI nrog koj tus lej GitHub. Thaum teeb tsa lub kaw lus, koj yuav tsum qhia meej lub chaw cia khoom uas koj xav kom ua haujlwm automate thiab pab kom nkag mus rau nws. (Kuv siv GitHub, tab sis kuv paub tseeb tias Travis CI tuaj yeem koom nrog BitBucket, thiab GitLab, thiab lwm yam kev pabcuam zoo sib xws).

Txhua lub sij hawm Travis CI pib, tus neeg rau zaub mov tau pib, ua tiav cov lus txib uas tau teev tseg hauv cov ntaub ntawv teeb tsa, suav nrog kev xa tawm cov chaw khaws khoom sib txuas.

▍ Kev ua haujlwm lub neej

Travis CI configuration file hu ua .travis.yml thiab khaws cia rau hauv qhov project root directory, txhawb lub tswv yim ntawm cov xwm txheej lub neej voj voog hauj lwm. Cov xwm txheej no tau teev nyob rau hauv qhov kev txiav txim uas lawv tshwm sim:

  • apt addons
  • cache components
  • before_install
  • install
  • before_script
  • script
  • before_cache
  • after_success ΠΈΠ»ΠΈ after_failure
  • before_deploy
  • deploy
  • after_deploy
  • after_script

▍ Kev Xeem

Nyob rau hauv cov ntaub ntawv configuration kuv yuav configure lub zos Travis CI server. Kuv xaiv Node 12 ua hom lus thiab hais rau lub kaw lus kom txhim kho cov kev vam meej uas yuav tsum tau siv Docker.

Txhua yam uas tau teev tseg hauv .travis.yml, yuav raug tua thaum txhua qhov kev thov rub tawm mus rau txhua ceg ntawm lub chaw cia khoom, tshwj tsis yog tias tau teev tseg. Qhov no yog qhov muaj txiaj ntsig zoo vim tias nws txhais tau tias peb tuaj yeem sim tag nrho cov lej tuaj rau hauv qhov chaw cia khoom. Qhov no ua rau koj paub yog tias tus lej tau npaj los sau rau ntawm ceg. master, thiab seb nws puas yuav tawg qhov project tsim txheej txheem. Hauv qhov kev teeb tsa thoob ntiaj teb no, kuv nruab txhua yam hauv zos, khiav Webpack dev server hauv keeb kwm yav dhau (qhov no yog qhov tshwj xeeb ntawm kuv qhov kev ua haujlwm), thiab khiav kev xeem.

Yog tias koj xav kom koj lub chaw cia khoom tso saib cov paib qhia txog qhov kev xeem, S, SΡ“S, Koj tuaj yeem nrhiav cov lus qhia luv luv ntawm kev siv Jest, Travis CI thiab Coveralls los sau thiab tso tawm cov ntaub ntawv no.

Yog li ntawm no yog cov ntsiab lus ntawm cov ntaub ntawv .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

Qhov no yog qhov uas cov kev nqis tes ua uas tau ua rau txhua ceg ntawm qhov chaw cia khoom thiab rau rub cov lus thov xaus.

▍ Kev xa tawm

Raws li qhov kev xav tias tag nrho cov kev xeem automated tiav tiav, peb tuaj yeem, uas yog xaiv tau, xa cov cai rau cov neeg siv khoom ntau lawm. Txij li thaum peb xav ua qhov no tsuas yog rau code los ntawm ceg master, peb muab cov lus qhia tsim nyog rau hauv qhov chaw xa tawm. Ua ntej koj sim siv cov cai uas peb yuav saib tom ntej hauv koj qhov project, kuv xav ceeb toom koj tias koj yuav tsum muaj tsab ntawv tiag tiag hu rau kev xa tawm.

deploy:
  # Π‘ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° Docker Hub
  provider: script
  script: bash deploy.sh
  on:
    branch: master

Cov ntawv xa mus daws ob qhov teeb meem:

  • Tsim, cim npe thiab xa cov duab mus rau Docker Hub siv lub cuab yeej CI (hauv peb rooj plaub, Travis CI).
  • Kev thauj cov duab ntawm tus neeg rau zaub mov, nres lub thawv qub thiab pib ib qho tshiab (hauv peb rooj plaub, lub server khiav ntawm DigitalOcean platform).

Ua ntej, koj yuav tsum teeb tsa cov txheej txheem tsis siv neeg rau lub tsev, tagging, thiab thawb cov duab rau Docker Hub. Qhov no yog txhua yam zoo ib yam li qhov peb twb tau ua manually, tshwj tsis yog tias peb xav tau lub tswv yim los muab cov cim cim rau cov duab thiab automating logins. Kuv muaj teeb meem nrog qee cov ntsiab lus ntawm kev xa tawm tsab ntawv, xws li tagging zoo, nkag mus, SSH key encoding, SSH kev sib txuas tsim. Tab sis hmoov zoo kuv tus hluas nraug zoo heev nrog bash, zoo li nrog ntau lwm yam. Nws pab kuv sau tsab ntawv no.

Yog li, thawj feem ntawm tsab ntawv yog upload cov duab rau Docker Hub. Qhov no yooj yim heev ua. Lub tswv yim tagging kuv tau siv suav nrog kev sib txuas git hash thiab git tag, yog tias muaj. Qhov no ua kom ntseeg tau tias daim ntawv cim tshwj xeeb thiab ua rau nws yooj yim dua los txheeb xyuas lub rooj sib txoos uas nws ua raws. DOCKER_USERNAME ΠΈ DOCKER_PASSWORD yog cov neeg siv ib puag ncig hloov pauv uas tuaj yeem teeb tsa siv Travis CI interface. Travis CI yuav cia li ua cov ntaub ntawv rhiab heev kom nws tsis poob rau hauv tes tsis raug.

Nov yog thawj ntu ntawm tsab ntawv 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}

Qhov thib ob ntawm tsab ntawv yuav yog nyob ntawm seb koj siv tus tswv tsev twg thiab qhov kev sib txuas rau nws tau teeb tsa li cas. Hauv kuv qhov xwm txheej, txij li thaum kuv siv Digital Ocean, kuv siv cov lus txib los txuas rau lub server doctl. Thaum ua haujlwm nrog AWS, cov khoom siv hluav taws xob yuav raug siv aws, thiab lwm yam.

Kev teeb tsa lub server tsis yog qhov nyuaj tshwj xeeb. Yog li, kuv teeb tsa lub tee dej raws li lub hauv paus duab. Nws yuav tsum tau muab sau tseg tias lub kaw lus kuv xaiv yuav tsum tau ib-lub sij hawm phau ntawv installation ntawm Docker thiab ib zaug xwb phau ntawv pib ntawm Docker. Kuv siv Ubuntu 18.04 rau nruab Docker, yog li yog tias koj tseem siv Ubuntu los ua tib yam, koj tuaj yeem ua raws. qhov no yooj yim qhia.

Kuv tsis tau tham ntawm no txog cov lus txib tshwj xeeb rau kev pabcuam, vim qhov no tuaj yeem sib txawv heev hauv ntau qhov sib txawv. Kuv tsuas yog yuav muab cov phiaj xwm dav dav uas yuav tsum tau ua tom qab txuas ntawm SSH rau cov neeg rau zaub mov uas qhov project yuav raug xa mus:

  • Peb yuav tsum nrhiav lub thawv uas tam sim no khiav thiab nres nws.
  • Tom qab ntawd koj yuav tsum tso lub thawv tshiab rau hauv keeb kwm yav dhau.
  • Koj yuav tsum tau teeb tsa lub server lub chaw nres nkoj hauv zos rau 80 - qhov no yuav tso cai rau koj nkag mus rau lub xaib ntawm qhov chaw nyob zoo li example.com, tsis hais qhov chaw nres nkoj, tsis yog siv qhov chaw nyob zoo li example.com:5000.
  • Thaum kawg, koj yuav tsum rho tawm tag nrho cov thawv qub thiab cov duab.

Ntawm no yog qhov txuas ntxiv ntawm tsab ntawv.

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

Tej yam uas yuav tsum tau them rau

Nws muaj peev xwm hais tias thaum koj txuas mus rau tus neeg rau zaub mov ntawm SSH los ntawm Travis CI, koj yuav pom cov lus ceeb toom uas yuav tiv thaiv koj los ntawm kev txuas ntxiv nrog kev teeb tsa vim tias lub kaw lus yuav tos tus neeg siv cov lus teb.

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

Kuv tau kawm tias txoj hlua tseem ceeb tuaj yeem nkag mus rau hauv base64 thiaj li yuav txuag tau nws hauv daim ntawv uas nws tuaj yeem yooj yim thiab ntseeg tau ua haujlwm nrog. Nyob rau theem kev teeb tsa, koj tuaj yeem txiav txim siab tus yuam sij pej xeem thiab sau rau hauv cov ntaub ntawv known_hosts txhawm rau tshem tawm qhov yuam kev saum toj no.

echo <public key> | base64 # Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ <ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡, Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π² base64>

Hauv kev xyaum, cov lus txib no yuav zoo li no:

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

Thiab ntawm no yog dab tsi nws tsim - ib tug base64 encoded hlua:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Ntawm no yog cov lus txib hais saum toj no

install:
  - echo < ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡, Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π² base64> | base64 -d >> $HOME/.ssh/known_hosts

Tib txoj hauv kev tuaj yeem siv nrog tus yuam sij ntiag tug thaum tsim kev sib txuas, vim koj yuav xav tau tus yuam sij ntiag tug nkag mus rau lub server. Thaum ua haujlwm nrog tus yuam sij, koj tsuas yog yuav tsum xyuas kom meej tias nws tau khaws cia ruaj ntseg hauv Travis CI ib puag ncig hloov pauv thiab nws tsis pom nyob qhov twg.

Lwm qhov yuav tsum nco ntsoov yog tias koj yuav tsum tau khiav tag nrho cov ntawv xa mus ua ib kab, piv txwv li - nrog doctl. Qhov no yuav xav tau kev siv zog ntxiv.

doctl compute ssh <droplet> --ssh-command "всС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ здСсь && здСсь"

TLS/SSL thiab Load Balancing

Tom qab kuv tau ua txhua yam uas tau hais los saum no, qhov teeb meem kawg kuv ntsib yog tias lub server tsis muaj SSL. Txij li thaum kuv siv Node.js server, txhawm rau yuam mus ua hauj lwm thim rov qab npe Nginx thiab Cia Encrypt, koj yuav tsum tau tinker ntau.

Kuv yeej tsis xav ua txhua qhov kev teeb tsa SSL no manually, yog li kuv nyuam qhuav tsim cov khoom sib npaug thiab sau nws cov ntsiab lus hauv DNS. Nyob rau hauv cov ntaub ntawv ntawm DigitalOcean, piv txwv li, tsim ib qho kev rov pib dua nws tus kheej daim ntawv pov thawj ntawm lub load balancer yog ib txoj kev yooj yim, dawb thiab ceev. Txoj hauv kev no muaj qhov txiaj ntsig ntxiv uas nws ua rau nws yooj yim heev los teeb tsa SSL ntawm ntau lub servers khiav tom qab lub load balancer yog tias xav tau. Qhov no tso cai rau cov servers lawv tus kheej tsis txhob "xav" txog SSL txhua, tab sis tib lub sijhawm siv qhov chaw nres nkoj li niaj zaus 80. Yog li kev teeb tsa SSL ntawm lub load balancer yog yooj yim dua thiab yooj yim dua li lwm txoj hauv kev teeb tsa SSL.

Tam sim no koj tuaj yeem kaw tag nrho cov chaw nres nkoj ntawm lub server uas lees txais cov khoom sib txuas - tsuas yog qhov chaw nres nkoj 80, siv los sib txuas lus nrog lub load balancer, thiab qhov chaw nres nkoj 22 rau SSH. Yog li ntawd, kev sim nkag mus ncaj qha rau cov neeg rau zaub mov ntawm txhua qhov chaw nres nkoj uas tsis yog ob qho no yuav ua tsis tiav.

Cov txiaj ntsim tau los

Tom qab kuv tau ua txhua yam kuv tau tham txog hauv cov khoom no, tsis yog Docker platform lossis cov ntsiab lus ntawm kev siv CI / CD chains ntshai kuv ntxiv lawm. Kuv tuaj yeem teeb tsa kev sib txuas txuas ntxiv mus, thaum lub sijhawm kuaj cov lej ua ntej nws nkag mus rau hauv kev tsim khoom thiab cov cai tau txais kev xa tawm ntawm lub server. Qhov no yog txhua yam tseem tshiab rau kuv, thiab kuv paub tseeb tias muaj txoj hauv kev los txhim kho kuv cov haujlwm ua haujlwm tsis siv neeg thiab ua kom nws ua haujlwm zoo dua. Yog li yog tias koj muaj lus nug txog qhov teeb meem no, thov qhia rau kuv paub. rau kuv paub. Kuv vam tias tsab xov xwm no tau pab koj hauv koj txoj haujlwm. Kuv xav ntseeg tias tom qab nyeem nws, koj tau kawm ntau npaum li kuv tau kawm thaum pom txhua yam uas kuv tau tham txog hauv nws.

PS Ntawm peb khw muaj ib daim duab docker, uas tuaj yeem ntsia tau rau hauv ib qho nias. Koj tuaj yeem tshawb xyuas cov kev ua haujlwm ntawm cov ntim khoom ntawm VPS. Txhua tus neeg siv khoom tshiab tau muab 3 hnub ntawm kev kuaj dawb dawb.

Nyob zoo nyeem! Koj puas siv CI / CD thev naus laus zis hauv koj cov haujlwm?

Tsim CI / CD saw thiab automating ua hauj lwm nrog Docker

Tau qhov twg los: www.hab.com

Ntxiv ib saib