CI/CD zanjirini yaratish va Docker bilan ishlashni avtomatlashtirish

Men birinchi veb-saytlarimni 90-yillarning oxirida yozganman. O'sha paytda ularni ish tartibiga qo'yish juda oson edi. Ba'zi umumiy hostingda Apache serveri bor edi, siz FTP orqali ushbu serverga shunga o'xshash biror narsa yozish orqali kirishingiz mumkin ftp://ftp.example.com. Keyin ismingiz va parolingizni kiritib, fayllarni serverga yuklashingiz kerak edi. Turli vaqtlar bo'lgan, o'sha paytda hamma narsa hozirgidan ko'ra sodda edi.

CI/CD zanjirini yaratish va Docker bilan ishlashni avtomatlashtirish

O'shandan beri o'tgan yigirma yil ichida hamma narsa juda o'zgardi. Veb-saytlar yanada murakkablashdi, ularni ishlab chiqarishga chiqarishdan oldin yig'ish kerak. Bitta server yuk balanslagichlari ortida ishlaydigan ko'plab serverlarga aylandi va versiyalarni boshqarish tizimlaridan foydalanish odatiy holga aylandi.

Shaxsiy loyiham uchun menda maxsus konfiguratsiya bor edi. Va men faqat bitta amalni bajarish orqali saytni ishlab chiqarishda joylashtirish qobiliyatiga muhtojligini bilardim: filialga kod yozish master GitHub-da. Bundan tashqari, men kichik veb-ilovamning ishlashini ta'minlash uchun katta Kubernetes klasterini boshqarishni yoki Docker Swarm texnologiyasidan foydalanishni yoki pods, agentlar va boshqa barcha turdagi serverlar parkini saqlashni xohlamasligimni bilardim. murakkabliklar. Ishni iloji boricha osonlashtirish maqsadiga erishish uchun men CI/CD bilan tanishishim kerak edi.

Agar sizning kichik loyihangiz bo'lsa (bu holda, Node.js loyihasi) va siz ushbu loyihani joylashtirishni qanday avtomatlashtirishni bilmoqchi bo'lsangiz, shu bilan birga omborda saqlangan narsa ishlab chiqarishda ishlaydigan narsalarga to'liq mos kelishini ta'minlasangiz, men Ushbu maqola sizni qiziqtirishi mumkin deb o'ylayman.

Old shartlar

Ushbu maqolaning o'quvchisi buyruq qatori va Bash skriptlarini yozish haqida asosiy tushunchaga ega bo'lishi kutilmoqda. Bundan tashqari, unga hisoblar kerak bo'ladi Travis C.I. и Docker markazi.

Maqsadlar

Men ushbu maqolani so'zsiz "qo'llanma" deb atash mumkinligini aytmayman. Bu ko'proq hujjat bo'lib, unda men o'rganganlarim haqida gapiraman va bitta avtomatlashtirilgan o'tishda amalga oshiriladigan kodni sinovdan o'tkazish va ishlab chiqarishga joylashtirish uchun menga mos bo'lgan jarayonni tasvirlab beraman.

Mening ish jarayonim shu bilan yakunlandi.

Bundan tashqari, har qanday ombor filialiga joylashtirilgan kod uchun master, quyidagi harakatlar amalga oshiriladi:

  • Loyihani Travis CI asosida qurish boshlanadi.
  • Barcha birlik, integratsiya va end-to-end testlari amalga oshiriladi.

Faqat tegishli kod uchun master, quyidagilar amalga oshiriladi:

  • Yuqorida aytilganlarning barchasi, shuningdek, ...
  • Joriy kod, sozlamalar va muhit asosida Docker tasvirini yaratish.
  • Tasvirni Docker Hub-ga joylashtirish.
  • Ishlab chiqarish serveriga ulanish.
  • Docker Hub'dan serverga rasm yuklanmoqda.
  • Joriy konteynerni to'xtatish va yangi rasm asosida yangisini boshlash.

Agar siz Docker, tasvirlar va konteynerlar haqida mutlaqo hech narsa bilmasangiz, tashvishlanmang. Men sizga hammasini aytib beraman.

CI/CD nima?

CI/CD qisqartmasi "uzluksiz integratsiya/uzluksiz joylashtirish" degan ma'noni anglatadi.

▍Doimiy integratsiya

Uzluksiz integratsiya - bu ishlab chiquvchilar loyihaning asosiy manba kodlari omboriga (odatda filial) majburiyatlarni bajaradigan jarayondir. master). Shu bilan birga, kodning sifati avtomatlashtirilgan test orqali ta'minlanadi.

▍Doimiy joylashtirish

Uzluksiz joylashtirish - ishlab chiqarishga kodni tez-tez, avtomatlashtirilgan tarzda joylashtirish. CI/CD qisqartmasining ikkinchi qismi ba'zan "doimiy yetkazib berish" deb ta'riflanadi. Bu asosan "doimiy joylashtirish" bilan bir xil, ammo "doimiy yetkazib berish" loyihani joylashtirish jarayonini boshlashdan oldin o'zgarishlarni qo'lda tasdiqlash zarurligini anglatadi.

Ishga kirishish

Bularning barchasini o'rgangan ilovam deyiladi NoteNote. Bu men ishlayotgan veb-loyiha, eslatma olish uchun mo'ljallangan. Avvaliga men qilishga harakat qildim JAMStack-loyiha yoki faqat serversiz oldingi dastur, u taqdim etayotgan standart xosting va loyihani joylashtirish imkoniyatlaridan foydalanish uchun. Netify. Ilovaning murakkabligi oshgani sayin, men uning server qismini yaratishim kerak edi, bu men avtomatlashtirilgan integratsiya va loyihani avtomatlashtirilgan joylashtirish uchun o'z strategiyamni shakllantirishim kerakligini anglatardi.

Mening holimda dastur Node.js muhitida ishlaydigan, bir sahifali React ilovasiga xizmat qiluvchi va xavfsiz server tomonidagi APIni qo‘llab-quvvatlaydigan Express serverdir. Ushbu arxitekturada topish mumkin bo'lgan strategiyaga amal qiladi bu To'liq stek autentifikatsiya qo'llanmasi.

bilan maslahatlashdim другом, u avtomatlashtirish bo'yicha mutaxassis va undan hammasi men xohlagan tarzda ishlashi uchun nima qilishim kerakligini so'radi. U menga ushbu maqolaning Maqsadlar bo'limida tasvirlangan avtomatlashtirilgan ish jarayoni qanday bo'lishi kerakligi haqida fikr berdi. Ushbu maqsadlarga ega bo'lish men Dockerdan qanday foydalanishni tushunishim kerakligini anglatardi.

Docker

Docker - bu konteynerlashtirish texnologiyasi tufayli, hatto Docker platformasining o'zi turli muhitlarda ishlayotgan bo'lsa ham, ilovalarni bir xil muhitda osongina tarqatish, joylashtirish va ishga tushirish imkonini beruvchi vositadir. Birinchidan, men Docker buyruq qatori vositalari (CLI) bilan tanishishim kerak edi. Ko'rsatma Docker o'rnatish qo'llanmasini juda aniq va tushunarli deb atash mumkin emas, lekin undan siz birinchi o'rnatish bosqichini amalga oshirish uchun Docker Desktop dasturini (Mac yoki Windows uchun) yuklab olishingiz kerakligini bilib olishingiz mumkin.

Docker Hub taxminan bir xil narsa GitHub git omborlari yoki ro'yxatga olish kitobi uchun npm JavaScript paketlari uchun. Bu Docker tasvirlari uchun onlayn ombor. Docker Desktop nimaga ulanadi.

Shunday qilib, Docker bilan ishlashni boshlash uchun siz ikkita narsani qilishingiz kerak:

Shundan so'ng, Docker versiyasini tekshirish uchun quyidagi buyruqni ishga tushirish orqali Docker CLI ishlayotganligini tekshirishingiz mumkin:

docker -v

Keyin, so'ralganda foydalanuvchi nomingiz va parolingizni kiritish orqali Docker Hub-ga kiring:

docker login

Docker-dan foydalanish uchun siz tasvirlar va konteynerlar tushunchalarini tushunishingiz kerak.

▍Rasmlar

Tasvir - bu konteynerni yig'ish bo'yicha ko'rsatmalarni o'z ichiga olgan rejaga o'xshash narsa. Bu ilova fayl tizimi va sozlamalarining o'zgarmas suratidir. Ishlab chiquvchilar rasmlarni osongina almashishlari mumkin.

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

Ushbu buyruq quyidagi sarlavhali jadvalni chiqaradi:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Keyinchalik biz bir xil formatdagi buyruqlarning ba'zi misollarini ko'rib chiqamiz - birinchi navbatda izohli buyruq, keyin esa u nima chiqishi mumkinligiga misol.

▍Konteynerlar

Konteyner - bu dasturni ishga tushirish uchun zarur bo'lgan barcha narsalarni o'z ichiga olgan bajariladigan paket. Bunday yondashuvga ega dastur, infratuzilmadan qat'i nazar, har doim bir xil ishlaydi: izolyatsiya qilingan muhitda va bir xil muhitda. Gap shundaki, bir xil tasvirning namunalari turli muhitlarda ishga tushiriladi.

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

▍Teglar

Teg - bu tasvirning ma'lum bir versiyasining ko'rsatkichidir.

▍Docker buyruqlariga tezkor havola

Bu erda ba'zi tez-tez ishlatiladigan Docker buyruqlari haqida umumiy ma'lumot.

komanda

Kontekst

ta'sir

docker qurilishi

Rasm

Docker faylidan rasm yaratish

docker yorlig'i

Rasm

Rasmni teglash

docker rasmlarni

Rasm

Rasmlar ro'yxati

docker ishlaydi

Konteyner

Tasvirga asoslangan konteynerni ishga tushirish

docker surish

Rasm

Rasmni ro'yxatga olish kitobiga yuklash

docker tortish

Rasm

Ro'yxatga olish kitobidan rasm yuklanmoqda

docker ps

Konteyner

Konteynerlar ro'yxati

docker tizimi prune

Tasvir/konteyner

Ishlatilmagan konteynerlar va rasmlarni olib tashlash

▍Docker fayli

Men mahalliy ishlab chiqarish dasturini qanday ishlatishni bilaman. Menda tayyor React ilovasini yaratish uchun mo'ljallangan Webpack konfiguratsiyasi bor. Keyin menda portda Node.js serverini ishga tushiradigan buyruq bor 5000. Bu shunday ko'rinadi:

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

Shuni ta'kidlash kerakki, menda ushbu material uchun namunaviy ariza yo'q. Ammo bu erda tajribalar uchun har qanday oddiy Node ilovasi yordam beradi.

Konteynerdan foydalanish uchun siz Docker-ga ko'rsatmalar berishingiz kerak. Bu nomli fayl orqali amalga oshiriladi Dockerfile, loyihaning asosiy katalogida joylashgan. Bu fayl, birinchi navbatda, tushunarsiz ko'rinadi.

Lekin u o'z ichiga olgan narsa faqat maxsus buyruqlar bilan ish muhitini o'rnatishga o'xshash narsani tasvirlaydi. Mana bu buyruqlardan ba'zilari:

  • FROM — Bu buyruq faylni ishga tushiradi. U konteyner qurilgan asosiy tasvirni belgilaydi.
  • Copy — Fayllarni mahalliy manbadan konteynerga nusxalash.
  • WORKDIR — Quyidagi buyruqlar uchun ishchi katalogni o'rnatish.
  • RUN - Buyruqlarni ishga tushirish.
  • FOSH QILISH — Port sozlamalari.
  • KIRISH NOKTA — Bajarilishi kerak bo'lgan buyruqni ko'rsatish.

Dockerfile shunga o'xshash narsa ko'rinishi mumkin:

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

Siz tanlagan asosiy tasvirga qarab, qo'shimcha bog'liqliklarni o'rnatishingiz kerak bo'lishi mumkin. Gap shundaki, ba'zi asosiy tasvirlar (masalan, Node Alpine Linux) ularni iloji boricha ixcham qilish maqsadida yaratilgan. Natijada, ular siz kutgan ba'zi dasturlarga ega bo'lmasligi mumkin.

▍Konteynerni qurish, teglash va ishga tushirish

Mahalliy yig'ish va konteynerni ishga tushirish bizda Dockerfile, vazifalar juda oddiy. Tasvirni Docker Hub-ga surishdan oldin uni mahalliy sifatida sinab ko'rishingiz kerak.

▍Yig'ish

Avval siz yig'ishingiz kerak tasvir, nom va ixtiyoriy ravishda tegni ko'rsatish (agar teg ko'rsatilmagan bo'lsa, tizim avtomatik ravishda rasmga teg tayinlaydi) latest).

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

Ushbu buyruqni bajarganingizdan so'ng, siz Docker-ning tasvirni yaratishini ko'rishingiz mumkin.

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

Qurilish bir necha daqiqa vaqt olishi mumkin - barchasi sizda qancha bog'liqlik borligiga bog'liq. Qurilish tugallangandan so'ng siz buyruqni bajarishingiz mumkin docker images va yangi rasmingiz tavsifiga qarang.

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

▍Ishga tushirish

Tasvir yaratildi. Bu shuni anglatadiki, siz uning asosida konteynerni ishga tushirishingiz mumkin. Chunki men konteynerda ishlaydigan dasturga kirish imkoniyatiga ega bo'lishni xohlayman localhost:5000, men, juftlikning chap tomonida 5000:5000 keyingi o'rnatilgan buyruqda 5000. O'ng tomonda konteyner porti joylashgan.

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

Endi konteyner yaratilgan va ishlamoqda, siz buyruqdan foydalanishingiz mumkin docker ps ushbu konteyner haqida ma'lumotni ko'rish uchun (yoki buyruqni ishlatishingiz mumkin docker ps -a, bu nafaqat ishlaydigan, balki barcha konteynerlar haqidagi ma'lumotlarni ko'rsatadi).

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

Agar hozir manzilga borsangiz localhost:5000 — ishlab chiqarish muhitida ishlayotgan ilova sahifasi bilan aynan bir xil koʻrinishda ishlaydigan dastur sahifasini koʻrishingiz mumkin.

▍Teglash va nashr qilish

Ishlab chiqarish serverida yaratilgan tasvirlardan birini ishlatish uchun biz ushbu rasmni Docker Hub-dan yuklab olishimiz kerak. Bu birinchi navbatda Docker Hub-da loyiha uchun ombor yaratishingiz kerakligini anglatadi. Shundan so'ng bizda rasmni yuborishimiz mumkin bo'lgan joy bo'ladi. Rasm nomini o'zgartirish kerak, shunda uning nomi bizning Docker Hub foydalanuvchi nomidan boshlanadi. Undan keyin ombor nomi yozilishi kerak. Ismning oxiriga istalgan teg qo'yilishi mumkin. Quyida ushbu sxema yordamida tasvirlarni nomlash misoli keltirilgan.

Endi siz rasmni yangi nom bilan qurishingiz va buyruqni bajarishingiz mumkin docker push uni Docker Hub omboriga surish uchun.

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

Agar hamma narsa yaxshi bo'lsa, tasvir Docker Hub-da mavjud bo'ladi va uni serverga osongina yuklash yoki boshqa ishlab chiquvchilarga o'tkazish mumkin.

Keyingi qadamlar

Hozircha biz Docker konteyneri ko'rinishidagi ilova mahalliy sifatida ishlayotganini tasdiqladik. Biz konteynerni Docker Hub-ga yukladik. Bularning barchasi biz o'z oldimizga qo'ygan maqsad sari juda yaxshi qadam tashlaganimizni anglatadi. Endi biz yana ikkita savolni hal qilishimiz kerak:

  • Kodni sinash va joylashtirish uchun CI vositasini sozlash.
  • Ishlab chiqarish serverini bizning kodimizni yuklab olishi va ishga tushirishi uchun sozlash.

Bizning holatlarimizda biz foydalanamiz Travis C.I.. Server sifatida - Ditigal Okean.

Shuni ta'kidlash kerakki, bu erda siz xizmatlarning boshqa kombinatsiyasidan foydalanishingiz mumkin. Misol uchun, Travis CI o'rniga siz CircleCI yoki Github Actions dan foydalanishingiz mumkin. Va DigitalOcean o'rniga - AWS yoki Linode.

Biz Travis CI bilan ishlashga qaror qildik va menda allaqachon ushbu xizmatda nimadir sozlangan. Shuning uchun, endi men uni ishga qanday tayyorlash haqida qisqacha gapirib beraman.

Travis C.I.

Travis CI - bu kodni sinab ko'rish va joylashtirish uchun vosita. Men Travis CI ni o'rnatishning nozik jihatlariga kirishni xohlamayman, chunki har bir loyiha noyobdir va bu unchalik katta foyda keltirmaydi. Agar siz Travis CI dan foydalanishga qaror qilsangiz, men sizni boshlash uchun asoslarni yoritib beraman. Travis CI, CircleCI, Jenkins yoki boshqasini tanlaysizmi, shunga o'xshash konfiguratsiya usullari hamma joyda qo'llaniladi.

Travis CI bilan ishlashni boshlash uchun quyidagi manzilga o'ting sayt loyihasi va hisob yaratish. Keyin Travis CI-ni GitHub hisobingiz bilan integratsiya qiling. Tizimni o'rnatishda siz ishni avtomatlashtirmoqchi bo'lgan omborni ko'rsatishingiz va unga kirishni yoqishingiz kerak. (Men GitHub-dan foydalanaman, lekin ishonchim komilki, Travis CI BitBucket, GitLab va shunga o'xshash boshqa xizmatlar bilan integratsiyalasha oladi).

Har safar Travis CI ishga tushirilganda server ishga tushiriladi, konfiguratsiya faylida ko'rsatilgan buyruqlarni bajaradi, shu jumladan tegishli ombor filiallarini o'rnatadi.

▍Ishning hayot aylanishi

Travis CI konfiguratsiya fayli chaqirildi .travis.yml va loyihaning ildiz katalogida saqlanadi, voqealar kontseptsiyasini qo'llab-quvvatlaydi hayot davrasi vazifalar. Ushbu hodisalar sodir bo'lish tartibida keltirilgan:

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

▍Sinov

Konfiguratsiya faylida men mahalliy Travis CI serverini sozlamoqchiman. Men 12-tugunni til sifatida tanladim va tizimga Docker-dan foydalanish uchun zarur bo'lgan bog'liqliklarni o'rnatishni aytdim.

Ro'yxatga kiritilgan hamma narsa .travis.yml, agar boshqacha ko'rsatilmagan bo'lsa, barcha tortish so'rovlari omborning barcha bo'limlariga qilinganida bajariladi. Bu foydali xususiyat, chunki bu biz omborga kiradigan barcha kodlarni sinab ko'rishimiz mumkinligini anglatadi. Bu sizga kodning filialga yozishga tayyorligini bilish imkonini beradi. master, va u loyihani qurish jarayonini buzadimi. Ushbu global konfiguratsiyada men hamma narsani mahalliy sifatida o'rnataman, Webpack dev serverini fonda ishga tushiraman (bu mening ish jarayonimning xususiyati) va testlarni o'tkazaman.

Agar siz omboringiz sinov qamrovi piktogrammalarini ko'rsatishini istasangiz, shu yerda Ushbu ma'lumotni to'plash va namoyish qilish uchun Jest, Travis CI va kombinezonlardan foydalanish bo'yicha qisqa ko'rsatmalarni topishingiz mumkin.

Shunday qilib, faylning mazmuni .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

Bu erda omborning barcha bo'limlari va tortib olish so'rovlari uchun bajariladigan amallar tugaydi.

▍O'rnatish

Barcha avtomatlashtirilgan testlar muvaffaqiyatli yakunlangan degan taxminga asoslanib, biz kodni ishlab chiqarish serveriga joylashtirishimiz mumkin (ixtiyoriy). Chunki biz buni faqat filialdagi kod uchun qilishni xohlaymiz master, biz tizimga joylashtirish sozlamalarida tegishli ko'rsatmalar beramiz. Loyihangizda biz ko'rib chiqadigan kodni ishlatishdan oldin, sizda joriy etish uchun chaqirilgan haqiqiy skript bo'lishi kerakligi haqida ogohlantirmoqchiman.

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

Joylashtirish skripti ikkita muammoni hal qiladi:

  • CI vositasi (bizning holatlarimizda Travis CI) yordamida rasmni yarating, belgilang va Docker Hub-ga yuboring.
  • Tasvirni serverga yuklash, eski konteynerni to'xtatish va yangisini ishga tushirish (bizning holatlarimizda server DigitalOcean platformasida ishlaydi).

Birinchidan, rasmni yaratish, teglash va Docker Hub-ga surish uchun avtomatik jarayonni sozlashingiz kerak. Bularning barchasi biz allaqachon qo'lda qilgan ishimizga juda o'xshaydi, faqat bizga rasmlarga noyob teglar belgilash va loginlarni avtomatlashtirish strategiyasi kerak bo'ladi. Men joylashtirish skriptining ba'zi tafsilotlari, masalan, teglash strategiyasi, login, SSH kalitini kodlash, SSH ulanishini o'rnatish bilan qiynalganman. Yaxshiyamki, mening yigitim boshqa narsalar kabi bash bilan juda yaxshi. U menga ushbu skriptni yozishda yordam berdi.

Shunday qilib, skriptning birinchi qismi tasvirni Docker Hub-ga yuklaydi. Buni qilish ancha oson. Men ishlatgan teglash sxemasi, agar mavjud bo'lsa, git xesh va git tegini birlashtirishni o'z ichiga oladi. Bu tegning o'ziga xosligini ta'minlaydi va u asoslangan yig'ilishni aniqlashni osonlashtiradi. DOCKER_USERNAME и DOCKER_PASSWORD Travis CI interfeysi yordamida o'rnatilishi mumkin bo'lgan foydalanuvchi muhiti o'zgaruvchilari. Travis CI maxfiy ma'lumotlarni noto'g'ri qo'llarga tushmasligi uchun avtomatik ravishda qayta ishlaydi.

Mana skriptning birinchi qismi 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}

Skriptning ikkinchi qismi qanday bo'lishi butunlay siz qaysi xostdan foydalanayotganingizga va unga ulanish qanday tashkil etilganiga bog'liq. Mening holimda, Digital Ocean-dan foydalanganim sababli, serverga ulanish uchun buyruqlardan foydalanaman doctl. AWS bilan ishlashda yordam dasturidan foydalaniladi aws, va hokazo.

Serverni sozlash unchalik qiyin emas edi. Shunday qilib, men asosiy tasvirga asoslangan tomchi o'rnatdim. Shuni ta'kidlash kerakki, men tanlagan tizim Docker-ni bir martalik qo'lda o'rnatishni va Docker-ni bir martalik qo'lda ishga tushirishni talab qiladi. Men Docker-ni o'rnatish uchun Ubuntu 18.04 dan foydalandim, shuning uchun siz ham xuddi shunday qilish uchun Ubuntu-dan foydalansangiz, shunchaki amal qilishingiz mumkin. bu oddiy qo'llanma.

Men bu erda xizmat uchun maxsus buyruqlar haqida gapirmayapman, chunki bu jihat turli holatlarda juda farq qilishi mumkin. Men SSH orqali loyiha joylashtiriladigan serverga ulangandan so'ng bajarilishi kerak bo'lgan umumiy harakatlar rejasini beraman:

  • Biz hozirda ishlayotgan konteynerni topishimiz va uni to'xtatishimiz kerak.
  • Keyin fonda yangi konteynerni ishga tushirishingiz kerak.
  • Serverning mahalliy portini o'rnatishingiz kerak bo'ladi 80 - bu kabi manzilda saytga kirish imkonini beradi example.com, kabi manzilni ishlatishdan ko'ra, portni ko'rsatmasdan example.com:5000.
  • Nihoyat, barcha eski konteynerlar va rasmlarni o'chirishingiz kerak.

Mana stsenariyning davomi.

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

Ba'zi narsalarga e'tibor berish kerak

Travis CI-dan SSH orqali serverga ulanganingizda, tizim foydalanuvchining javobini kutayotganligi sababli o'rnatishni davom ettirishingizga to'sqinlik qiladigan ogohlantirishni ko'rishingiz mumkin.

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

Men simli kalitni qulay va ishonchli ishlash mumkin bo'lgan shaklda saqlash uchun base64 da kodlash mumkinligini bilib oldim. O'rnatish bosqichida siz ochiq kalitni dekodlashingiz va uni faylga yozishingiz mumkin known_hosts Yuqoridagi xatolikdan xalos bo'lish uchun.

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

Amalda bu buyruq quyidagicha ko'rinishi mumkin:

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

Va u ishlab chiqaradigan narsa - base64 kodlangan qator:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Mana yuqorida aytib o'tilgan buyruq

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

Xuddi shu yondashuv ulanishni o'rnatishda shaxsiy kalit bilan ishlatilishi mumkin, chunki serverga kirish uchun sizga shaxsiy kalit kerak bo'lishi mumkin. Kalit bilan ishlaganda, siz shunchaki uning Travis CI muhit o'zgaruvchisida xavfsiz saqlanishi va u hech qanday joyda ko'rsatilmasligiga ishonch hosil qilishingiz kerak.

Yana bir narsani ta'kidlash kerakki, siz butun joylashtirish skriptini bitta satr sifatida ishga tushirishingiz kerak bo'lishi mumkin, masalan - bilan doctl. Bu qo'shimcha harakatlarni talab qilishi mumkin.

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

TLS/SSL va yuklarni muvozanatlash

Yuqorida aytib o'tilgan hamma narsani qilganimdan so'ng, men duch kelgan oxirgi muammo serverda SSL yo'qligi edi. Men majburlash uchun Node.js serveridan foydalanayotganim uchun ish teskari proksi-server Nginx va Let's Encrypt uchun siz ko'p narsalarni o'ylashingiz kerak.

Men ushbu SSL konfiguratsiyasining barchasini qo'lda qilishni xohlamadim, shuning uchun men faqat yuk balansini yaratdim va uning tafsilotlarini DNS-ga yozib oldim. DigitalOcean misolida, masalan, yuk balansida avtomatik yangilanadigan o'z-o'zidan imzolangan sertifikat yaratish oddiy, bepul va tez jarayondir. Ushbu yondashuv qo'shimcha afzalliklarga ega, chunki agar kerak bo'lsa, yuk balansi orqasida ishlaydigan bir nechta serverlarda SSL-ni o'rnatish juda oson. Bu serverlarga SSL haqida umuman "o'ylamaslik" imkonini beradi, lekin shu bilan birga portdan odatdagidek foydalanishga imkon beradi. 80. Shunday qilib, yuk balanslagichida SSL-ni sozlash SSL-ni o'rnatishning muqobil usullariga qaraganda ancha oson va qulayroqdir.

Endi siz serverdagi kiruvchi ulanishlarni qabul qiladigan barcha portlarni yopishingiz mumkin - portdan tashqari 80, yuk balansi va port bilan aloqa qilish uchun ishlatiladi 22 SSH uchun. Natijada, ushbu ikkitadan boshqa har qanday portdagi serverga to'g'ridan-to'g'ri kirishga urinish muvaffaqiyatsiz bo'ladi.

natijalar

Men ushbu materialda gapirgan hamma narsani bajarganimdan so'ng, na Docker platformasi, na avtomatlashtirilgan CI/CD zanjirlari tushunchalari meni qo'rqitmadi. Men uzluksiz integratsiya zanjirini o'rnatishga muvaffaq bo'ldim, uning davomida kod ishlab chiqarishga kirishdan oldin sinovdan o'tkaziladi va kod avtomatik ravishda serverda joylashtiriladi. Bularning barchasi men uchun nisbatan yangi va men avtomatlashtirilgan ish jarayonini yaxshilash va uni yanada samaraliroq qilish yo‘llari borligiga aminman. Shuning uchun, agar sizda bu masala bo'yicha biron bir fikringiz bo'lsa, iltimos, menga xabar bering. men bilan bilish. Umid qilamanki, ushbu maqola sizning harakatlaringizda sizga yordam berdi. Ishonmoqchimanki, uni o'qib chiqqandan so'ng, siz men o'rganganimdek ko'p narsani o'rgandingiz va unda men gapirgan hamma narsani tushunib olasiz.

PS Bizning bozor tasvir mavjud Docker, uni bir marta bosish bilan o'rnatish mumkin. Konteynerlarning ishlashini quyidagi manzilda tekshirishingiz mumkin VPS. Barcha yangi mijozlarga 3 kunlik bepul sinov beriladi.

Hurmatli o'quvchilar! Loyihalaringizda CI/CD texnologiyalaridan foydalanasizmi?

CI/CD zanjirini yaratish va Docker bilan ishlashni avtomatlashtirish

Manba: www.habr.com

a Izoh qo'shish