CI/CD тізбегін құру және Docker-пен жұмысты автоматтандыру

Мен алғашқы веб-сайттарымды 90-жылдардың аяғында жаздым. Ол кезде оларды жұмысқа орналастыру өте оңай болатын. Кейбір ортақ хостингте Apache сервері болды, сіз FTP арқылы осы серверге келесідей нәрсені жазу арқылы кіре аласыз ftp://ftp.example.com. Содан кейін атыңыз бен пароліңізді енгізіп, файлдарды серверге жүктеп салуыңыз керек болды. Әртүрлі уақыттар болды, ол кезде бәрі қазіргіден оңайырақ болды.

CI/CD тізбегін құру және Docker-пен жұмысты автоматтандыру

Содан бері екі онжылдықта бәрі қатты өзгерді. Веб-сайттар күрделене түсті, олар өндіріске шығарылмас бұрын жиналуы керек. Бір сервер жүк балансының артында жұмыс істейтін көптеген серверлерге айналды және нұсқаларды басқару жүйелерін пайдалану әдеттегідей болды.

Менің жеке жобам үшін менде арнайы конфигурация болды. Мен бір ғана әрекетті орындау арқылы сайтты өндірісте орналастыру мүмкіндігін қажет ететінін білдім: филиалға код жазу master GitHub сайтында. Сонымен қатар, мен кішкентай веб-қосымшаның жұмысын қамтамасыз ету үшін мен үлкен Kubernetes кластерін басқарғым келмейтінін немесе Docker Swarm технологиясын пайдаланғым келмейтінін немесе подкасттармен, агенттермен және басқалары бар серверлер паркін қолдамайтынымды білдім. күрделіліктер. Жұмысты барынша жеңілдету мақсатына жету үшін маған CI/CD-мен танысу керек болды.

Егер сізде шағын жоба (бұл жағдайда, Node.js жобасы) болса және репозиторийде сақталған нәрсе өндірісте жұмыс істейтін нәрсеге дәл сәйкес келетініне көз жеткізе отырып, осы жобаны орналастыруды қалай автоматтандыру керектігін білгіңіз келсе, мен бұл мақала сізді қызықтыруы мүмкін деп ойлаймын.

Пререквизиттер

Бұл мақаланың оқырманы командалық жол және Bash сценарийлерін жазу туралы негізгі түсінікке ие болады деп күтілуде. Сонымен қатар, оған есепшоттар қажет болады Travis CI и Докер хабы.

Мақсаттары

Мен бұл мақаланы сөзсіз «оқулық» деп атауға болады деп айтпаймын. Бұл менің үйренгенім туралы айтатын және бір автоматтандырылған өтуде орындалатын кодты сынау және өндіріске енгізу үшін маған қолайлы процесті сипаттайтын құжат.

Менің жұмыс үрдісім осылай аяқталды.

Басқа кез келген репозиторий тармағына жарияланған код үшін master, келесі әрекеттер орындалады:

  • Travis CI негізіндегі жобаны құрастыру басталады.
  • Барлық блок, интеграция және түпкілікті сынақтар орындалады.

Тек ішіне түсетін код үшін master, мыналар орындалады:

  • Жоғарыда айтылғандардың барлығы, сонымен қатар ...
  • Ағымдағы кодқа, параметрлерге және ортаға негізделген Docker кескінін құру.
  • Кескінді Docker хабына орналастыру.
  • Өндіріс серверіне қосылу.
  • Docker Hub серверінен кескінді жүктеп салу.
  • Ағымдағы контейнерді тоқтату және жаңа сурет негізінде жаңасын бастау.

Docker, кескіндер және контейнерлер туралы мүлдем ештеңе білмесеңіз, алаңдамаңыз. Мен сізге бәрін айтып беремін.

CI/CD дегеніміз не?

CI/CD аббревиатурасы «үздіксіз интеграция/үздіксіз орналастыру» дегенді білдіреді.

▍Үздіксіз интеграция

Үздіксіз интеграция – әзірлеушілер жобаның негізгі бастапқы код репозиторийіне (әдетте филиал) міндеттеме беретін процесс. master). Бұл ретте кодтың сапасы автоматтандырылған тестілеу арқылы қамтамасыз етіледі.

▍Үздіксіз орналастыру

Үздіксіз орналастыру - кодты өндіріске жиі, автоматтандырылған орналастыру. CI/CD аббревиатурасының екінші бөлігі кейде «үздіксіз жеткізу» деп жазылады. Бұл негізінен «үздіксіз орналастыру» сияқты, бірақ «үздіксіз жеткізу» жобаны енгізу процесін бастамас бұрын өзгерістерді қолмен растау қажеттілігін білдіреді.

Жұмысты бастау

Осының бәрін үйренетін қолданба деп аталады Ескерту. Бұл мен жұмыс істеп жатқан веб-жоба, жазбалар жасауға арналған. Басында жасауға тырыстым JAMStack- жоба немесе ол ұсынатын стандартты хостинг пен жобаны орналастыру мүмкіндіктерін пайдалану үшін сервері жоқ жай ғана фронтальды қолданба Netlify. Қолданбаның күрделілігі артқан сайын, мен оның серверлік бөлігін жасауым керек болды, бұл мен автоматтандырылған интеграция және жобаны автоматтандырылған орналастыру үшін өз стратегиямды тұжырымдауым керек екенін білдірді.

Менің жағдайда қолданба Node.js ортасында жұмыс істейтін, бір беттік React қолданбасына қызмет көрсететін және қауіпсіз серверлік API интерфейсін қолдайтын экспресс сервер болып табылады. Бұл архитектура мына жерден табуға болатын стратегияға сәйкес келеді осы Толық стек аутентификация нұсқаулығы.

мен ақылдадым другом, ол автоматтандыру бойынша сарапшы болып табылады және оның барлығы мен қалағандай жұмыс істеуі үшін не істеуім керектігін сұрады. Ол маған осы мақаланың Мақсаттар бөлімінде көрсетілген автоматтандырылған жұмыс процесі қандай болуы керектігі туралы түсінік берді. Осы мақсаттарға ие болу маған Docker-ді қалай пайдалану керектігін анықтау керек дегенді білдірді.

Докер

Docker - контейнерлеу технологиясының арқасында Docker платформасының өзі әртүрлі орталарда жұмыс істесе де, қолданбаларды бір ортада оңай таратуға, орналастыруға және іске қосуға мүмкіндік беретін құрал. Біріншіден, маған Docker пәрмен жолы құралдарына (CLI) қол жеткізу керек болды. Нұсқаулық Docker орнату нұсқаулығын өте анық және түсінікті деп атауға болмайды, бірақ одан сіз бірінші орнату қадамын жасау үшін Docker Desktop бағдарламасын (Mac немесе Windows үшін) жүктеп алу қажет екенін біле аласыз.

Docker Hub шамамен бірдей нәрсе GitHub git репозиторийлері немесе тізілім үшін npm JavaScript бумалары үшін. Бұл Docker кескіндеріне арналған онлайн репозиторий. Docker Desktop осыған қосылады.

Сонымен, Docker-пен жұмыс істеуді бастау үшін екі нәрсені істеу керек:

Осыдан кейін Docker нұсқасын тексеру үшін келесі пәрменді орындау арқылы Docker CLI жұмыс істеп тұрғанын тексеруге болады:

docker -v

Содан кейін сұралғанда пайдаланушы аты мен құпия сөзді енгізу арқылы Docker Hub жүйесіне кіріңіз:

docker login

Docker пайдалану үшін кескіндер мен контейнерлер ұғымдарын түсіну керек.

▍Суреттер

Кескін - бұл контейнерді жинауға арналған нұсқауларды қамтитын сызба сияқты нәрсе. Бұл қолданбаның файлдық жүйесі мен параметрлерінің өзгермейтін суреті. Әзірлеушілер суреттерді оңай бөлісе алады.

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

Бұл пәрмен келесі тақырыппен кестені шығарады:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Әрі қарай біз бір пішімдегі пәрмендердің кейбір мысалдарын қарастырамыз - алдымен түсініктемесі бар команда бар, содан кейін оның шығара алатын мысалы.

▍Контейнерлер

Контейнер – қолданбаны іске қосу үшін қажеттінің барлығын қамтитын орындалатын бума. Бұл тәсілмен қолданба инфрақұрылымға қарамастан әрқашан бірдей жұмыс істейді: оқшауланған ортада және бір ортада. Мәселе мынада, бір кескіннің даналары әртүрлі орталарда іске қосылады.

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

▍Тегтер

Тег - кескіннің белгілі бір нұсқасының көрсеткіші.

▍Docker командаларына жылдам сілтеме

Міне, кейбір жиі қолданылатын Docker пәрмендеріне шолу.

команда

Контекст

әсер

докер құрастыру

Сурет

Docker файлынан кескін құру

докер тегі

Сурет

Суретті тегтеу

docker кескіндері

Сурет

Суреттерді тізімдеу

докер жұмыс істейді

Контейнер

Суретке негізделген контейнерді іске қосу

докерді басу

Сурет

Суретті тізілімге жүктеп салу

докер тарту

Сурет

Тіркеуден сурет жүктелуде

docker ps

Контейнер

Контейнерлердің тізімі

докер жүйесі prune

Сурет/контейнер

Пайдаланылмаған контейнерлер мен кескіндерді жою

▍Докер файлы

Мен жергілікті жерде өндірістік қолданбаны қалай іске қосу керектігін білемін. Менде дайын React қосымшасын құруға арналған Webpack конфигурациясы бар. Содан кейін портта Node.js негізіндегі серверді іске қосатын пәрменім бар 5000. Бұл келесідей көрінеді:

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

Айта кету керек, менде бұл материалға мысал қолданбасы жоқ. Бірақ мұнда эксперименттер үшін кез келген қарапайым Node қолданбасы орындалады.

Контейнерді пайдалану үшін Docker-ке нұсқаулар беру керек. Бұл файл деп аталатын файл арқылы жасалады Dockerfile, жобаның түбірлік каталогында орналасқан. Бұл файл, біріншіден, түсініксіз болып көрінеді.

Бірақ ол тек арнайы командалармен жұмыс ортасын орнатуға ұқсас нәрсені сипаттайды. Міне, осы командалардың кейбірі:

  • FROM — Бұл пәрмен файлды бастайды. Ол контейнер салынған негізгі кескінді көрсетеді.
  • COPY — Файлдарды жергілікті көзден контейнерге көшіру.
  • WORKDIR — Келесі командалар үшін жұмыс каталогын орнату.
  • RUN - Пәрмендерді орындау.
  • ТАҢДАУ — Порт параметрлері.
  • КІРУ НҮКТЕГІ — Орындалатын команданы көрсету.

Dockerfile келесідей көрінуі мүмкін:

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

Сіз таңдаған негізгі кескінге байланысты қосымша тәуелділіктерді орнату қажет болуы мүмкін. Кейбір негізгі кескіндер (мысалы, Node Alpine Linux) оларды мүмкіндігінше ықшамдау мақсатында жасалған. Нәтижесінде оларда сіз күткен кейбір бағдарламалар болмауы мүмкін.

▍Контейнерді құру, белгілеу және іске қосу

Контейнерді жергілікті құрастыру және іске қосу бізде болғаннан кейін Dockerfile, тапсырмалар өте қарапайым. Кескінді Docker Hub жүйесіне баспас бұрын, оны жергілікті түрде тексеру керек.

▍Құрастыру

Алдымен жинау керек сурет, атауды және міндетті түрде тегті көрсету (егер тег көрсетілмесе, жүйе кескінге автоматты түрде тегті тағайындайды latest).

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

Осы пәрменді іске қосқаннан кейін сіз Docker қолданбасының кескінді құруын көре аласыз.

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

Құрастыру бірнеше минутқа созылуы мүмкін - бәрі сізде қанша тәуелділік бар екеніне байланысты. Құрастыру аяқталғаннан кейін пәрменді іске қосуға болады docker images және жаңа суретіңіздің сипаттамасын қараңыз.

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

▍Іске қосу

Сурет жасалды. Бұл оның негізінде контейнерді іске қосуға болатындығын білдіреді. Себебі мен контейнерде жұмыс істейтін қолданбаға қол жеткізе алғым келеді localhost:5000, мен, жұптың сол жағында 5000:5000 орнатылған келесі пәрменде 5000. Оң жағында контейнер порты орналасқан.

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

Енді контейнер жасалып, іске қосылғаннан кейін пәрменді пайдалануға болады docker ps осы контейнер туралы ақпаратты қарау үшін (немесе пәрменін пайдалануға болады docker ps -a, ол тек іске қосылғандар ғана емес, барлық контейнерлер туралы ақпаратты көрсетеді).

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

Егер сіз қазір мекенжайға өтсеңіз localhost:5000 — өндірістік ортада жұмыс істейтін қолданбаның бетімен бірдей көрінетін іске қосылған қолданбаның бетін көруге болады.

▍Белгілеу және жариялау

Өндіріс серверінде жасалған кескіндердің бірін пайдалану үшін біз бұл кескінді Docker Hub жүйесінен жүктеп алуымыз керек. Бұл алдымен Docker Hub жүйесінде жоба үшін репозиторий жасау керек дегенді білдіреді. Осыдан кейін бізде суретті жіберетін орын болады. Кескіннің атын Docker Hub пайдаланушы атымен басталатын етіп өзгерту керек. Осыдан кейін репозиторий атауы жазылуы керек. Кез келген тегті аттың соңына қоюға болады. Төменде осы схеманы қолданып суреттерге атау беру мысалы келтірілген.

Енді суретті жаңа атпен құрастырып, пәрменді орындауға болады docker push оны 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

Егер бәрі ойдағыдай болса, кескін Docker Hub жүйесінде қолжетімді болады және оны серверге оңай жүктеп салуға немесе басқа әзірлеушілерге жіберуге болады.

Келесі қадамдар

Қазір біз Docker контейнері түріндегі қолданбаның жергілікті түрде жұмыс істеп тұрғанын тексердік. Біз контейнерді Docker Hub жүйесіне жүктеп салдық. Мұның бәрі біздің алға қойған мақсатқа жетуде өте жақсы жетістіктерге жеткенімізді білдіреді. Енді бізге тағы екі сұрақты шешу керек:

  • Кодты сынау және қолдану үшін CI құралын орнату.
  • Өндіріс серверін біздің кодты жүктеп алып, іске қоса алатындай етіп орнату.

Біздің жағдайда біз қолданамыз Travis CI. Сервер ретінде - Дитигал мұхиты.

Айта кету керек, мұнда сіз басқа қызметтер комбинациясын пайдалана аласыз. Мысалы, Travis CI орнына CircleCI немесе Github әрекеттерін пайдалануға болады. Ал DigitalOcean орнына - AWS немесе Linode.

Біз Travis CI-мен жұмыс істеуді шештік, менде бұл қызметте конфигурацияланған нәрсе бар. Сондықтан, қазір мен оны жұмысқа қалай дайындау керектігі туралы қысқаша айтып беремін.

Travis CI

Travis CI — кодты сынауға және орналастыруға арналған құрал. Мен Travis CI орнатудың қыр-сырына тоқталғым келмейді, өйткені әрбір жоба бірегей және бұл көп пайда әкелмейді. Бірақ Travis CI пайдалануды шешсеңіз, сізге бастау үшін негіздерді қарастырамын. Travis CI, CircleCI, Jenkins немесе басқасын таңдайсыз ба, ұқсас конфигурация әдістері барлық жерде пайдаланылады.

Travis CI қолданбасын бастау үшін мына сайтқа өтіңіз сайт жобасы және тіркелгі жасаңыз. Содан кейін Travis CI жүйесін GitHub тіркелгіңізбен біріктіріңіз. Жүйені баптау кезінде жұмысты автоматтандырғыңыз келетін репозиторийді көрсету және оған қол жеткізуді қосу қажет. (Мен GitHub пайдаланамын, бірақ Travis CI BitBucket, GitLab және басқа ұқсас қызметтермен біріктіре алатынына сенімдімін).

Travis CI іске қосылған сайын сервер конфигурация файлында көрсетілген пәрмендерді орындау, соның ішінде сәйкес репозиторий тармақтарын орналастыру арқылы іске қосылады.

▍Жұмыстың өмірлік циклі

Travis CI конфигурация файлы шақырылды .travis.yml және жобаның түбірлік каталогында сақталады, оқиғалар тұжырымдамасын қолдайды өміршеңдік кезең тапсырмалар. Бұл оқиғалар орын алу ретімен берілген:

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

▍Тестілеу

Конфигурация файлында мен жергілікті Travis CI серверін конфигурациялаймын. Мен 12 түйінді тіл ретінде таңдадым және жүйеге Docker пайдалану үшін қажетті тәуелділіктерді орнатуды айттым.

Тізімде көрсетілгеннің бәрі .travis.yml, егер басқаша көрсетілмесе, барлық тарту сұраулары репозиторийдің барлық тармақтарына жасалған кезде орындалады. Бұл пайдалы мүмкіндік, себебі бұл репозиторийге келетін барлық кодты тексере алатынымызды білдіреді. Бұл кодтың филиалға жазылуға дайын екенін білуге ​​мүмкіндік береді. master, және ол жобаны құру процесін бұза ма. Осы жаһандық конфигурацияда мен бәрін жергілікті түрде орнатамын, Webpack dev серверін фондық режимде іске қосамын (бұл менің жұмыс үрдісімнің мүмкіндігі) және сынақтарды іске қосамын.

Егер сіз репозиторийіңізде сынақты қамтитын белгілерді көрсетуін қаласаңыз, осында Бұл ақпаратты жинау және көрсету үшін Jest, Travis CI және комбинезондарды пайдалану туралы қысқаша нұсқауларды таба аласыз.

Міне, файлдың мазмұны .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

Осы жерде репозиторийдің барлық тармақтары мен тарту сұраулары үшін орындалатын әрекеттер аяқталады.

▍Орналастыру

Барлық автоматтандырылған сынақтар сәтті аяқталды деген болжамға сүйене отырып, біз кодты өндіріс серверіне орналастыра аламыз, бұл міндетті емес. Өйткені біз мұны тек филиалдың коды үшін жасағымыз келеді master, біз жүйеге орналастыру параметрлерінде сәйкес нұсқаулар береміз. Жобаңызда келесіде қарастыратын кодты қолданбас бұрын, сізде орналастыруға шақырылған нақты сценарий болуы керек екенін ескерткім келеді.

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

Орналастыру сценарийі екі мәселені шешеді:

  • CI құралын (біздің жағдайда Travis CI) пайдаланып кескінді құрастырыңыз, белгілеңіз және Docker Hub жүйесіне жіберіңіз.
  • Кескінді серверге жүктеу, ескі контейнерді тоқтату және жаңасын бастау (біздің жағдайда сервер DigitalOcean платформасында жұмыс істейді).

Алдымен, кескінді Docker Hub жүйесіне құру, белгілеу және итеру үшін автоматты процесті орнату керек. Мұның бәрі біз қолмен жасаған нәрсеге өте ұқсас, тек бізге суреттерге бірегей тегтерді тағайындау және логиндерді автоматтандыру стратегиясы қажет. Мен тегтеу стратегиясы, логин, SSH кілтін кодтау, SSH қосылымын орнату сияқты орналастыру сценарийінің кейбір мәліметтерімен қиындықтарға тап болдым. Бақытымызға орай, менің жігітім басқа нәрселер сияқты, баспен өте жақсы. Ол маған осы сценарийді жазуға көмектесті.

Сонымен, сценарийдің бірінші бөлігі кескінді Docker Hub жүйесіне жүктеп салу болып табылады. Мұны істеу өте оңай. Мен пайдаланған тегтеу схемасы, егер бар болса, git хэш пен git тегін біріктіруді қамтиды. Бұл тегтің бірегей екендігіне кепілдік береді және ол негізделген жинақты анықтауды жеңілдетеді. DOCKER_USERNAME и DOCKER_PASSWORD Travis CI интерфейсі арқылы орнатуға болатын пайдаланушы ортасының айнымалы мәндері. Travis CI құпия деректерді автоматты түрде өңдейді, осылайша олар дұрыс емес қолдарға түседі.

Міне, сценарийдің бірінші бөлімі 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}

Сценарийдің екінші бөлігі қандай болатыны толығымен сіз қандай хостты пайдаланып жатқаныңызға және оған қосылу қалай ұйымдастырылғанына байланысты. Менің жағдайда, мен Digital Ocean қолданбасын пайдаланғандықтан, серверге қосылу үшін пәрмендерді қолданамын doctl. AWS-пен жұмыс істегенде қызметтік бағдарлама пайдаланылады aws, тағыда басқа.

Серверді орнату аса қиын болған жоқ. Сонымен, мен негізгі кескінге негізделген тамшыны орнаттым. Айта кету керек, мен таңдаған жүйе Docker қолданбасын бір реттік қолмен орнатуды және Docker қолданбасын бір рет қолмен іске қосуды қажет етеді. Мен Ubuntu 18.04 нұсқасын Docker орнату үшін қолдандым, сондықтан егер сіз де сол әрекетті орындау үшін Ubuntu қолдансаңыз, жай ғана орындай аласыз. бұл қарапайым нұсқаулық.

Мен бұл жерде қызметке арналған арнайы пәрмендер туралы айтып отырған жоқпын, өйткені бұл аспект әртүрлі жағдайларда айтарлықтай өзгеруі мүмкін. Мен SSH арқылы жоба орналастырылатын серверге қосылғаннан кейін орындалатын әрекеттердің жалпы жоспарын беремін:

  • Біз қазір жұмыс істеп тұрған контейнерді тауып, оны тоқтатуымыз керек.
  • Содан кейін фондық режимде жаңа контейнерді іске қосу керек.
  • Сервердің жергілікті портын орнату керек 80 - бұл сізге сайтқа келесі мекенжай бойынша кіруге мүмкіндік береді example.com, сияқты мекенжайды пайдаланудың орнына портты көрсетпей example.com:5000.
  • Соңында, барлық ескі контейнерлер мен суреттерді жою керек.

Міне, сценарийдің жалғасы.

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

Кейбір нәрселерге назар аудару керек

Travis CI серверінен SSH арқылы серверге қосылған кезде жүйе пайдаланушының жауабын күтетіндіктен орнатуды жалғастыруға кедергі болатын ескертуді көресіз.

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

Мен жол кілтін онымен ыңғайлы және сенімді жұмыс істеуге болатын пішінде сақтау үшін base64 жүйесінде кодтауға болатынын білдім. Орнату сатысында сіз ашық кілтті декодтап, оны файлға жаза аласыз known_hosts жоғарыдағы қатеден құтылу үшін.

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

Іс жүзінде бұл команда келесідей болуы мүмкін:

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

Міне, ол шығарады - base64 кодталған жол:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Міне, жоғарыда айтылған пәрмен

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

Дәл осындай тәсілді қосылымды орнату кезінде жеке кілтпен пайдалануға болады, себебі серверге кіру үшін жеке кілт қажет болуы мүмкін. Кілтпен жұмыс істегенде, оның Travis CI ортасының айнымалы мәнінде қауіпсіз сақталғанына және еш жерде көрсетілмейтініне көз жеткізу керек.

Тағы бір ескеретін жайт, бүкіл орналастыру сценарийін бір жол ретінде іске қосу қажет болуы мүмкін, мысалы - бірге doctl. Бұл қосымша күш салуды қажет етуі мүмкін.

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

TLS/SSL және Load Balancing

Жоғарыда айтылғандардың барлығын орындағаннан кейін, мен кездескен соңғы мәселе серверде SSL жоқ. Мен Node.js серверін қолданатындықтан, мәжбүрлеу үшін жұмыс кері прокси Nginx және Let's Encrypt, сізге көп нәрсені жасау керек.

Мен шынымен де осы SSL конфигурациясын қолмен орындағым келмеді, сондықтан мен жай ғана жүктеме балансын жасап, оның мәліметтерін DNS жүйесіне жаздым. DigitalOcean жағдайында, мысалы, жүктеме балансында автоматты түрде жаңартылатын өздігінен қол қойылған сертификатты жасау қарапайым, тегін және жылдам процедура болып табылады. Бұл тәсілдің қосымша артықшылығы бар, ол қажет болған жағдайда жүктеме балансының артында жұмыс істейтін бірнеше серверлерде SSL орнатуды өте жеңілдетеді. Бұл серверлерге SSL туралы мүлде «ойламауға» мүмкіндік береді, бірақ сонымен бірге портты әдеттегідей пайдалануға мүмкіндік береді. 80. Сондықтан SSL теңдестіргішінде SSL орнату SSL орнатудың балама әдістеріне қарағанда әлдеқайда оңай және ыңғайлы.

Енді кіріс қосылымдарды қабылдайтын сервердегі порттан басқа барлық порттарды жабуға болады 80, жүк теңестірушімен және портпен байланысу үшін пайдаланылады 22 SSH үшін. Нәтижесінде осы екеуінен басқа кез келген порттағы серверге тікелей кіру әрекеті сәтсіз аяқталады.

Нәтижелері

Мен осы материалда айтқанымның барлығын орындағаннан кейін, Docker платформасы да, автоматтандырылған CI/CD тізбектерінің тұжырымдамалары да мені қорқытты. Мен үздіксіз интеграция тізбегін орната алдым, оның барысында код өндіріске енгізілмес бұрын сыналады және код серверде автоматты түрде орналастырылады. Мұның бәрі мен үшін әлі салыстырмалы түрде жаңа және менің автоматтандырылған жұмыс процесін жақсарту және оны тиімдірек ету жолдары бар екеніне сенімдімін. Сондықтан бұл мәселе бойынша қандай да бір идеяларыңыз болса, маған хабарлаңыз. мені білу. Бұл мақала сіздің талпыныстарыңызға көмектесті деп үміттенемін. Мен оны оқығаннан кейін сіз мен айтқан нәрселердің барлығын анықтай отырып, мен білгендей көп нәрсені білдіңіз деп сенгім келеді.

PS Біздің базар бейнесі бар Докер, оны бір рет басу арқылы орнатуға болады. Контейнерлердің жұмысын мына жерден тексеруге болады VPS. Барлық жаңа клиенттерге 3 күндік тестілеу тегін беріледі.

Құрметті оқырмандар! Сіз жобаларыңызда CI/CD технологияларын қолданасыз ба?

CI/CD тізбегін құру және Docker-пен жұмысты автоматтандыру

Ақпарат көзі: www.habr.com

пікір қалдыру