CI/CD چین بنانا اور Docker کے ساتھ خودکار کام کرنا

میں نے اپنی پہلی ویب سائٹیں 90 کی دہائی کے آخر میں لکھیں۔ اس وقت انہیں ورکنگ آرڈر میں رکھنا بہت آسان تھا۔ کچھ مشترکہ ہوسٹنگ پر ایک اپاچی سرور تھا، آپ FTP کے ذریعے اس سرور میں کچھ لکھ کر لاگ ان کر سکتے ہیں۔ ftp://ftp.example.com. پھر آپ کو اپنا نام اور پاس ورڈ درج کرنا تھا اور فائلوں کو سرور پر اپ لوڈ کرنا تھا۔ مختلف اوقات تھے، اس وقت سب کچھ اب کے مقابلے میں آسان تھا۔

CI/CD چین بنانا اور Docker کے ساتھ خودکار کام کرنا

اس کے بعد دو دہائیوں میں سب کچھ بہت بدل گیا ہے۔ ویب سائٹس زیادہ پیچیدہ ہو گئی ہیں؛ انہیں پروڈکشن میں جاری کیے جانے سے پہلے جمع کرنا ضروری ہے۔ ایک واحد سرور لوڈ بیلنسرز کے پیچھے چلنے والے بہت سے سرور بن گیا، اور ورژن کنٹرول سسٹم کا استعمال عام ہو گیا۔

اپنے ذاتی پروجیکٹ کے لیے میرے پاس ایک خاص ترتیب تھی۔ اور میں جانتا تھا کہ مجھے صرف ایک کارروائی کرکے سائٹ کو پروڈکشن میں تعینات کرنے کی صلاحیت کی ضرورت ہے: برانچ میں کوڈ لکھنا master GitHub پر۔ اس کے علاوہ، میں جانتا تھا کہ اپنی چھوٹی ویب ایپلیکیشن کے آپریشن کو یقینی بنانے کے لیے، میں کبرنیٹس کے ایک بہت بڑے کلسٹر کا انتظام نہیں کرنا چاہتا تھا، یا Docker Swarm ٹیکنالوجی کا استعمال نہیں کرنا چاہتا تھا، یا pods، ایجنٹوں اور دیگر تمام اقسام کے ساتھ سرورز کے بیڑے کو برقرار نہیں رکھنا چاہتا تھا۔ پیچیدگیاں کام کو ہر ممکن حد تک آسان بنانے کے مقصد کو حاصل کرنے کے لیے، مجھے CI/CD سے واقف ہونے کی ضرورت تھی۔

اگر آپ کے پاس ایک چھوٹا پروجیکٹ ہے (اس معاملے میں، ایک Node.js پروجیکٹ) اور آپ جاننا چاہیں گے کہ اس پروجیکٹ کی تعیناتی کو خود کار طریقے سے کیسے بنایا جائے، اس بات کو یقینی بناتے ہوئے کہ ذخیرہ میں جو ذخیرہ کیا گیا ہے وہ پیداوار میں کام کرنے والی چیزوں سے بالکل مماثل ہے، تو میں لگتا ہے کہ آپ کو اس مضمون میں دلچسپی ہو سکتی ہے۔

ضروریات۔

اس مضمون کے قاری سے توقع کی جاتی ہے کہ وہ کمانڈ لائن اور باش اسکرپٹ لکھنے کی بنیادی سمجھ رکھتا ہے۔ اس کے علاوہ، اسے اکاؤنٹس کی ضرورت ہوگی ٹریوس سی آئی и ڈوکر حب.

اہداف

میں یہ نہیں کہوں گا کہ اس مضمون کو غیر مشروط طور پر "ٹیوٹوریل" کہا جا سکتا ہے۔ یہ ایک ایسی دستاویز ہے جس میں میں اس کے بارے میں بات کرتا ہوں جو میں نے سیکھا ہے اور اس عمل کی وضاحت کرتا ہوں جو مجھے جانچنے اور کوڈ کو پروڈکشن میں تعینات کرنے کے لیے موزوں ہے، جو ایک خودکار پاس میں انجام دیا جاتا ہے۔

یہ وہی ہے جو میرا ورک فلو ختم ہوا۔

کسی بھی ریپوزٹری برانچ میں پوسٹ کیے گئے کوڈ کے لیے master، درج ذیل اعمال انجام دیے جاتے ہیں:

  • ٹریوس سی آئی پر پروجیکٹ کی تعمیر شروع ہوتی ہے۔
  • تمام یونٹ، انضمام اور اختتام سے آخر تک ٹیسٹ کیے جاتے ہیں۔

صرف اس کوڈ کے لیے جو اس میں آتا ہے۔ master، مندرجہ ذیل کارکردگی کا مظاہرہ کیا جاتا ہے:

  • اوپر مذکور ہر چیز کے علاوہ...
  • موجودہ کوڈ، ترتیبات اور ماحول کی بنیاد پر ڈوکر امیج بنانا۔
  • تصویر کو Docker Hub میں تعینات کرنا۔
  • پروڈکشن سرور سے کنکشن۔
  • Docker Hub سے سرور پر تصویر اپ لوڈ کرنا۔
  • موجودہ کنٹینر کو روکنا اور نئی تصویر کی بنیاد پر ایک نیا شروع کرنا۔

اگر آپ Docker، تصاویر اور کنٹینرز کے بارے میں بالکل کچھ نہیں جانتے ہیں، تو فکر نہ کریں۔ میں آپ کو اس کے بارے میں سب بتاؤں گا۔

CI/CD کیا ہے؟

مخفف CI/CD کا مطلب ہے "مسلسل انضمام/مسلسل تعیناتی"۔

▍مسلسل انضمام

مسلسل انضمام ایک ایسا عمل ہے جس میں ڈویلپرز پروجیکٹ کے مین سورس کوڈ ریپوزٹری (عام طور پر ایک برانچ) سے عہد کرتے ہیں۔ master)۔ اس کے ساتھ ساتھ خودکار جانچ کے ذریعے کوڈ کے معیار کو یقینی بنایا جاتا ہے۔

▍مسلسل تعیناتی۔

مسلسل تعیناتی پیداوار میں کوڈ کی متواتر، خودکار تعیناتی ہے۔ CI/CD مخفف کا دوسرا حصہ بعض اوقات "مسلسل ترسیل" کے طور پر بھیجا جاتا ہے۔ یہ بنیادی طور پر "مسلسل تعیناتی" کے مترادف ہے، لیکن "مسلسل ترسیل" کا مطلب پراجیکٹ کی تعیناتی کا عمل شروع کرنے سے پہلے تبدیلیوں کی دستی طور پر تصدیق کرنے کی ضرورت ہے۔

شروع کریں

میں نے یہ سب سیکھنے کے لیے جس ایپ کا استعمال کیا اسے کہتے ہیں۔ نوٹ لے. یہ ایک ویب پروجیکٹ ہے جس پر میں کام کر رہا ہوں، نوٹ لینے کے لیے ڈیزائن کیا گیا ہے۔ پہلے میں نے کرنے کی کوشش کی۔ JAMStack-پروجیکٹ، یا سرور کے بغیر صرف ایک فرنٹ اینڈ ایپلیکیشن، تاکہ معیاری ہوسٹنگ اور پروجیکٹ کی تعیناتی کی صلاحیتوں سے فائدہ اٹھایا جا سکے جو یہ پیش کرتا ہے۔ نیٹلائف. جیسے جیسے ایپلی کیشن کی پیچیدگی بڑھتی گئی، مجھے اس کا سرور حصہ بنانے کی ضرورت پڑی، جس کا مطلب یہ تھا کہ مجھے خودکار انضمام اور پروجیکٹ کے خودکار تعیناتی کے لیے اپنی حکمت عملی تیار کرنے کی ضرورت ہوگی۔

میرے معاملے میں، ایپلی کیشن ایک ایکسپریس سرور ہے جو Node.js ماحول میں چل رہا ہے، ایک صفحے کے React ایپلیکیشن کو پیش کرتا ہے اور ایک محفوظ سرور سائیڈ API کو سپورٹ کرتا ہے۔ یہ فن تعمیر اس حکمت عملی کی پیروی کرتا ہے جس میں پایا جاسکتا ہے۔ اس مکمل اسٹیک کی توثیق گائیڈ۔

میں نے مشورہ کیا۔ دوستجو کہ آٹومیشن کا ماہر ہے، اور اس سے پوچھا کہ مجھے کیا کرنے کی ضرورت ہے تاکہ یہ سب کچھ میری مرضی کے مطابق ہو۔ اس نے مجھے یہ خیال دیا کہ ایک خودکار ورک فلو کیسا ہونا چاہیے، اس مضمون کے گولز سیکشن میں بیان کیا گیا ہے۔ ان اہداف کا مطلب یہ تھا کہ مجھے یہ جاننے کی ضرورت ہے کہ ڈوکر کو کیسے استعمال کیا جائے۔

میں Docker

ڈوکر ایک ایسا ٹول ہے جو کنٹینرائزیشن ٹیکنالوجی کی بدولت ایپلی کیشنز کو آسانی سے تقسیم، تعینات اور ایک ہی ماحول میں چلانے کی اجازت دیتا ہے، چاہے ڈوکر پلیٹ فارم خود مختلف ماحول میں چلتا ہو۔ سب سے پہلے، مجھے Docker کمانڈ لائن ٹولز (CLI) پر ہاتھ اٹھانے کی ضرورت تھی۔ ہدایت ڈوکر انسٹالیشن گائیڈ کو بہت واضح اور قابل فہم نہیں کہا جا سکتا، لیکن اس سے آپ یہ سیکھ سکتے ہیں کہ انسٹالیشن کا پہلا قدم اٹھانے کے لیے، آپ کو ڈوکر ڈیسک ٹاپ (میک یا ونڈوز کے لیے) ڈاؤن لوڈ کرنا ہوگا۔

Docker Hub تقریباً وہی چیز ہے۔ GitHub کے گٹ ریپوزٹریز، یا رجسٹری کے لیے npm جاوا اسکرپٹ پیکجز کے لیے۔ یہ ڈاکر امیجز کے لیے ایک آن لائن ذخیرہ ہے۔ یہ وہی ہے جو ڈوکر ڈیسک ٹاپ سے جڑتا ہے۔

لہذا، 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 نظام کی کٹائی

تصویر/کنٹینر

غیر استعمال شدہ کنٹینرز اور تصاویر کو ہٹانا

▍ڈاکر فائل

میں جانتا ہوں کہ مقامی طور پر پروڈکشن ایپلیکیشن کو کیسے چلانا ہے۔ میرے پاس ایک Webpack کنفیگریشن ہے جو ایک ریڈی میڈ React ایپلیکیشن بنانے کے لیے بنائی گئی ہے۔ اگلا، میرے پاس ایک کمانڈ ہے جو پورٹ پر Node.js پر مبنی سرور شروع کرتی ہے۔ 5000. ایسا لگتا ہے:

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

واضح رہے کہ میرے پاس اس مواد کے لیے مثال کی درخواست نہیں ہے۔ لیکن یہاں، تجربات کے لیے، کوئی بھی سادہ نوڈ ایپلی کیشن کرے گی۔

کنٹینر استعمال کرنے کے لیے، آپ کو ڈوکر کو ہدایات دینے کی ضرورت ہوگی۔ یہ نام کی فائل کے ذریعے کیا جاتا ہے۔ Dockerfile، پروجیکٹ کی روٹ ڈائرکٹری میں واقع ہے۔ یہ فائل شروع میں تو کافی سمجھ سے باہر لگتی ہے۔

لیکن اس میں جو کچھ ہوتا ہے وہ صرف خاص حکموں کے ساتھ، کام کرنے کے ماحول کو ترتیب دینے کے مترادف ہے۔ ان میں سے کچھ احکام یہ ہیں:

  • FROM - یہ کمانڈ ایک فائل شروع کرتی ہے۔ یہ بیس امیج کی وضاحت کرتا ہے جس پر کنٹینر بنایا گیا ہے۔
  • COPY - فائلوں کو مقامی ذریعہ سے کنٹینر میں کاپی کرنا۔
  • ورکڈائر - درج ذیل کمانڈز کے لیے ورکنگ ڈائرکٹری سیٹ کرنا۔
  • رن - کمانڈز چلائیں۔
  • ایکسپوز - پورٹ کی ترتیبات۔
  • ENTRYPOINT - عمل کرنے کے حکم کا اشارہ۔

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

آپ کی منتخب کردہ بنیادی تصویر پر منحصر ہے، آپ کو اضافی انحصار انسٹال کرنے کی ضرورت پڑ سکتی ہے۔ حقیقت یہ ہے کہ کچھ بیس امیجز (جیسے نوڈ الپائن لینکس) ان کو ممکنہ حد تک کمپیکٹ بنانے کے مقصد سے بنائی گئی ہیں۔ نتیجے کے طور پر، ہو سکتا ہے کہ ان کے پاس کچھ پروگرام نہ ہوں جن کی آپ توقع کرتے ہیں۔

▍کنٹینر کو بنانا، ٹیگ کرنا اور چلانا

مقامی اسمبلی اور کنٹینر کا آغاز ہمارے پاس ہونے کے بعد ہے۔ 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میں، جوڑے کے بائیں جانب 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 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 Hub پر اپ لوڈ کر دیا ہے۔ اس سب کا مطلب یہ ہے کہ ہم نے پہلے ہی اپنے مقصد کی طرف بہت اچھی پیش رفت کی ہے۔ اب ہمیں مزید دو سوالات کو حل کرنے کی ضرورت ہے:

  • کوڈ کی جانچ اور تعیناتی کے لیے CI ٹول ترتیب دینا۔
  • پروڈکشن سرور کو ترتیب دینا تاکہ یہ ہمارے کوڈ کو ڈاؤن لوڈ اور چلا سکے۔

ہمارے معاملے میں، ہم استعمال کرتے ہیں ٹریوس سی آئی. بطور سرور - DitigalOcean.

واضح رہے کہ یہاں آپ خدمات کا ایک اور مجموعہ استعمال کر سکتے ہیں۔ مثال کے طور پر، Travis CI کے بجائے، آپ CircleCI یا Github Actions استعمال کر سکتے ہیں۔ اور اس کے بجائے DigitalOcean - AWS یا Linode۔

ہم نے Travis CI کے ساتھ کام کرنے کا فیصلہ کیا، اور میرے پاس اس سروس میں پہلے سے ہی کچھ ترتیب شدہ ہے۔ لہذا، اب میں مختصر طور پر کام کے لئے تیار کرنے کے بارے میں بات کروں گا.

ٹریوس سی آئی

ٹریوس سی آئی کوڈ کی جانچ اور تعیناتی کا ایک ٹول ہے۔ میں ٹریوس سی آئی کے قیام کی پیچیدگیوں میں نہیں جانا چاہوں گا، کیونکہ ہر پروجیکٹ منفرد ہے، اور اس سے زیادہ فائدہ نہیں ہوگا۔ لیکن اگر آپ Travis CI استعمال کرنے کا فیصلہ کرتے ہیں تو میں آپ کو شروع کرنے کے لیے بنیادی باتوں کا احاطہ کروں گا۔ چاہے آپ Travis CI، CircleCI، Jenkins، یا کچھ اور کا انتخاب کریں، اسی طرح کے کنفیگریشن کے طریقے ہر جگہ استعمال کیے جائیں گے۔

Travis CI کے ساتھ شروع کرنے کے لیے، پر جائیں۔ منصوبہ اور ایک اکاؤنٹ بنائیں. پھر Travis CI کو اپنے GitHub اکاؤنٹ کے ساتھ ضم کریں۔ سسٹم کو ترتیب دیتے وقت، آپ کو اس ذخیرہ کی وضاحت کرنے کی ضرورت ہوگی جس کے ساتھ آپ کام کو خودکار کرنا چاہتے ہیں اور اس تک رسائی کو فعال کرنا چاہتے ہیں۔ (میں GitHub استعمال کرتا ہوں، لیکن مجھے یقین ہے کہ Travis CI BitBucket، اور GitLab، اور اسی طرح کی دیگر خدمات کے ساتھ ضم کر سکتا ہے)۔

ہر بار جب 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

▍ٹیسٹنگ

کنفیگریشن فائل میں میں مقامی ٹریوس سی آئی سرور کو کنفیگر کرنے جا رہا ہوں۔ میں نے نوڈ 12 کو زبان کے طور پر منتخب کیا اور سسٹم سے کہا کہ ڈوکر کو استعمال کرنے کے لیے درکار انحصار انسٹال کرے۔

ہر وہ چیز جو درج ہے۔ .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

تعیناتی اسکرپٹ دو مسائل کو حل کرتی ہے:

  • سی آئی ٹول (ہمارے معاملے میں ٹریوس سی آئی) کا استعمال کرتے ہوئے تصویر کو بنائیں، ٹیگ کریں اور ڈوکر ہب کو بھیجیں۔
  • سرور پر تصویر لوڈ کرنا، پرانے کنٹینر کو روکنا اور ایک نیا شروع کرنا (ہمارے معاملے میں، سرور DigitalOcean پلیٹ فارم پر چلتا ہے)۔

سب سے پہلے، آپ کو تصویر کو ڈوکر ہب میں بنانے، ٹیگ کرنے اور آگے بڑھانے کے لیے ایک خودکار عمل ترتیب دینے کی ضرورت ہے۔ یہ سب کچھ اس سے بہت ملتا جلتا ہے جو ہم پہلے ہی دستی طور پر کر چکے ہیں، سوائے اس کے کہ ہمیں تصاویر کو منفرد ٹیگز تفویض کرنے اور لاگ ان کو خودکار کرنے کے لیے حکمت عملی کی ضرورت ہے۔ مجھے تعیناتی اسکرپٹ کی کچھ تفصیلات، جیسے ٹیگنگ کی حکمت عملی، لاگ ان، ایس ایس ایچ کی انکوڈنگ، ایس ایس ایچ کنکشن اسٹیبلشمنٹ میں دشواری تھی۔ لیکن خوش قسمتی سے میرا بوائے فرینڈ باش کے ساتھ بہت اچھا ہے، جیسا کہ بہت سی دوسری چیزوں کے ساتھ۔ اس نے اس اسکرپٹ کو لکھنے میں میری مدد کی۔

لہذا، اسکرپٹ کا پہلا حصہ تصویر کو Docker Hub پر اپ لوڈ کر رہا ہے۔ یہ کرنا کافی آسان ہے۔ میں نے جو ٹیگنگ اسکیم استعمال کی ہے اس میں گٹ ہیش اور گٹ ٹیگ کو ملانا شامل ہے، اگر کوئی موجود ہو۔ یہ یقینی بناتا ہے کہ ٹیگ منفرد ہے اور اس اسمبلی کی شناخت کرنا آسان بناتا ہے جس پر یہ قائم ہے۔ 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}

اسکرپٹ کا دوسرا حصہ کیا ہوگا اس کا انحصار اس بات پر ہے کہ آپ کس میزبان کو استعمال کررہے ہیں اور اس سے کنکشن کیسے منظم ہے۔ میرے معاملے میں، چونکہ میں ڈیجیٹل اوشین استعمال کرتا ہوں، میں سرور سے منسلک ہونے کے لیے کمانڈز استعمال کرتا ہوں۔ doctl. 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

توجہ دینے کے لئے کچھ چیزیں

یہ ممکن ہے کہ جب آپ 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)?

میں نے سیکھا کہ ایک سٹرنگ کلید کو بیس 64 میں انکوڈ کیا جا سکتا ہے تاکہ اسے اس شکل میں محفوظ کیا جا سکے جس میں اسے آسانی سے اور قابل اعتماد طریقے سے کام کیا جا سکے۔ تنصیب کے مرحلے پر، آپ عوامی کلید کو ڈی کوڈ کر کے اسے فائل میں لکھ سکتے ہیں۔ 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

اور یہ جو پیدا کرتا ہے وہ یہ ہے - ایک بیس 64 انکوڈ شدہ تار:

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 میں ریکارڈ کی ہیں۔ ڈیجیٹل اوشن کے معاملے میں، مثال کے طور پر، لوڈ بیلنس پر خودکار تجدید خود دستخط شدہ سرٹیفکیٹ بنانا ایک آسان، مفت اور تیز طریقہ ہے۔ اس نقطہ نظر کا اضافی فائدہ ہے کہ یہ ضرورت پڑنے پر لوڈ بیلنسر کے پیچھے چلنے والے متعدد سرورز پر SSL کو ترتیب دینا بہت آسان بناتا ہے۔ یہ سرورز کو خود SSL کے بارے میں "سوچنے" کی اجازت نہیں دیتا ہے، لیکن ساتھ ہی پورٹ کو معمول کے مطابق استعمال کرتا ہے۔ 80. لہذا لوڈ بیلنسر پر SSL ترتیب دینا SSL کو ترتیب دینے کے متبادل طریقوں سے کہیں زیادہ آسان اور آسان ہے۔

اب آپ سرور پر موجود تمام بندرگاہوں کو بند کر سکتے ہیں جو آنے والے کنکشن کو قبول کرتے ہیں - سوائے پورٹ کے 80، لوڈ بیلنسر اور بندرگاہ کے ساتھ بات چیت کرنے کے لیے استعمال کیا جاتا ہے۔ 22 SSH کے لیے۔ نتیجے کے طور پر، ان دونوں کے علاوہ کسی بھی بندرگاہ پر سرور تک براہ راست رسائی حاصل کرنے کی کوشش ناکام ہو جائے گی۔

کے نتائج

میں نے اس مواد میں جس چیز کے بارے میں بات کی وہ سب کچھ کرنے کے بعد، نہ تو ڈوکر پلیٹ فارم اور نہ ہی خودکار CI/CD زنجیروں کے تصورات نے مجھے مزید خوفزدہ کیا۔ میں ایک مسلسل انضمام کا سلسلہ قائم کرنے کے قابل تھا، جس کے دوران کوڈ کو پروڈکشن میں جانے سے پہلے ٹیسٹ کیا جاتا ہے اور کوڈ خود بخود سرور پر تعینات ہوجاتا ہے۔ یہ سب اب بھی میرے لیے نسبتاً نیا ہے، اور مجھے یقین ہے کہ میرے خودکار ورک فلو کو بہتر بنانے اور اسے مزید موثر بنانے کے طریقے موجود ہیں۔ لہذا اگر آپ کے پاس اس معاملے پر کوئی آئیڈیا ہے تو براہ کرم مجھے بتائیں۔ میرے لئے جانتے ہیں مجھے امید ہے کہ اس مضمون نے آپ کی کوششوں میں مدد کی ہے۔ میں یقین کرنا چاہتا ہوں کہ اسے پڑھنے کے بعد، آپ نے اتنا ہی سیکھا جتنا میں نے سیکھا جب کہ میں نے اس میں بات کی ہے۔

PS ہمارے میں بازار ایک تصویر ہے میں Docker، جسے ایک کلک میں انسٹال کیا جا سکتا ہے۔ آپ پر کنٹینرز کے آپریشن کو چیک کر سکتے ہیں۔ VPS. تمام نئے کلائنٹس کو 3 دن کی مفت جانچ دی جاتی ہے۔

پیارے قارئین! کیا آپ اپنے پروجیکٹس میں CI/CD ٹیکنالوجیز استعمال کرتے ہیں؟

CI/CD چین بنانا اور Docker کے ساتھ خودکار کام کرنا

ماخذ: www.habr.com

نیا تبصرہ شامل کریں