Би анхны вэбсайтуудаа 90-ээд оны сүүлээр бичсэн. Тэр үед тэдгээрийг ажиллуулахад маш хялбар байсан. Зарим хуваалцсан хостинг дээр Apache сервер байсан, та FTP-ээр дамжуулан энэ серверт иймэрхүү зүйл бичээд нэвтэрч болно ftp://ftp.example.com
. Дараа нь та нэр, нууц үгээ оруулаад файлуудаа серверт байршуулах ёстой. Өөр өөр цаг үе байсан, тэр үед бүх зүйл одоогийнхоос илүү хялбар байсан.
Түүнээс хойш хорин жилийн хугацаанд бүх зүйл маш их өөрчлөгдсөн. Вэбсайтууд илүү төвөгтэй болсон тул тэдгээрийг үйлдвэрлэхээс өмнө угсарсан байх ёстой. Нэг сервер ачаалал тэнцвэржүүлэгчийн ард ажилладаг олон серверүүд болж, хувилбарын хяналтын системийг ашиглах нь энгийн үзэгдэл болжээ.
Миний хувийн төслийн хувьд би тусгай тохиргоотой байсан. Салбар руу код бичих гэсэн ганц л үйлдлийг хийснээр сайтыг үйлдвэрлэлд нэвтрүүлэх чадвар хэрэгтэй гэдгийг би мэдэж байсан. master
GitHub дээр. Нэмж дурдахад би жижиг вэб программынхаа ажиллагааг хангахын тулд асар том Kubernetes кластерыг удирдах, Docker Swarm технологийг ашиглах, эсвэл pods, agents болон бусад бүх төрлийн серверүүдийг хадгалахыг хүсэхгүй байгаагаа мэдэж байсан. нарийн төвөгтэй байдал. Ажлыг аль болох хялбар болгох зорилгодоо хүрэхийн тулд би CI/CD-тэй танилцах хэрэгтэй болсон.
Хэрэв танд жижиг төсөл (энэ тохиолдолд Node.js төсөл) байгаа бөгөөд репозиторт хадгалагдаж байгаа зүйл нь үйлдвэрлэлд ажиллаж байгаа зүйлтэй яг таарч байгаа эсэхийг баталгаажуулахын зэрэгцээ энэ төслийг хэрхэн автоматжуулах талаар мэдэхийг хүсвэл би Та энэ нийтлэлийг сонирхож магадгүй гэж бодож байна.
Урьдчилсан нөхцөл
Энэ нийтлэлийг уншигчид командын мөр болон Bash скрипт бичих талаар үндсэн ойлголттой байх ёстой. Үүнээс гадна түүнд данс хэрэгтэй болно
Зорилтууд
Энэ нийтлэлийг болзолгүйгээр "заавар" гэж нэрлэж болно гэж би хэлэхгүй. Энэ бол би сурсан зүйлийнхээ талаар ярьж, нэг автомат дамжуулалтаар хийгдсэн кодыг турших, үйлдвэрлэлд нэвтрүүлэхэд надад тохирох үйл явцыг тайлбарласан баримт бичиг юм.
Миний ажлын урсгал ийм л болсон.
Бусад хадгалах сангийн аль ч салбарт байршуулсан кодын хувьд master
, дараах үйлдлүүдийг гүйцэтгэнэ.
- Travis CI дээр суурилсан төсөл эхэлж байна.
- Бүх нэгж, интеграци, төгсгөлийн туршилтыг гүйцэтгэдэг.
Зөвхөн тухайн кодонд зориулагдсан master
, дараах үйлдлийг гүйцэтгэнэ.
- Дээр дурдсан бүх зүйл, дээр нь ...
- Одоогийн код, тохиргоо, орчинд үндэслэн Docker дүрсийг бүтээх.
- Зургийг Docker Hub-д байрлуулж байна.
- Үйлдвэрлэлийн сервертэй холбогдох.
- Docker Hub-аас серверт зураг байршуулж байна.
- Одоогийн савыг зогсоож, шинэ зураг дээр үндэслэн шинээр эхлүүлэх.
Хэрэв та Docker, зураг, контейнерийн талаар огт мэдэхгүй бол санаа зовох хэрэггүй. Би чамд энэ бүгдийг хэлье.
CI/CD гэж юу вэ?
CI/CD товчлол нь "тасралтгүй нэгтгэх/тасралтгүй байршуулах" гэсэн утгатай.
▍Тасралтгүй нэгтгэх
Тасралтгүй интеграци гэдэг нь хөгжүүлэгчид төслийн үндсэн эх кодын агуулах (ихэвчлэн салбар)-д амлалт өгөх үйл явц юм. master
). Үүний зэрэгцээ кодын чанарыг автоматжуулсан туршилтаар баталгаажуулдаг.
▍Тасралтгүй байршуулалт
Тасралтгүй байршуулалт гэдэг нь кодыг үйлдвэрлэлд ойр ойрхон автоматаар байршуулах явдал юм. CI/CD товчлолын хоёр дахь хэсгийг заримдаа "тасралтгүй хүргэх" гэж бичдэг. Энэ нь үндсэндээ "тасралтгүй байршуулалт"-тай ижил боловч "тасралтгүй хүргэлт" нь төслийг хэрэгжүүлэх процессыг эхлүүлэхийн өмнө өөрчлөлтийг гараар баталгаажуулах шаардлагатай гэсэн үг юм.
Эхлэл
Энэ бүгдийг сурдаг байсан программыг маань гэдэг
Миний хувьд энэ програм нь Node.js орчинд ажилладаг Экспресс сервер бөгөөд нэг хуудастай React програмд үйлчилж, сервер талын аюулгүй API-г дэмждэг. Энэхүү архитектур нь олж болох стратегийг дагаж мөрддөг
-тай зөвлөлдсөн
Docker
Docker нь контейнержуулалтын технологийн ачаар Docker платформ өөрөө өөр орчинд ажилладаг байсан ч програмуудыг хялбархан тарааж, байршуулж, ижил орчинд ажиллуулах боломжийг олгодог хэрэгсэл юм. Эхлээд би Docker командын шугамын хэрэгслүүдийг (CLI) ашиглах хэрэгтэй болсон.
Docker Hub нь ойролцоогоор ижил зүйл юм
Тиймээс, Docker-тэй ажиллахын тулд та хоёр зүйлийг хийх хэрэгтэй:
- Тогто
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-аас зураг бүтээх
Зураг
Зургийн шошго
Зураг
Жагсаалтын зургууд
Контейнер
Зураг дээр тулгуурлан контейнер ажиллуулж байна
Зураг
Бүртгэлд зураг байршуулж байна
Зураг
Бүртгэлээс зураг ачаалж байна
Контейнер
Жагсаалтын сав
Зураг/Сав
Ашиглагдаагүй сав, зургийг арилгах
▍Докер файл
Би үйлдвэрлэлийн програмыг дотооддоо хэрхэн ажиллуулахаа мэддэг. Би бэлэн 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 хэрэгслийг тохируулж байна.
- Үйлдвэрлэлийн серверийг манай кодыг татаж аваад ажиллуулахаар тохируулж байна.
Манай тохиолдолд бид ашигладаг
Энд та өөр үйлчилгээг хослуулан ашиглаж болно гэдгийг тэмдэглэх нь зүйтэй. Жишээлбэл, Travis CI-ийн оронд та CircleCI эсвэл Github үйлдлийг ашиглаж болно. DigitalOcean-ийн оронд AWS эсвэл Linode.
Бид Travis CI-тэй ажиллахаар шийдсэн бөгөөд надад энэ үйлчилгээнд тохируулсан зүйл байгаа. Тиймээс одоо би үүнийг ажилд хэрхэн бэлтгэх талаар товч ярих болно.
Травис CI
Travis CI бол кодыг турших, ашиглах хэрэгсэл юм. Төсөл бүр өвөрмөц бөгөөд энэ нь тийм ч их ашиг авчрахгүй тул би Travis CI-ийн нарийн ширийнийг ярихыг хүсэхгүй байна. Гэхдээ хэрэв та Travis CI-г ашиглахаар шийдсэн бол би таныг эхлүүлэхийн тулд үндсэн зарчмуудыг тайлбарлах болно. Та Travis CI, CircleCI, Jenkins эсвэл өөр зүйлийг сонгосон эсэхээс үл хамааран ижил төстэй тохиргооны аргуудыг хаа сайгүй ашиглах болно.
Travis CI-г эхлүүлэхийн тулд дараах руу очно уу
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 серверийг арын дэвсгэр дээр ажиллуулж (энэ бол миний ажлын урсгалын онцлог) болон тестүүдийг ажиллуулдаг.
Хэрэв та репозитороо тестийн хамрах хүрээний дүрсүүдийг харуулахыг хүсвэл,
Ингээд файлын агуулгыг энд оруулав .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 ашигладаг болохоор серверт холбогдохын тулд командуудыг ашигладаг 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 сервер ашигладаг болохоор
Би энэ бүх SSL тохиргоог гараар хийхийг үнэхээр хүсээгүй тул би ачааллын тэнцвэржүүлэгчийг үүсгэн DNS-д дэлгэрэнгүй бичсэн. Жишээлбэл, DigitalOcean-ийн хувьд ачаалал тэнцвэржүүлэгч дээр автоматаар шинэчлэгдэх, өөрөө гарын үсэг зурсан гэрчилгээ үүсгэх нь энгийн, үнэ төлбөргүй, хурдан процедур юм. Энэ аргын нэмэлт давуу тал нь шаардлагатай бол ачаалал тэнцвэржүүлэгчийн ард ажилладаг олон сервер дээр SSL-г тохируулахад маш хялбар болгодог. Энэ нь серверүүд өөрсдөө SSL-ийн талаар огт "бодохгүй", харин портыг ердийнхөөрөө ашиглах боломжийг олгодог. 80
. Тиймээс ачаалал тэнцвэржүүлэгч дээр SSL тохируулах нь SSL тохируулах өөр аргуудаас хамаагүй хялбар бөгөөд илүү тохиромжтой юм.
Одоо та портоос бусад ирж буй холболтыг хүлээн авдаг сервер дээрх бүх портуудыг хааж болно 80
, ачааллын тэнцвэржүүлэгч болон порттой холбогдоход ашигладаг 22
SSH-ийн хувьд. Үүний үр дүнд эдгээр хоёр портоос бусад портууд дээрх серверт шууд хандах оролдлого бүтэлгүйтэх болно.
Үр дүн
Би энэ материалд ярьсан бүх зүйлээ хийсний дараа Docker платформ ч, автомат CI/CD сүлжээний тухай ойлголт ч намайг айлгахаа больсон. Би тасралтгүй интеграцийн гинжин хэлхээг бий болгож чадсан бөгөөд энэ хугацаанд кодыг үйлдвэрлэлд оруулахын өмнө туршиж, кодыг сервер дээр автоматаар байршуулдаг. Энэ бүхэн миний хувьд харьцангуй шинэ хэвээр байгаа бөгөөд миний автоматжуулсан ажлын урсгалыг сайжруулж, илүү үр дүнтэй болгох арга замууд байгаа гэдэгт би итгэлтэй байна. Тиймээс хэрэв танд энэ талаар ямар нэгэн санаа байвал надад мэдэгдээрэй.
PS Д манай
Эрхэм уншигчид! Та төсөлдөө CI/CD технологийг ашигладаг уу?
Эх сурвалж: www.habr.com