CI/CD сүлжээ үүсгэж, Docker-тэй ажиллах ажлыг автоматжуулах

Би анхны вэбсайтуудаа 90-ээд оны сүүлээр бичсэн. Тэр үед тэдгээрийг ажиллуулахад маш хялбар байсан. Зарим хуваалцсан хостинг дээр Apache сервер байсан, та FTP-ээр дамжуулан энэ серверт иймэрхүү зүйл бичээд нэвтэрч болно ftp://ftp.example.com. Дараа нь та нэр, нууц үгээ оруулаад файлуудаа серверт байршуулах ёстой. Өөр өөр цаг үе байсан, тэр үед бүх зүйл одоогийнхоос илүү хялбар байсан.

CI/CD сүлжээ үүсгэж, Docker-тэй ажиллах ажлыг автоматжуулах

Түүнээс хойш хорин жилийн хугацаанд бүх зүйл маш их өөрчлөгдсөн. Вэбсайтууд илүү төвөгтэй болсон тул тэдгээрийг үйлдвэрлэхээс өмнө угсарсан байх ёстой. Нэг сервер ачаалал тэнцвэржүүлэгчийн ард ажилладаг олон серверүүд болж, хувилбарын хяналтын системийг ашиглах нь энгийн үзэгдэл болжээ.

Миний хувийн төслийн хувьд би тусгай тохиргоотой байсан. Салбар руу код бичих гэсэн ганц л үйлдлийг хийснээр сайтыг үйлдвэрлэлд нэвтрүүлэх чадвар хэрэгтэй гэдгийг би мэдэж байсан. master GitHub дээр. Нэмж дурдахад би жижиг вэб программынхаа ажиллагааг хангахын тулд асар том Kubernetes кластерыг удирдах, Docker Swarm технологийг ашиглах, эсвэл pods, agents болон бусад бүх төрлийн серверүүдийг хадгалахыг хүсэхгүй байгаагаа мэдэж байсан. нарийн төвөгтэй байдал. Ажлыг аль болох хялбар болгох зорилгодоо хүрэхийн тулд би CI/CD-тэй танилцах хэрэгтэй болсон.

Хэрэв танд жижиг төсөл (энэ тохиолдолд Node.js төсөл) байгаа бөгөөд репозиторт хадгалагдаж байгаа зүйл нь үйлдвэрлэлд ажиллаж байгаа зүйлтэй яг таарч байгаа эсэхийг баталгаажуулахын зэрэгцээ энэ төслийг хэрхэн автоматжуулах талаар мэдэхийг хүсвэл би Та энэ нийтлэлийг сонирхож магадгүй гэж бодож байна.

Урьдчилсан нөхцөл

Энэ нийтлэлийг уншигчид командын мөр болон Bash скрипт бичих талаар үндсэн ойлголттой байх ёстой. Үүнээс гадна түүнд данс хэрэгтэй болно Травис CI и Докерын төв.

Зорилтууд

Энэ нийтлэлийг болзолгүйгээр "заавар" гэж нэрлэж болно гэж би хэлэхгүй. Энэ бол би сурсан зүйлийнхээ талаар ярьж, нэг автомат дамжуулалтаар хийгдсэн кодыг турших, үйлдвэрлэлд нэвтрүүлэхэд надад тохирох үйл явцыг тайлбарласан баримт бичиг юм.

Миний ажлын урсгал ийм л болсон.

Бусад хадгалах сангийн аль ч салбарт байршуулсан кодын хувьд master, дараах үйлдлүүдийг гүйцэтгэнэ.

  • Travis CI дээр суурилсан төсөл эхэлж байна.
  • Бүх нэгж, интеграци, төгсгөлийн туршилтыг гүйцэтгэдэг.

Зөвхөн тухайн кодонд зориулагдсан master, дараах үйлдлийг гүйцэтгэнэ.

  • Дээр дурдсан бүх зүйл, дээр нь ...
  • Одоогийн код, тохиргоо, орчинд үндэслэн Docker дүрсийг бүтээх.
  • Зургийг Docker Hub-д байрлуулж байна.
  • Үйлдвэрлэлийн сервертэй холбогдох.
  • Docker Hub-аас серверт зураг байршуулж байна.
  • Одоогийн савыг зогсоож, шинэ зураг дээр үндэслэн шинээр эхлүүлэх.

Хэрэв та Docker, зураг, контейнерийн талаар огт мэдэхгүй бол санаа зовох хэрэггүй. Би чамд энэ бүгдийг хэлье.

CI/CD гэж юу вэ?

CI/CD товчлол нь "тасралтгүй нэгтгэх/тасралтгүй байршуулах" гэсэн утгатай.

▍Тасралтгүй нэгтгэх

Тасралтгүй интеграци гэдэг нь хөгжүүлэгчид төслийн үндсэн эх кодын агуулах (ихэвчлэн салбар)-д амлалт өгөх үйл явц юм. master). Үүний зэрэгцээ кодын чанарыг автоматжуулсан туршилтаар баталгаажуулдаг.

▍Тасралтгүй байршуулалт

Тасралтгүй байршуулалт гэдэг нь кодыг үйлдвэрлэлд ойр ойрхон автоматаар байршуулах явдал юм. CI/CD товчлолын хоёр дахь хэсгийг заримдаа "тасралтгүй хүргэх" гэж бичдэг. Энэ нь үндсэндээ "тасралтгүй байршуулалт"-тай ижил боловч "тасралтгүй хүргэлт" нь төслийг хэрэгжүүлэх процессыг эхлүүлэхийн өмнө өөрчлөлтийг гараар баталгаажуулах шаардлагатай гэсэн үг юм.

Эхлэл

Энэ бүгдийг сурдаг байсан программыг маань гэдэг Тэмдэглэл авах. Энэ бол тэмдэглэл хөтлөхөд зориулагдсан миний ажиллаж байгаа вэб төсөл юм. Эхлээд би хийх гэж оролдсон JAMStack-Төсөл, эсвэл сервергүй зүгээр л урд талын программыг санал болгож буй стандарт байршуулах, төсөл байршуулах боломжуудыг ашиглахын тулд. Цэвэршүүлэх. Програмын нарийн төвөгтэй байдал нэмэгдэхийн хэрээр би түүний серверийн хэсгийг үүсгэх шаардлагатай болсон бөгөөд энэ нь би төслийг автоматжуулсан интеграци болон автоматжуулсан байршуулалтын стратегийг боловсруулах шаардлагатай гэсэн үг юм.

Миний хувьд энэ програм нь Node.js орчинд ажилладаг Экспресс сервер бөгөөд нэг хуудастай React програмд ​​үйлчилж, сервер талын аюулгүй API-г дэмждэг. Энэхүү архитектур нь олж болох стратегийг дагаж мөрддөг энэ Бүрэн стекийн баталгаажуулалтын гарын авлага.

-тай зөвлөлдсөн найз, автоматжуулалтын мэргэжилтэн бөгөөд бүх зүйлийг миний хүссэнээр ажиллуулахын тулд юу хийх хэрэгтэйг түүнээс асуув. Тэрээр энэ нийтлэлийн Зорилго хэсэгт дурдсан автоматжуулсан ажлын урсгал ямар байх ёстойг надад өгсөн. Эдгээр зорилгууд нь надад Docker-ийг хэрхэн ашиглах талаар олж мэдэх шаардлагатай гэсэн үг юм.

Docker

Docker нь контейнержуулалтын технологийн ачаар Docker платформ өөрөө өөр орчинд ажилладаг байсан ч програмуудыг хялбархан тарааж, байршуулж, ижил орчинд ажиллуулах боломжийг олгодог хэрэгсэл юм. Эхлээд би Docker командын шугамын хэрэгслүүдийг (CLI) ашиглах хэрэгтэй болсон. заавар Docker суулгах гарын авлагыг маш тодорхой бөгөөд ойлгомжтой гэж нэрлэх боломжгүй ч суулгацын эхний алхамыг хийхийн тулд Docker Desktop (Mac эсвэл Windows-д зориулсан) татаж авах хэрэгтэйг эндээс мэдэж болно.

Docker Hub нь ойролцоогоор ижил зүйл юм GitHub git репозиторууд эсвэл бүртгэлийн хувьд npm JavaScript багцуудад зориулсан. Энэ бол Docker зургийн онлайн репозитор юм. Энэ бол Docker Desktop-тэй холбогддог.

Тиймээс, Docker-тэй ажиллахын тулд та хоёр зүйлийг хийх хэрэгтэй:

Үүний дараа та Docker CLI ажиллаж байгаа эсэхийг дараах тушаалыг ажиллуулж Docker хувилбарыг шалгах боломжтой.

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 командуудын тоймыг энд оруулав.

баг

Агуулга

үр нөлөө

докер бүтээх

Зураг

Dockerfile-аас зураг бүтээх

докер шошго

Зураг

Зургийн шошго

боомтын зургууд

Зураг

Жагсаалтын зургууд

боомтын гүйгч

Контейнер

Зураг дээр тулгуурлан контейнер ажиллуулж байна

докер түлхэх

Зураг

Бүртгэлд зураг байршуулж байна

докер татах

Зураг

Бүртгэлээс зураг ачаалж байна

docker ps

Контейнер

Жагсаалтын сав

docker system prune

Зураг/Сав

Ашиглагдаагүй сав, зургийг арилгах

▍Докер файл

Би үйлдвэрлэлийн програмыг дотооддоо хэрхэн ажиллуулахаа мэддэг. Би бэлэн React програмыг бүтээхэд зориулагдсан Webpack тохиргоотой. Дараа нь би порт дээр Node.js дээр суурилсан серверийг эхлүүлэх тушаал байна 5000. Энэ нь дараах байдалтай харагдаж байна.

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

Надад энэ материалын жишээ програм байхгүй гэдгийг тэмдэглэх нь зүйтэй. Гэхдээ энд туршилт хийхэд ямар ч энгийн Node програм ажиллах болно.

Савыг ашиглахын тулд Docker-д зааварчилгаа өгөх шаардлагатай. Энэ нь нэртэй файлаар хийгддэг Dockerfile, төслийн үндсэн директорт байрладаг. Энэ файл нь эхлээд ойлгомжгүй мэт санагдаж байна.

Гэхдээ түүнд агуулагдаж байгаа зүйл нь зөвхөн ажлын орчинг бүрдүүлэхтэй адил зүйлийг тусгай тушаалаар тайлбарладаг. Эдгээр тушаалуудын заримыг энд оруулав:

  • FROM — Энэ тушаал нь файлыг эхлүүлнэ. Энэ нь савыг барьж буй үндсэн зургийг тодорхойлдог.
  • ХУУЛБАР ХУВЬ — Дотоод эх сурвалжаас контейнер руу файл хуулах.
  • WORKDIR — Дараах командуудын ажлын лавлахыг тохируулах.
  • ЗАГВАР - Командуудыг ажиллуулах.
  • НЭМЭХ - Портын тохиргоо.
  • ОРОХ ЦЭГ — Гүйцэтгэх тушаалын заалт.

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 хэрэгслийг тохируулж байна.
  • Үйлдвэрлэлийн серверийг манай кодыг татаж аваад ажиллуулахаар тохируулж байна.

Манай тохиолдолд бид ашигладаг Травис CI. Серверийн хувьд - Дитигал далай.

Энд та өөр үйлчилгээг хослуулан ашиглаж болно гэдгийг тэмдэглэх нь зүйтэй. Жишээлбэл, Travis CI-ийн оронд та CircleCI эсвэл Github үйлдлийг ашиглаж болно. DigitalOcean-ийн оронд AWS эсвэл Linode.

Бид Travis CI-тэй ажиллахаар шийдсэн бөгөөд надад энэ үйлчилгээнд тохируулсан зүйл байгаа. Тиймээс одоо би үүнийг ажилд хэрхэн бэлтгэх талаар товч ярих болно.

Травис 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 болон Coveralls ашиглах талаар товч заавар олж болно.

Ингээд файлын агуулгыг энд оруулав .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 hash болон git tag-г хослуулах явдал юм. Энэ нь шошго нь өвөрмөц гэдгийг баталгаажуулж, түүний үндэслэсэн угсралтыг тодорхойлоход хялбар болгодог. 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 болон ачааллыг тэнцвэржүүлэх

Дээр дурдсан бүх зүйлийг хийсний дараа миний хамгийн сүүлд тулгарсан асуудал бол серверт SSL байхгүй байсан явдал юм. Хүчлэхийн тулд би Node.js сервер ашигладаг болохоор ажиллах урвуу прокси Nginx болон Let's Encrypt-ийн хувьд та маш их засвар хийх хэрэгтэй.

Би энэ бүх SSL тохиргоог гараар хийхийг үнэхээр хүсээгүй тул би ачааллын тэнцвэржүүлэгчийг үүсгэн DNS-д дэлгэрэнгүй бичсэн. Жишээлбэл, DigitalOcean-ийн хувьд ачаалал тэнцвэржүүлэгч дээр автоматаар шинэчлэгдэх, өөрөө гарын үсэг зурсан гэрчилгээ үүсгэх нь энгийн, үнэ төлбөргүй, хурдан процедур юм. Энэ аргын нэмэлт давуу тал нь шаардлагатай бол ачаалал тэнцвэржүүлэгчийн ард ажилладаг олон сервер дээр SSL-г тохируулахад маш хялбар болгодог. Энэ нь серверүүд өөрсдөө SSL-ийн талаар огт "бодохгүй", харин портыг ердийнхөөрөө ашиглах боломжийг олгодог. 80. Тиймээс ачаалал тэнцвэржүүлэгч дээр SSL тохируулах нь SSL тохируулах өөр аргуудаас хамаагүй хялбар бөгөөд илүү тохиромжтой юм.

Одоо та портоос бусад ирж буй холболтыг хүлээн авдаг сервер дээрх бүх портуудыг хааж болно 80, ачааллын тэнцвэржүүлэгч болон порттой холбогдоход ашигладаг 22 SSH-ийн хувьд. Үүний үр дүнд эдгээр хоёр портоос бусад портууд дээрх серверт шууд хандах оролдлого бүтэлгүйтэх болно.

Үр дүн

Би энэ материалд ярьсан бүх зүйлээ хийсний дараа Docker платформ ч, автомат CI/CD сүлжээний тухай ойлголт ч намайг айлгахаа больсон. Би тасралтгүй интеграцийн гинжин хэлхээг бий болгож чадсан бөгөөд энэ хугацаанд кодыг үйлдвэрлэлд оруулахын өмнө туршиж, кодыг сервер дээр автоматаар байршуулдаг. Энэ бүхэн миний хувьд харьцангуй шинэ хэвээр байгаа бөгөөд миний автоматжуулсан ажлын урсгалыг сайжруулж, илүү үр дүнтэй болгох арга замууд байгаа гэдэгт би итгэлтэй байна. Тиймээс хэрэв танд энэ талаар ямар нэгэн санаа байвал надад мэдэгдээрэй. надад гэж мэдэх. Энэ нийтлэл таны хичээл зүтгэлд тусалсан гэж найдаж байна. Уншсаны дараа миний ярьсан бүх зүйлийг олж мэдэхийн зэрэгцээ та миний сурсан шиг их зүйлийг сурсан гэдэгт би итгэхийг хүсч байна.

PS Д манай зах зээл зураг байна Docker, нэг товшилтоор суулгаж болно. Та савны ажиллагааг шалгах боломжтой VPS. Бүх шинэ үйлчлүүлэгчдэд 3 хоногийн туршилтыг үнэ төлбөргүй өгдөг.

Эрхэм уншигчид! Та төсөлдөө CI/CD технологийг ашигладаг уу?

CI/CD сүлжээ үүсгэж, Docker-тэй ажиллах ажлыг автоматжуулах

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх