CI / CD zəncirinin yaradılması və Docker ilə işin avtomatlaşdırılması

İlk saytlarımı 90-cı illərin sonlarında yazmışam. Sonra onları işlək vəziyyətə gətirmək çox asan oldu. Bəzi paylaşılan hostinqdə Apache serveri var idi, bu serverə FTP vasitəsilə brauzer xəttinə belə bir şey yazmaqla daxil olmaq olar ftp://ftp.example.com. Sonra ad və parol daxil etmək və faylları serverə yükləmək lazım idi. Başqa vaxtlar da olub, o vaxt hər şey indikindən daha sadə idi.

CI / CD zəncirinin yaradılması və Docker ilə işin avtomatlaşdırılması

Son iki onillikdə hər şey çox dəyişdi. Saytlar daha mürəkkəb hala gəldi, istehsala buraxılmazdan əvvəl yığılmalıdır. Tək bir server yük balanslaşdırıcılarının arxasında işləyən bir çox serverə çevrildi, versiyaya nəzarət sistemlərinin istifadəsi adi hala çevrildi.

Şəxsi layihəm üçün xüsusi konfiqurasiyam var idi. Və bilirdim ki, bir saytı istehsalda yerləşdirmək bacarığına ehtiyacım var, sadəcə bir hərəkəti yerinə yetirmək: filiala kod yazmaq master GitHub-da. Mən həmçinin bilirdim ki, nəhəng Kubernetes klasterini idarə etmək, Docker Swarm texnologiyasından istifadə etmək və ya kiçik veb tətbiqimi işə salmaq üçün podlar, agentlər və hər cür digər mürəkkəbliklərlə server parkı saxlamaq istəmirəm. İşi mümkün qədər asanlaşdırmaq məqsədinə çatmaq üçün CI / CD ilə tanış olmalıyam.

Əgər sizin kiçik bir layihəniz varsa (bizim vəziyyətimizdə Node.js layihəsi) və bu layihənin yerləşdirilməsinin avtomatlaşdırılmasını öyrənmək istəyirsinizsə, eyni zamanda repozitoriyada saxlanılanların istehsalda işləyənlərə tam uyğun olduğundan əmin olun. bu məqalə sizi maraqlandıra bilər.

Ön şərtlər

Bu məqalənin oxucusunun əsas komanda xətti və Bash skript biliklərinə sahib olması gözlənilir. Bundan əlavə, ona hesablar lazım olacaq Travis C.I. и Docker mərkəzi.

Məqsədlər

Deməyəcəyəm ki, bu məqaləni qeyd-şərtsiz “təlim bələdçisi” adlandırmaq olar. Bu, daha çox öyrəndiklərim haqqında danışdığım və bir avtomatlaşdırılmış keçiddə yerinə yetirilən kodu sınamaq və istehsala yerləşdirmək üçün mənə uyğun olan prosesi təsvir etdiyim bir sənəddir.

Budur mənim iş axınım necə göründü.

Koddan başqa deponun istənilən filialına itələnmək üçün master, aşağıdakı hərəkətlər yerinə yetirilir:

  • Travis CI üzərində layihə qurulması başlayır.
  • Bütün vahid, inteqrasiya və uçdan-uca testlər aparılır.

Yalnız sona çatan kod üçün master, aşağıdakılar edilir:

  • Yuxarıda göstərilənlərin hamısı, üstəlik...
  • Cari kod, parametrlər və mühit əsasında Docker təsvirinin qurulması.
  • Şəklin Docker Hub-da yerləşdirilməsi.
  • İstehsal serverinə qoşulma.
  • Docker Hub-dan serverə şəkil yüklənir.
  • Cari konteyneri dayandırın və yeni şəkil əsasında yenisini işə salın.

Docker, şəkillər və konteynerlər haqqında heç nə bilmirsinizsə, narahat olmayın. Mən sizə hər şeyi danışacağam.

CI/CD nədir?

CI / CD abbreviaturası "davamlı inteqrasiya / davamlı yerləşdirmə" - "davamlı inteqrasiya / davamlı yerləşdirmə" deməkdir.

▍Davamlı İnteqrasiya

Davamlı İnteqrasiya, tərtibatçıların layihənin əsas mənbə kodu deposuna (adətən filial) öhdəlik götürdüyü prosesdir. master). Eyni zamanda kodun keyfiyyəti avtomatlaşdırılmış sınaq vasitəsilə təmin edilir.

▍Davamlı Yerləşdirmə

Davamlı yerləşdirmə kodun istehsala tez-tez avtomatlaşdırılmış şəkildə yerləşdirilməsidir. CI / CD abbreviaturasının ikinci hissəsi bəzən "davamlı çatdırılma" ("davamlı çatdırılma") kimi göstərilir. Bu, əsasən "davamlı yerləşdirmə" ilə eynidir, lakin "davamlı çatdırılma" layihənin yerləşdirilməsi prosesinə başlamazdan əvvəl dəyişikliklərin əl ilə təsdiqlənməsini nəzərdə tutur.

Başlarken

Bütün bunları mənimsədiyim proqram adlanır Qeyd etmək. Bu qeydlər aparmaq üçün üzərində işlədiyim veb layihədir. Əvvəlcə etməyə çalışdım JAMStack-təqdim etdiyi standart hostinq və layihə yerləşdirmə seçimlərindən faydalanmaq üçün layihə və ya sadəcə serveri olmayan ön proqram. Netlif. Tətbiqin mürəkkəbliyi artdıqca, mən onun arxa ucunu yaratmalı oldum, bu o demək idi ki, avtomatlaşdırılmış inteqrasiya və layihənin avtomatlaşdırılmış yerləşdirilməsi üçün öz strategiyamı formalaşdırmalıyam.

Mənim vəziyyətimdə proqram Node.js mühitində işləyən, tək səhifəli React proqramına xidmət edən və təhlükəsiz server tərəfi API-ni dəstəkləyən Ekspress serverdir. Bu arxitektura burada tapıla bilən strategiyanı izləyir bu tam yığın identifikasiyası bələdçisi.

ilə məsləhətləşdim другом, avtomatlaşdırma üzrə mütəxəssisdir və ondan hər şeyin istədiyim kimi işləməsi üçün nə etməli olduğumu soruşdu. O, mənə bu məqalənin Məqsədlər bölməsində göstərilən avtomatlaşdırılmış iş axınının necə görünməsi barədə fikir verdi. Bu kimi məqsədlərin qoyulması o demək idi ki, Docker-dən necə istifadə edəcəyimi anlamalıyam.

yükvuran

Docker, konteynerləşdirmə texnologiyası sayəsində tətbiqləri paylamağı, həmçinin Docker platformasının özü müxtəlif mühitlərdə işləsə belə, onları eyni mühitdə yerləşdirməyi və işə salmağı asanlaşdıran bir vasitədir. Əvvəlcə Docker komanda xətti alətlərinə (CLI) əl atmalı oldum. Təlimat Docker üçün quraşdırma təlimatı çox aydın deyil, lakin siz ondan öyrənə bilərsiniz ki, quraşdırmanın ilk addımını atmaq üçün Docker Desktop proqramını (Mac və ya Windows üçün) yükləməlisiniz.

Docker Hub təxminən eynidir Github git depoları və ya reyestr üçün npm JavaScript paketləri üçün. Bu Docker şəkilləri üçün onlayn repozitordur. Docker Desktop-un qoşulduğu yer budur.

Beləliklə, Docker ilə işə başlamaq üçün iki şeyi etməlisiniz:

Bundan sonra, Docker versiyasını yoxlamaq üçün aşağıdakı əmri işlətməklə Docker CLI-nin işlədiyini yoxlaya bilərsiniz:

docker -v

Sonra, xahiş edildikdə istifadəçi adınızı və şifrənizi daxil edərək Docker Hub-a daxil olun:

docker login

Docker-dən istifadə etmək üçün siz şəkillər və konteynerlər anlayışlarını başa düşməlisiniz.

▍Şəkillər

Şəkil, konteynerin qurulması üçün təlimatları ehtiva edən bir növ plandır. Bu, fayl sisteminin və proqram parametrlərinin dəyişməz şəklidir. Tərtibatçılar şəkilləri asanlıqla paylaşa bilərlər.

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

Bu əmr aşağıdakı başlıqlı bir cədvəl çıxaracaq:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Sonra, eyni formatda əmrlərin bəzi nümunələrini nəzərdən keçirəcəyik - əvvəlcə şərhi olan bir əmr, sonra isə onun nə çıxara biləcəyinə dair bir nümunə var.

▍Konteynerlər

Konteyner proqramın icrası üçün lazım olan hər şeyi ehtiva edən icra edilə bilən paketdir. Bu yanaşma ilə tətbiq infrastrukturdan asılı olmayaraq həmişə eyni işləyəcək: təcrid olunmuş mühitdə və eyni mühitdə. Söhbət eyni təsvirin nümunələrinin müxtəlif mühitlərdə işə salınmasından gedir.

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

▍Teqlər

Etiket şəklin müəyyən bir versiyasının göstəricisidir.

▍Docker əmrləri üçün sürətli istinad

Budur, bəzi tez-tez istifadə olunan Docker əmrlərinin icmalı.

Komanda

Kontekst

effekt

docker qurmaq

Şəkil

Dockerfile-dən təsvirin qurulması

docker etiketi

Şəkil

Şəklin etiketlənməsi

docker şəkilləri

Şəkil

Şəkillərin siyahısı göstərilir

docker run

Konteyner

Şəkil əsaslı konteynerin işlədilməsi

docker push

Şəkil

Şəkilin Qeydiyyata Göndərilməsi

docker-çəkmək

Şəkil

Reyestrdən Şəkil Yüklənir

docker ps

Konteyner

Konteynerlərin siyahısı

docker sistemi prune

Şəkil/Konteyner

İstifadə edilməmiş qabların və şəkillərin çıxarılması

▍Docker faylı

Mən yerli istehsal proqramını necə işlətməyi bilirəm. Bitmiş React tətbiqini qurmaq üçün veb paket konfiqurasiyam var. Sonra, portda Node.js əsaslı serveri işə salan əmrim var 5000. Bu belə görünür:

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

Qeyd etmək lazımdır ki, bu material üçün nümunə ərizəm yoxdur. Ancaq burada təcrübələr üçün hər hansı sadə Node tətbiqi olacaq.

Konteynerdən istifadə etmək üçün Docker-ə təlimatlar verməli olacaqsınız. Bu adlı fayl vasitəsilə edilir Dockerfilelayihənin kök kataloqunda yerləşir. Bu fayl əvvəlcə olduqca anlaşılmaz görünür.

Lakin onun tərkibində olanlar yalnız xüsusi əmrlərdə iş mühitinin qurulması kimi bir şeyi təsvir edir. Bu əmrlərdən bəziləri:

  • DAN — Bu əmr faylı işə salır. Konteynerin qurulduğu əsas təsviri müəyyənləşdirir.
  • KOPYALA - Yerli mənbədən konteynerə faylların kopyalanması.
  • WORKDIR - Aşağıdakı əmrlər üçün işçi qovluğunun qurulması.
  • RUN - Əmrləri işə salın.
  • TƏSİR - Port parametrləri.
  • GİRİŞ NÖQTƏSİ — İcra ediləcək əmrin göstəricisi.

Dockerfile bu kimi bir şey görünə bilər:

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

Seçdiyiniz əsas təsvirdən asılı olaraq əlavə asılılıqlar quraşdırmalı ola bilərsiniz. Məsələ burasındadır ki, bəzi əsas təsvirlər (məsələn, Node Alpine Linux) mümkün qədər yığcam olmaq üçün hazırlanmışdır. Nəticə etibarı ilə, gözlədiyiniz proqramların bəzilərinə daxil olmaya bilər.

▍Konteynerin qurulması, etiketlənməsi və işlədilməsi

Konteynerin yerli montajı və işə salınmasından sonra biz var Dockerfiletapşırıqlar olduqca sadədir. Şəkili Docker Hub-a köçürməzdən əvvəl o, yerli olaraq sınaqdan keçirilməlidir.

▍Məclis

Əvvəlcə toplamaq lazımdır şəkil, adı və istəyə görə, teq (teq göstərilməyibsə, sistem avtomatik olaraq şəkilə teq təyin edəcək) latest).

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

Bu əmri yerinə yetirdikdən sonra Docker-in təsviri qurmasına baxa bilərsiniz.

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

Tikinti bir neçə dəqiqə çəkə bilər - hamısı nə qədər asılılığınızdan asılıdır. Quraşdırma tamamlandıqdan sonra əmri işlədə bilərsiniz docker images və yeni şəklinizin təsvirinə nəzər salın.

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

▍Başla

Şəkil yaradılıb. Və bu o deməkdir ki, onun əsasında bir konteyner işlədə bilərsiniz. Konteynerdə işləyən tətbiqə daxil olmaq istədiyim üçün localhost:5000, i, cütün sol tərəfində 5000:5000 aşağıdakı əmr dəstində 5000. Sağ tərəfdə konteyner portu var.

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

İndi konteyner yaradılmış və işlək vəziyyətdədir, siz əmrdən istifadə edə bilərsiniz docker ps bu konteyner haqqında məlumata baxmaq üçün (və ya əmrindən istifadə edə bilərsiniz docker ps -a, yalnız işləyənlər deyil, bütün konteynerlər haqqında məlumatı göstərir).

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

İndi getsən localhost:5000 - istehsal mühitində işləyən tətbiqin səhifəsi ilə tamamilə eyni görünən işləyən tətbiqin səhifəsini görə bilərsiniz.

▍Tag Təyinatı və Nəşr

İstehsal serverində yaradılmış şəkillərdən birini istifadə etmək üçün bu şəkli Docker Hub-dan endirməyi bacarmalıyıq. Bu o deməkdir ki, əvvəlcə Docker Hub-da layihə üçün repozitoriya yaratmalısınız. Bundan sonra şəkli göndərə biləcəyimiz bir yerimiz olacaq. Şəkilin adı dəyişdirilməlidir ki, onun adı bizim Docker Hub istifadəçi adı ilə başlasın. Bundan sonra deponun adı gəlməlidir. İstənilən etiket adın sonunda yerləşdirilə bilər. Aşağıda bu sxemə görə şəkillərin adlandırılması nümunəsi verilmişdir.

İndi təsviri ona təyin edilmiş yeni adla qura və əmri işlədə bilərsiniz docker push onu Docker Hub deposuna itələmək üçün.

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

Hər şey yaxşı olarsa, şəkil Docker Hub-da mövcud olacaq və asanlıqla serverə yüklənə və ya digər tərtibatçılarla paylaşıla bilər.

Sonrakı addımlar

İndiyə qədər biz Docker konteyneri şəklində tətbiqin yerli olaraq işlədiyini təsdiqləmişik. Konteyneri Docker Hub-a yüklədik. Bütün bunlar o deməkdir ki, biz artıq məqsədimizə doğru çox yaxşı irəliləyiş əldə etmişik. İndi daha iki sualı həll etməliyik:

  • Kodu sınamaq və yerləşdirmək üçün CI alətinin qurulması.
  • İstehsal serverinin kodumuzu endirib işlədə bilməsi üçün quraşdırmaq.

Bizim vəziyyətimizdə CI / CD həlli olaraq istifadə edirik Travis C.I.. Server kimi - DigitalOcean.

Qeyd etmək lazımdır ki, burada başqa bir xidmət kombinasiyasından istifadə edə bilərsiniz. Məsələn, Travis CI əvəzinə CircleCI və ya Github Actions-dan istifadə edə bilərsiniz. Və DigitalOcean əvəzinə - AWS və ya Linode.

Biz Travis CI ilə işləmək qərarına gəldik və mənim bu xidmətdə artıq bir şey qurmuşam. Buna görə də, indi onu işə necə hazırlamaq barədə qısaca danışacağam.

Travis C.I.

Travis CI kodu sınamaq və yerləşdirmək üçün bir vasitədir. Travis CI-nin qurulmasının təfərrüatlarına varmaq istəmirəm, çünki hər bir layihə unikaldır və çox faydası olmayacaq. Ancaq Travis CI-dən istifadə etmək qərarına gəlsəniz, sizə başlamaq üçün əsasları əhatə edəcəyəm. Seçdiyiniz nə olursa olsun - Travis CI, CircleCI, Jenkins və ya başqa bir şey, oxşar konfiqurasiya üsulları hər yerdə tətbiq olunacaq.

Travis CI ilə başlamaq üçün bura keçin sayt layihəsi və hesab yaradın. Sonra Travis CI-ni GitHub hesabınızla birləşdirin. Sistemi qurarkən, avtomatlaşdırmaq istədiyiniz deponu göstərməli və ona girişi təmin etməlisiniz. (Mən GitHub-dan istifadə edirəm, lakin əminəm ki, Travis CI BitBucket, GitLab və digər oxşar xidmətlərlə inteqrasiya edə bilər).

Travis CI hər dəfə işə salındıqda, konfiqurasiya faylında göstərilən əmrləri yerinə yetirən server işə salınır, o cümlədən repozitoriyanın müvafiq filiallarının yerləşdirilməsi.

▍İşin həyat dövrü

Travis CI konfiqurasiya faylı çağırıldı .travis.yml və layihənin kök kataloqunda saxlanılır, hadisələrin konsepsiyasını dəstəkləyir həyat dövrü tapşırıqlar. Budur hadisələr baş vermə ardıcıllığı ilə sadalanır:

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

▍Sınaq

Konfiqurasiya faylında mən yerli Travis CI serverini quracağam. Dil olaraq Node 12-ni seçdim və sistemə Docker-dən istifadə etmək üçün lazım olan asılılıqları quraşdırmağı söylədim.

Siyahıda olan hər şey .travis.yml, başqa cür göstərilmədiyi təqdirdə, deponun bütün filiallarına edilən bütün çəkmə sorğularında icra ediləcək. Bu faydalı xüsusiyyətdir, çünki biz depoya daxil olan bütün kodu test edə bilərik. Bu, kodun filiala yazılmağa hazır olub olmadığını bilməyə imkan verir. mastervə layihənin qurulması prosesini pozub-dağıdmayacağı. Bu qlobal konfiqurasiyada mən hər şeyi yerli olaraq quraşdırıram, Webpack dev serverini arxa planda işlədirəm (bu, mənim iş prosesimin xüsusiyyətidir) və testləri həyata keçirirəm.

Depozitinizin kod əhatə dairəsi nişanlarını göstərməsini istəyirsinizsə, burada siz bu məlumatı toplamaq və göstərmək üçün Jest, Travis CI və kombinezonlardan necə istifadə etmək barədə qısa təlimat tapa bilərsiniz.

Beləliklə, faylın məzmunu budur .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

Repozitoriyanın bütün filialları və çəkmə sorğuları üçün yerinə yetirilən hərəkətlər burada sona çatır.

▍Yerləşdirmə

Bütün avtomatlaşdırılmış testlərin uğurla başa çatdığı fərziyyəsinə əsaslanaraq, biz istəyə görə kodu istehsal serverinə yerləşdirə bilərik. Çünki biz bunu yalnız filial kodu üçün etmək istəyirik master, biz sistemə yerləşdirmə parametrlərində müvafiq təlimatları veririk. Layihənizdə növbəti nəzərdən keçirəcəyimiz kodu istifadə etməyə çalışmazdan əvvəl sizə xəbərdarlıq etmək istərdim ki, yerləşdirmə üçün çağırılan faktiki skriptiniz olmalıdır.

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

Yerləşdirmə skripti iki şeyi edir:

  • CI alətindən istifadə edərək şəklin qurulması, etiketlənməsi və Docker Hub-a göndərilməsi (bizim vəziyyətimizdə Travis CI-dir).
  • Şəklin serverə yüklənməsi, köhnə konteynerin dayandırılması və yenisinin işə salınması (bizim vəziyyətimizdə server DigitalOcean platformasında işləyir).

Əvvəlcə şəklin qurulması, etiketlənməsi və Docker Hub-a itələnməsi üçün avtomatik proses qurmalısınız. Bütün bunlar əl ilə etdiyimizə çox bənzəyir, istisna olmaqla, burada şəkillərə unikal teqlər təyin etmək və girişi avtomatlaşdırmaq üçün strategiya lazımdır. Yerləşdirmə skriptinin bəzi təfərrüatlarında, məsələn, etiketləmə strategiyası, daxil olmaq, SSH açarlarını kodlaşdırmaq, SSH bağlantısı qurmaqda çətinlik çəkdim. Amma xoşbəxtlikdən, mənim sevgilim bir çox başqa şeylər kimi, bash ilə də çox yaxşıdır. O, mənə bu ssenarini yazmağa kömək etdi.

Beləliklə, skriptin birinci hissəsi təsvirin Docker Hub-a göndərilməsidir. Bunu etmək olduqca sadədir. İstifadə etdiyim etiketləmə sxemi git hash və əgər varsa git teqinin birləşməsini nəzərdə tutur. Bu, etiketin unikal olmasını təmin edir və onun əsasında qurulan montajı müəyyən etməyi asanlaşdırır. DOCKER_USERNAME и DOCKER_PASSWORD Travis CI interfeysindən istifadə etməklə təyin edilə bilən istifadəçi tərəfindən müəyyən edilmiş mühit dəyişənləridir. Travis CI həssas məlumatları avtomatik emal edəcək ki, yanlış əllərə keçməsin.

Budur ssenarinin birinci hissəsi 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}

Skriptin ikinci hissəsinin nə olacağı tamamilə hansı hostdan istifadə etdiyinizdən və onunla əlaqənin necə təşkil olunduğundan asılıdır. Mənim vəziyyətimdə Digital Ocean istifadə etdiyim üçün əmrlər serverə qoşulmaq üçün istifadə olunur doctl. Aws ilə işləyərkən yardım proqramından istifadə olunacaq aws, və s.

Serveri qurmaq o qədər də çətin deyildi. Beləliklə, mən əsas təsvir əsasında bir damlacıq qurdum. Qeyd etmək lazımdır ki, mənim seçdiyim sistem Docker-in birdəfəlik əl ilə quraşdırılmasını və Docker-in birdəfəlik əl ilə işə salınmasını tələb edir. Docker-i quraşdırmaq üçün Ubuntu 18.04-dən istifadə etdim, buna görə də Ubuntu istifadə edirsinizsə, sadəcə izləyə bilərsiniz bu sadə rəhbərlik.

Mən burada xidmət üçün xüsusi əmrlərdən danışmıram, çünki bu cəhət müxtəlif hallarda çox fərqli ola bilər. SSH vasitəsilə layihənin yerləşdiriləcəyi serverə qoşulduqdan sonra yerinə yetiriləcək ümumi fəaliyyət planını verəcəyəm:

  • Hazırda işləyən konteyneri tapmaq və onu dayandırmaq lazımdır.
  • Sonra arxa planda yeni bir konteyner işə salmalısınız.
  • Siz serverin yerli portunu təyin etməlisiniz 80 - bu, formanın ünvanında sayta daxil olmağa imkan verəcək example.com, kimi bir ünvandan istifadə etmək əvəzinə, port göstərmədən example.com:5000.
  • Və nəhayət, bütün köhnə konteynerləri və şəkilləri çıxarmaq lazımdır.

Budur ssenarinin davamı.

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

Diqqət edilməli bəzi şeylər

Ola bilər ki, Travis CI-dən SSH vasitəsilə serverə qoşulduqda sistem istifadəçinin cavabını gözlədiyi üçün quraşdırmaya davam etməyə imkan verməyəcək bir xəbərdarlıq görəcəksiniz.

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

Mən öyrəndim ki, sətir açarı onu rahat və etibarlı şəkildə işlənə biləcəyi formada saxlamaq üçün base64-də kodlaşdırıla bilər. Quraşdırma mərhələsində siz açıq açarı deşifrə edib fayla yaza bilərsiniz known_hosts yuxarıdakı səhvdən xilas olmaq üçün.

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

Praktikada bu əmr belə görünə bilər:

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

Və burada verdiyi şey budur - base64 kodlu sətir:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Budur yuxarıda göstərilən əmr

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

Eyni yanaşma, əlaqə qurarkən şəxsi açarla istifadə edilə bilər, çünki serverə daxil olmaq üçün şəxsi açara ehtiyacınız ola bilər. Açarla işləyərkən yalnız onun Travis CI mühit dəyişənində təhlükəsiz şəkildə saxlanmasını və heç bir yerdə göstərilməməsini təmin etməlisiniz.

Diqqət yetirməli olan başqa bir şey odur ki, bütün yerləşdirmə skriptini tək sətir kimi, məsələn ilə işlətməlisiniz doctl. Bu, bəzi əlavə səy tələb edə bilər.

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

TLS/SSL və yük balansı

Yuxarıdakıların hamısını etdikdən sonra ən son problemim serverdə SSL olmaması idi. Mən məcbur etmək üçün Node.js serverindən istifadə etdiyim üçün tərs proxy Nginx və Let's Encrypt üçün çox şey etmək lazımdır.

Mən həqiqətən bütün bu SSL parametrlərini əl ilə etmək istəmirdim, ona görə də sadəcə yük balanslaşdırıcısı yaratdım və bu barədə məlumatı DNS-də qeyd etdim. Məsələn, DigitalOcean vəziyyətində, yük balanslaşdırıcısında avtomatik yenilənən öz imzalı sertifikat yaratmaq sadə, pulsuz və sürətli bir prosedurdur. Bu yanaşmanın əlavə faydası var ki, lazım gələrsə, yük balanslaşdırıcısının arxasında işləyən bir neçə serverdə SSL qurmağı çox asanlaşdırır. Bu, serverlərə SSL haqqında ümumiyyətlə "düşünməməyə", eyni zamanda həmişə olduğu kimi portdan istifadə etməyə imkan verir. 80. Beləliklə, SSL-i yük balanslaşdırıcısında konfiqurasiya etmək alternativ SSL konfiqurasiya üsullarından daha asan və daha rahatdır.

İndi serverdə daxil olan əlaqələri qəbul edən bütün portları bağlaya bilərsiniz - port istisna olmaqla 80, yük balanslaşdırıcısı və port ilə əlaqə yaratmaq üçün istifadə olunur 22 SSH üçün. Nəticədə, bu iki portdan başqa istənilən portda serverlə birbaşa əlaqə qurmaq cəhdi uğursuz olacaq.

Nəticələri

Bu məqalədə danışdığım hər şeyi etdikdən sonra nə Docker platforması, nə də avtomatlaşdırılmış CI/CD zəncirləri anlayışı artıq məni qorxutmadı. Mən davamlı inteqrasiya zənciri qura bildim, bu müddət ərzində kod istehsala başlamazdan əvvəl sınaqdan keçirilir və kod avtomatik olaraq serverə yerləşdirilir. Bütün bunlar mənim üçün hələ nisbətən yenidir və əminəm ki, mənim avtomatlaşdırılmış iş axınımı təkmilləşdirmək və onu daha səmərəli etmək yolları var. Beləliklə, bu barədə hər hansı bir fikriniz varsa - verin mən bilmək. Ümid edirəm ki, bu məqalə sizə səylərinizdə kömək etdi. İnanmaq istəyirəm ki, onu oxumaqla, mən orada söylədiyim hər şeylə məşğul olarkən mənim öyrəndiyim qədər çox şey öyrəndiniz.

PS В нашем bazar yeri görüntü var yükvuran, bir kliklə quraşdırılır. Konteynerlərin işini yoxlaya bilərsiniz VPS. Bütün yeni müştərilərə 3 gün pulsuz sınaq müddəti verilir.

Hörmətli oxucular! Layihələrinizdə CI/CD texnologiyalarından istifadə edirsinizmi?

CI / CD zəncirinin yaradılması və Docker ilə işin avtomatlaşdırılması

Mənbə: www.habr.com

Добавить комментарий