ایجاد یک زنجیره CI / CD و خودکار کردن کار با Docker

اولین وب سایت هایم را در اواخر دهه 90 نوشتم. سپس آوردن آنها به شرایط کاری بسیار آسان بود. یک سرور آپاچی در میزبانی مشترک وجود داشت، این سرور از طریق FTP با نوشتن در خط مرورگر چیزی شبیه به آن قابل دسترسی بود. ftp://ftp.example.com. سپس لازم بود نام و رمز عبور وارد کرده و فایل ها را در سرور آپلود کنید. زمان های دیگری هم بود، آن موقع همه چیز ساده تر از الان بود.

ایجاد یک زنجیره CI / CD و خودکار کردن کار با Docker

در دو دهه گذشته اوضاع بسیار تغییر کرده است. سایت ها پیچیده تر شده اند، آنها باید قبل از عرضه به تولید مونتاژ شوند. یک سرور واحد تبدیل به سرورهای زیادی شده است که در پشت متعادل کننده های بار کار می کنند، استفاده از سیستم های کنترل نسخه رایج شده است.

برای پروژه شخصی ام، پیکربندی خاصی داشتم. و می دانستم که به توانایی استقرار یک سایت در تولید نیاز دارم، فقط یک عمل انجام می دهم: نوشتن کد در یک شعبه master در GitHub. همچنین می‌دانستم که نمی‌خواهم یک خوشه بزرگ Kubernetes را مدیریت کنم، یا از فناوری Docker Swarm استفاده کنم، یا ناوگانی از سرورها با پادها، عوامل و انواع پیچیدگی‌های دیگر را برای اجرای برنامه وب کوچک خود حفظ کنم. برای دستیابی به هدف آسان‌تر کردن کارها، باید با CI/CD آشنا شوم.

اگر پروژه کوچکی دارید (در مورد ما، یک پروژه Node.js) و می خواهید یاد بگیرید که چگونه استقرار این پروژه را خودکار کنید، در حالی که مطمئن شوید آنچه در مخزن ذخیره می شود دقیقاً با آنچه در تولید کار می کند مطابقت دارد. ممکن است به این مقاله علاقه مند باشید.

پیش نیازها

انتظار می رود خواننده این مقاله دانش اولیه خط فرمان و برنامه نویسی Bash را داشته باشد. علاوه بر این، او به حساب‌ها نیاز خواهد داشت تراویس CI и مرکز داکر.

اهداف

نمی گویم این مقاله را بدون قید و شرط می توان «راهنمای آموزشی» نامید. این بیشتر سندی است که در آن درباره آموخته‌هایم صحبت می‌کنم و فرآیندی را که برای آزمایش و استقرار کد در تولید مناسب است، که در یک پاس خودکار انجام می‌شود، توصیف می‌کنم.

در اینجا روند کاری من به نظر می رسد.

برای کدهایی که به هر شاخه ای از مخزن به غیر از master، اقدامات زیر انجام می شود:

  • ساخت پروژه در Travis CI شروع می شود.
  • تمامی تست های واحد، ادغام و پایان به انتها انجام می شود.

فقط برای کدهایی که به آن ختم می شود master، موارد زیر انجام می شود:

  • همه موارد فوق به علاوه ...
  • ساخت یک تصویر Docker بر اساس کد، تنظیمات و محیط فعلی.
  • میزبانی تصویر در Docker Hub.
  • اتصال به سرور تولید
  • آپلود تصویر از داکر هاب به سرور.
  • کانتینر فعلی را متوقف کنید و بر اساس تصویر جدید، ظرف جدید را شروع کنید.

اگر مطلقاً چیزی در مورد Docker، تصاویر و کانتینرها نمی دانید، نگران نباشید. من همه چیز را به شما خواهم گفت.

CI/CD چیست؟

مخفف CI / CD مخفف "ادغام مداوم / مستقر مستمر" - "ادغام مداوم / مستقر است".

▍ادغام پیوسته

یکپارچه سازی مستمر فرآیندی است که طی آن توسعه دهندگان به مخزن کد منبع اصلی پروژه (معمولاً یک شعبه) تعهد می دهند. master). در عین حال، کیفیت کد از طریق تست خودکار تضمین می شود.

▍استقرار مستمر

استقرار پیوسته، استقرار خودکار مکرر کد برای تولید است. قسمت دوم مخفف CI / CD گاهی اوقات به عنوان "تحویل مداوم" ("تحویل مداوم") آشکار می شود. این اساساً همان "استقرار مستمر" است، اما "تحویل مداوم" به این معنی است که تغییرات باید قبل از شروع فرآیند استقرار پروژه به صورت دستی تأیید شوند.

شروع

برنامه ای که من بر روی همه اینها مسلط شدم نام دارد یادداشت بردار. این یک پروژه وب است که من برای یادداشت برداری روی آن کار می کنم. اول سعی کردم انجام دهم JAMStack-پروژه یا فقط یک برنامه فرانت اند بدون سرور، به منظور استفاده از گزینه های میزبانی استاندارد و استقرار پروژه که ارائه می دهد خالص کردن. با افزایش پیچیدگی برنامه، من نیاز به ایجاد بک‌اند آن داشتم، به این معنی که باید استراتژی خود را برای یکپارچه‌سازی خودکار و استقرار خودکار پروژه شکل دهم.

در مورد من، برنامه یک سرور اکسپرس است که در محیط Node.js اجرا می شود، یک برنامه React تک صفحه ای را ارائه می دهد و از یک API امن سمت سرور پشتیبانی می کند. این معماری از یک استراتژی پیروی می کند که در آن یافت می شود این راهنمای احراز هویت کامل پشته

باهاش ​​مشورت کردم دوست، که یک متخصص اتوماسیون است، و از او پرسید که چه کاری باید انجام دهم تا همه چیز آنطور که می خواهم کار کند. او به من ایده داد که گردش کار خودکار که در بخش اهداف این مقاله توضیح داده شده است چگونه باید باشد. تعیین اهدافی مانند این به این معنی بود که باید نحوه استفاده از Docker را بیابم.

کارگر بارانداز

Docker ابزاری است که به لطف فناوری Containerization، توزیع برنامه‌ها و همچنین استقرار و اجرای آن‌ها را در یک محیط آسان می‌کند، حتی اگر خود پلتفرم Docker در محیط‌های مختلف اجرا شود. ابتدا باید ابزارهای خط فرمان داکر (CLI) را در دست بگیرم. دستورالعمل راهنمای نصب Docker چندان واضح نیست، اما می‌توانید از آن یاد بگیرید که برای برداشتن اولین قدم نصب، باید Docker Desktop (برای مک یا ویندوز) را دانلود کنید.

داکر هاب تقریباً مشابه است GitHub برای مخازن git یا رجیستری npm برای بسته های جاوا اسکریپت این یک مخزن آنلاین برای تصاویر Docker است. این جایی است که Docker Desktop به آن متصل می شود.

بنابراین، برای شروع کار با Docker، باید دو کار را انجام دهید:

پس از آن، می توانید با اجرای دستور زیر برای بررسی نسخه Docker بررسی کنید که آیا Docker CLI کار می کند یا خیر:

docker -v

در مرحله بعد، با وارد کردن نام کاربری و رمز عبور خود در صورت درخواست وارد Docker Hub شوید:

docker login

برای استفاده از داکر، باید مفاهیم تصاویر و کانتینرها را درک کنید.

▍تصاویر

تصویر نوعی طرح اولیه است که حاوی دستورالعمل هایی برای ساخت کانتینر است. این یک عکس فوری غیرقابل تغییر از سیستم فایل و تنظیمات برنامه است. توسعه دهندگان می توانند به راحتی تصاویر را به اشتراک بگذارند.

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

این دستور یک جدول با عنوان زیر خروجی می دهد:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

در مرحله بعد، چند نمونه از دستورات را در قالب یکسان در نظر خواهیم گرفت - ابتدا یک دستور با یک نظر وجود دارد، و سپس نمونه ای از آنچه می تواند خروجی دهد.

▍ظروف

کانتینر یک بسته اجرایی است که شامل همه چیزهایی است که برای اجرای یک برنامه لازم است. برنامه ای با این رویکرد، صرف نظر از زیرساخت، همیشه یکسان کار می کند: در یک محیط ایزوله و در همان محیط. ما در مورد این واقعیت صحبت می کنیم که نمونه هایی از یک تصویر در محیط های مختلف راه اندازی می شوند.

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

▍برچسب ها

تگ نشان دهنده یک نسخه خاص از یک تصویر است.

▍مرجع سریع برای دستورات Docker

در اینجا مروری بر برخی از دستورات رایج Docker است.

تیم

متن نوشته

اثر

ساخت داکر

تصویر

ساخت یک تصویر از Dockerfile

تگ داکر

تصویر

برچسب گذاری تصویر

تصاویر داكر

تصویر

نمایش لیستی از تصاویر

دكتر اجرا كننده

ظرف

اجرای یک کانتینر مبتنی بر تصویر

فشار داکر

تصویر

ارسال تصویر به رجیستری

داکر کشش

تصویر

بارگیری تصویر از رجیستری

Docker PS

ظرف

ظروف فهرست بندی

هرس سیستم داکر

تصویر / ظرف

حذف ظروف و تصاویر استفاده نشده

▍Dockerfile

من می دانم که چگونه یک برنامه تولید را به صورت محلی اجرا کنم. من یک پیکربندی بسته وب برای ساختن یک برنامه React تمام شده دارم. بعد، من دستوری دارم که سرور مبتنی بر Node.js را روی پورت راه اندازی می کند 5000. به نظر می رسد این است:

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

لازم به ذکر است که من برای این مطالب اپلیکیشن نمونه ای ندارم. اما در اینجا، برای آزمایش، هر برنامه Node ساده ای انجام می دهد.

برای استفاده از کانتینر، باید دستورالعمل هایی را به Docker بدهید. این کار از طریق فایلی به نام انجام می شود Dockerfileدر فهرست اصلی پروژه قرار دارد. این فایل، در ابتدا، نسبتاً نامفهوم به نظر می رسد.

اما آنچه در آن وجود دارد فقط در دستورات ویژه چیزی مانند راه اندازی یک محیط کاری را توصیف می کند. در اینجا برخی از این دستورات وجود دارد:

  • از - این دستور یک فایل را شروع می کند. تصویر پایه ای را که کانتینر از آن ساخته شده است را مشخص می کند.
  • کپی کردن - کپی کردن فایل ها از یک منبع محلی در یک ظرف.
  • 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وظایف بسیار ساده هستند. قبل از فشار دادن یک تصویر به داکر هاب، باید به صورت محلی آزمایش شود.

▍مونتاژ

ابتدا باید جمع آوری کنید تصویر، تعیین یک نام، و در صورت تمایل، یک برچسب (اگر هیچ برچسبی مشخص نشده باشد، سیستم به طور خودکار یک برچسب به تصویر اختصاص می دهد. latest).

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

پس از اجرای این دستور، می توانید ساختن تصویر داکر را تماشا کنید.

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، i، در سمت چپ جفت 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 push تا آن را به مخزن داکر هاب فشار دهید.

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، به صورت محلی اجرا می شود. ما کانتینر را در Docker Hub بارگذاری کرده ایم. همه اینها به این معنی است که ما در حال حاضر پیشرفت بسیار خوبی به سمت هدف خود داشته ایم. حال باید دو سوال دیگر را حل کنیم:

  • راه اندازی یک ابزار CI برای آزمایش و استقرار کد.
  • راه اندازی سرور تولید به گونه ای که بتواند کد ما را دانلود و اجرا کند.

در مورد ما، به عنوان یک راه حل CI / CD، ما استفاده می کنیم تراویس CI. به عنوان یک سرور - DigitalOcean.

لازم به ذکر است که در اینجا می توانید از ترکیب دیگری از خدمات استفاده کنید. به عنوان مثال، به جای Travis CI، می توانید از CircleCI یا Github Actions استفاده کنید. و به جای 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 راه اندازی کنم. من Node 12 را به عنوان زبان انتخاب کردم و به سیستم گفتم که وابستگی های مورد نیاز برای استفاده از Docker را نصب کند.

همه موارد ذکر شده در .travis.yml، در تمام درخواست های کشش به تمام شاخه های مخزن اجرا می شود، مگر اینکه خلاف آن مشخص شده باشد. این یک ویژگی مفید است زیرا به این معنی است که می توانیم تمام کدهایی را که به مخزن می رود آزمایش کنیم. این به شما امکان می دهد بدانید که آیا کد برای نوشتن در شعبه آماده است یا خیر. master، و اینکه آیا روند ساخت پروژه را خراب می کند یا خیر. در این پیکربندی جهانی، من همه چیز را به صورت محلی نصب می‌کنم، سرور توسعه دهنده Webpack را در پس‌زمینه اجرا می‌کنم (این یکی از ویژگی‌های گردش کار من است)، و آزمایش‌ها را اجرا می‌کنم.

اگر می خواهید مخزن شما نمادهای پوشش کد را نمایش دهد، اینجا می توانید یک آموزش سریع در مورد نحوه استفاده از 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 (در مورد ما تراویس CI است).
  • بارگذاری تصویر در سرور، توقف کانتینر قدیمی و راه اندازی یک ظرف جدید (در مورد ما، سرور بر روی پلت فرم DigitalOcean اجرا می شود).

ابتدا باید یک فرآیند خودکار برای ساختن، برچسب‌گذاری و انتقال تصویر به داکر هاب تنظیم کنید. همه اینها بسیار شبیه به آنچه قبلاً به صورت دستی انجام دادیم است، با این تفاوت که در اینجا به یک استراتژی برای اختصاص برچسب های منحصر به فرد به تصاویر و خودکارسازی ورود به سیستم نیاز داریم. من با برخی از جزئیات اسکریپت استقرار، مانند استراتژی برچسب گذاری، ورود به سیستم، رمزگذاری کلیدهای SSH، ایجاد یک اتصال SSH مشکل داشتم. اما خوشبختانه دوست پسر من با بش و همچنین با خیلی چیزهای دیگر خیلی خوب است. او به من در نوشتن این فیلمنامه کمک کرد.

بنابراین، قسمت اول اسکریپت ارسال تصویر به داکر هاب است. انجام این کار بسیار ساده است. طرح برچسب گذاری که من استفاده کرده ام شامل ترکیب 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 استفاده می کنم، از دستورات برای اتصال به سرور استفاده می شود دکترا. هنگام کار با Aws، از این ابزار استفاده می شود aws، و غیره.

راه اندازی سرور خیلی سخت نبود. بنابراین، من یک قطره را بر اساس تصویر پایه تنظیم کردم. لازم به ذکر است که سیستمی که من انتخاب کرده ام نیاز به یک بار نصب دستی Docker و یک بار شروع دستی Docker دارد. من از اوبونتو 18.04 برای نصب داکر استفاده کردم، بنابراین اگر از اوبونتو هم استفاده می‌کنید، می‌توانید آن را دنبال کنید. این راهنمایی ساده

من در اینجا در مورد دستورات خاصی برای سرویس صحبت نمی کنم، زیرا این جنبه می تواند در موارد مختلف بسیار متفاوت باشد. من فقط یک طرح کلی از اقدام را ارائه می دهم که باید پس از اتصال از طریق 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

برخی از چیزهایی که باید مراقب آنها بود

این امکان وجود دارد که هنگام اتصال به سرور از طریق SSH از Travis CI، هشداری را مشاهده کنید که به شما اجازه ادامه نصب را نمی دهد، زیرا سیستم منتظر پاسخ کاربر خواهد بود.

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 در ما بازار یک تصویر وجود دارد کارگر بارانداز، که با یک کلیک نصب می شود. می توانید ظروف کار را بررسی کنید VPS. به تمام مشتریان جدید 3 روز آزمایش رایگان داده می شود.

خوانندگان عزیز! آیا از فناوری های CI/CD در پروژه های خود استفاده می کنید؟

ایجاد یک زنجیره CI / CD و خودکار کردن کار با Docker

منبع: www.habr.com

اضافه کردن نظر