هڪ CI / CD زنجير ٺاهڻ ۽ Docker سان خودڪار ڪم

مون 90 جي ڏهاڪي ۾ منهنجي پهرين ويب سائيٽون لکيون. ان کان پوء ان کي ڪم ڪرڻ جي ترتيب ۾ رکڻ لاء تمام آسان هو. ڪجھ شيئر ڪيل ھوسٽنگ تي ھڪڙو اپاچي سرور ھو، توھان FTP ذريعي ھن سرور ۾ لاگ ان ڪري سگھوٿا ڪجھ لکي ftp://ftp.example.com. پوءِ توھان کي پنھنجو نالو ۽ پاسورڊ داخل ڪرڻو پوندو ۽ فائلن کي سرور تي اپلوڊ ڪرڻو پوندو. مختلف وقت هئا، هر شيءِ هاڻي جي ڀيٽ ۾ آسان هئي.

هڪ CI / CD زنجير ٺاهڻ ۽ Docker سان خودڪار ڪم

ان کان پوءِ ٻن ڏهاڪن ۾، هر شيءِ گهڻو بدلجي چڪي آهي. ويب سائيٽون وڌيڪ پيچيده ٿي چڪيون آهن؛ انهن کي پيداوار ۾ ڇڏڻ کان پهريان گڏ ڪيو وڃي. ھڪڙو اڪيلو سرور ڪيترائي سرور بڻجي ويا جيڪي لوڊ بيلنسرز جي پويان ڊوڙندا آھن، ۽ ورزن ڪنٽرول سسٽم جو استعمال عام ٿي ويو.

منهنجي ذاتي منصوبي لاءِ مون وٽ هڪ خاص تشڪيل هئي. ۽ مون کي خبر هئي ته مون کي صرف هڪ عمل ڪندي سائيٽ کي پيداوار ۾ ترتيب ڏيڻ جي صلاحيت جي ضرورت آهي: هڪ شاخ ڏانهن ڪوڊ لکڻ master GitHub تي. ان کان علاوه، مون کي خبر هئي ته منهنجي ننڍڙي ويب ايپليڪيشن جي آپريشن کي يقيني بڻائڻ لاء، مان هڪ وڏي ڪبرنيٽس ڪلستر کي منظم ڪرڻ، يا Docker Swarm ٽيڪنالاجي کي استعمال ڪرڻ، يا پوڊ، ايجنٽ ۽ ٻين سڀني قسمن سان سرورز جي بيبي کي برقرار رکڻ نه چاهيندو هو. پيچيدگيون. ڪم کي جيترو ٿي سگهي آسان بڻائڻ جي مقصد کي حاصل ڪرڻ لاءِ، مون کي CI/CD سان واقف ٿيڻو پوندو.

جيڪڏهن توهان وٽ هڪ ننڍڙو پروجيڪٽ آهي (هن صورت ۾، هڪ Node.js پروجيڪٽ) ۽ توهان ڄاڻڻ چاهيندا ته هن پروجيڪٽ جي ترتيب کي خودڪار ڪيئن ڪجي، جڏهن ته انهي ڳالهه کي يقيني بڻايو وڃي ته مخزن ۾ جيڪو ذخيرو ٿيل آهي بلڪل انهي سان ملندو آهي جيڪو پيداوار ۾ ڪم ڪري ٿو، پوء آئون سوچيو ته توهان هن مضمون ۾ دلچسپي رکي سگهو ٿا.

شرطون

هن آرٽيڪل جي پڙهندڙ کي توقع آهي ته ڪمانڊ لائن جي بنيادي سمجھ ۽ بش اسڪرپٽ لکڻ. ان کان علاوه، هن کي اڪائونٽن جي ضرورت پوندي ٽريس سي آء и ڊاکر حب.

مقصد

مان اهو نه چوندس ته هي مضمون غير مشروط طور تي "ٽيوٽوريل" سڏيو وڃي ٿو. هي هڪ وڌيڪ دستاويز آهي جنهن ۾ آئون ان بابت ڳالهائيندو آهيان جيڪو مون سکيو آهي ۽ ان عمل کي بيان ڪريان ٿو جيڪو مون لاءِ مناسب آهي پروڊڪشن لاءِ ڪوڊ کي جانچڻ ۽ ترتيب ڏيڻ لاءِ، هڪ خودڪار پاس ۾ ڪيو ويو.

اهو آهي جيڪو منهنجو ڪم فلو ختم ٿي رهيو آهي.

ڪوڊ لاءِ پوسٽ ٿيل ڪنهن به مخزن واري شاخ کان سواءِ master، هيٺيان عمل ڪيا ويا آهن:

  • Travis CI تي منصوبي جي تعمير شروع ٿئي ٿي.
  • سڀ يونٽ، انضمام ۽ آخر کان آخر تائين ٽيسٽ ڪيا ويا آهن.

صرف ڪوڊ لاءِ جيڪو اچي ٿو master، هيٺ ڏنل ڪم ڪيو ويندو آهي:

  • مٿي ذڪر ڪيل سڀ ڪجھ، گڏوگڏ ...
  • موجوده ڪوڊ، سيٽنگون ۽ ماحول جي بنياد تي ڊاکر تصوير جي تعمير.
  • تصوير کي ڊاڪر حب تي ترتيب ڏيڻ.
  • پيداوار جي سرور سان ڪنيڪشن.
  • Docker Hub کان سرور تي تصوير اپ لوڊ ڪندي.
  • موجوده ڪنٽينر کي روڪڻ ۽ نئين تصوير جي بنياد تي هڪ نئون شروع ڪرڻ.

جيڪڏهن توهان Docker، تصويرون ۽ ڪنٽينرز بابت بلڪل ڪجھ به نه ڄاڻو ٿا، پريشان نه ڪريو. مان توکي سڀ ڪجهه ٻڌائيندس.

CI/CD ڇا آهي؟

مخفف CI/CD جو مطلب آهي ”مسلسل انضمام/مسلسل تعیناتي“.

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

مسلسل انضمام هڪ عمل آهي جنهن ۾ ڊولپرز منصوبي جي مکيه سورس ڪوڊ ريپوزٽري (عام طور تي هڪ شاخ master). ساڳئي وقت، ڪوڊ جي معيار کي يقيني بڻايو ويو آهي خودڪار جاچ ذريعي.

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

مسلسل تعیناتي مسلسل، خودڪار طريقي سان ڪوڊ جي پيداوار ۾ ترتيب ڏيڻ آهي. CI/CD مخفف جو ٻيو حصو ڪڏهن ڪڏهن ”مسلسل ترسيل“ طور لکيو ويندو آهي. اهو بنيادي طور تي "مسلسل تعینات" جي طور تي ساڳيو آهي، پر "مسلسل ترسيل" جو مطلب آهي دستي طور تي تبديلين جي تصديق ڪرڻ جي ضرورت آهي پروجيڪٽ جي مقرري جي عمل کي شروع ڪرڻ کان اڳ.

شروع ڪرائڻ

جنهن ايپ کي مان هي سڀ سکڻ لاءِ استعمال ڪيو ان کي چئبو آهي نوٽ وٺو. هي هڪ ويب پروجيڪٽ آهي جنهن تي آئون ڪم ڪري رهيو آهيان، نوٽس وٺڻ لاءِ ٺهيل آهي. پهرين ۾ مون کي ڪرڻ جي ڪوشش ڪئي JAMStack-پروجيڪٽ، يا سرور کان سواءِ صرف هڪ فرنٽ-اينڊ ايپليڪيشن، معياري هوسٽنگ ۽ پروجيڪٽ جي ترتيب ڏيڻ جي صلاحيتن جو فائدو وٺڻ لاءِ جيڪا اها پيش ڪري ٿي. Netliify. جيئن ته ايپليڪيشن جي پيچيدگي وڌي وئي، مون کي ان جي سرور جو حصو ٺاهڻ جي ضرورت هئي، جنهن جو مطلب اهو هو ته مون کي پنهنجي حڪمت عملي ٺاهڻ جي ضرورت پوندي خودڪار انضمام ۽ منصوبي جي خودڪار ترتيب ڏيڻ لاء.

منهنجي صورت ۾، ايپليڪيشن هڪ ايڪسپريس سرور آهي جيڪو Node.js ماحول ۾ هلندو آهي، هڪ واحد-صفحو ريڪٽ ايپليڪيشن جي خدمت ڪندي ۽ هڪ محفوظ سرور-سائڊ API جي حمايت ڪندي. هي فن تعمير انهي حڪمت عملي جي پيروي ڪري ٿو جنهن ۾ ڳولي سگهجي ٿو ڏنو مڪمل اسٽيڪ جي تصديق جي گائيڊ.

مون سان صلاح ڪئي دوست، جيڪو هڪ آٽوميشن جو ماهر آهي، ۽ هن کان پڇيو ته مون کي ڇا ڪرڻ جي ضرورت آهي ته جيئن اهو سڀ ڪم ڪرڻ چاهيان. هن مون کي اهو خيال ڏنو ته هڪ خودڪار ورڪ فلو ڇا ڏسڻ گهرجي، هن مضمون جي گول سيڪشن ۾ بيان ڪيل. انهن مقصدن حاصل ڪرڻ جو مطلب اهو هو ته مون کي اهو معلوم ڪرڻو پوندو ته ڊڪر ڪيئن استعمال ڪجي.

Docker

Docker هڪ اوزار آهي، جيڪو ڪنٽينرائيزيشن ٽيڪنالاجي جي مهرباني، ايپليڪيشنن کي آساني سان ورهائڻ، ترتيب ڏيڻ ۽ ساڳئي ماحول ۾ هلائڻ جي اجازت ڏئي ٿو، جيتوڻيڪ Docker پليٽ فارم پاڻ مختلف ماحول ۾ هلندو آهي. پهرين، مون کي پنهنجا هٿ ڊاکر ڪمانڊ لائن ٽولز (CLI) تي حاصل ڪرڻ گهرجن. هدايتون Docker جي انسٽاليشن گائيڊ کي تمام صاف ۽ سمجھڻ وارو نه ٿو چئي سگھجي، پر ان مان توھان سکي سگھوٿا ته پھريون انسٽاليشن قدم کڻڻ لاءِ، توھان کي ڊائون لوڊ ڪرڻو پوندو ڊڪر ڊيسڪ ٽاپ (ميڪ يا ونڊوز لاءِ).

Docker Hub لڳ ڀڳ ساڳي شيء آهي GitHub git repositories، يا رجسٽري لاءِ نيٺ JavaScript پيڪيجز لاءِ. هي هڪ آن لائن مخزن آهي Docker تصويرن لاءِ. اھو اھو آھي جيڪو 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 مان هڪ تصوير ٺاهڻ

ڊڪر ٽيگ

تصوير

تصويري ٽيگنگ

گھٻرندڙ تصويرون

تصوير

تصويرن جي فهرست

ڊاکر هلائيندڙ

ڪنٽرول

ھڪڙي تصوير جي بنياد تي ھڪڙي ڪنٽينر کي هلائڻ

ڊڪر جو زور

تصوير

رجسٽري ۾ تصوير اپ لوڊ ڪريو

ڊڪر ڇڪڻ

تصوير

رجسٽري مان هڪ تصوير لوڊ ڪندي

ڊاکر پي

ڪنٽرول

لسٽنگ ڪنٽينرز

docker نظام prune

تصوير / ڪنٽينر

غير استعمال ٿيل ڪنٽينرز ۽ تصويرون کي هٽائڻ

▍Dockerfile

مان ڄاڻان ٿو ته مقامي طور تي پيداوار جي ايپليڪيشن کي ڪيئن هلائڻو آهي. مون وٽ هڪ Webpack ترتيب ڏنل آهي تيار ڪيل ريڪٽ ايپليڪيشن ٺاهڻ لاءِ. اڳيون، مون وٽ ھڪڙو حڪم آھي جيڪو بندرگاھ تي ھڪڙو Node.js ٻڌل سرور شروع ڪري ٿو 5000. اهو هن طرح نظر اچي ٿو:

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

اهو ياد رکڻ گهرجي ته مون وٽ هن مواد لاء هڪ مثالي درخواست نه آهي. پر هتي، تجربن لاء، ڪنهن به سادي نوڊ ايپليڪيشن ڪندا.

ڪنٽينر کي استعمال ڪرڻ لاءِ، توھان کي ڊاڪر کي ھدايتون ڏيڻيون پونديون. اهو هڪ فائل جي نالي سان ڪيو ويندو آهي Dockerfile، پروجيڪٽ جي روٽ ڊاريڪٽري ۾ واقع آهي. هي فائيل، پهرين ۾، ڪافي سمجھ کان ٻاهر لڳي.

پر ان ۾ ڇا شامل آهي صرف بيان ڪري ٿو، خاص حڪمن سان، ڪم ڪندڙ ماحول کي ترتيب ڏيڻ جي برابر. هتي انهن مان ڪجهه حڪم آهن:

  • کان - ھي حڪم ھڪڙي فائل شروع ڪري ٿو. اهو بيان ڪري ٿو بنيادي تصوير جنهن تي ڪنٽينر ٺهيل آهي.
  • 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> .

هن حڪم کي هلائڻ کان پوء، توهان ڏسي سگهو ٿا 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 Hub تي اپ لوڊ ڪيو آهي. ان جو مطلب اهو آهي ته اسان اڳ ۾ ئي پنهنجي مقصد ڏانهن تمام گهڻي ترقي ڪئي آهي. هاڻي اسان کي ٻه وڌيڪ سوال حل ڪرڻ گهرجن:

  • ڪوڊ جي جانچ ۽ ترتيب ڏيڻ لاءِ سي آءِ ٽول قائم ڪرڻ.
  • پيداوار جي سرور کي ترتيب ڏيو ته جيئن اهو اسان جو ڪوڊ ڊائون لوڊ ۽ هلائي سگھي.

اسان جي حالت ۾، اسان استعمال ڪندا آهيون ٽريس سي آء. هڪ سرور جي طور تي - Ditigal Ocean.

اها ڳالهه نوٽ ڪرڻ گهرجي ته هتي توهان خدمتن جي هڪ ٻيو ميلاپ استعمال ڪري سگهو ٿا. مثال طور، بدران Travis CI، توهان استعمال ڪري سگهو ٿا CircleCI يا Github عمل. ۽ بجاء DigitalOcean - AWS يا Linode.

اسان Travis CI سان گڏ ڪم ڪرڻ جو فيصلو ڪيو، ۽ مون وٽ اڳ ۾ ئي ڪجھ ترتيب ڏنل آھي ھن خدمت ۾. تنهن ڪري، هاڻي آئون مختصر طور تي ڳالهائيندس ته ڪيئن ڪم لاء تيار ڪرڻ.

ٽريس سي آء

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، ۽ ڇا اهو پروجيڪٽ جي تعمير جي عمل کي ٽوڙي ڇڏيندو. هن عالمي ترتيب ۾، مان هر شي کي مقامي طور تي نصب ڪريان ٿو، پس منظر ۾ ويب پيڪ ڊيو سرور کي هلائي ٿو (هي منهنجي ڪم جي فلو جي هڪ خاصيت آهي)، ۽ ٽيسٽ هلائڻ.

جيڪڏهن توهان چاهيو ٿا ته توهان جو مخزن ٽيسٽ ڪوريج آئڪن کي ڏيکاري، هتي توھان ھن معلومات کي گڏ ڪرڻ ۽ ڊسپلي ڪرڻ لاءِ 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

مقرري اسڪرپٽ ٻه مسئلا حل ڪري ٿو:

  • ٺاھيو، ٽيگ ڪريو ۽ تصوير موڪليو Docker Hub ڏانھن سي آءِ اوزار استعمال ڪندي (اسان جي صورت ۾، ٽريس سي آءِ).
  • سرور تي تصوير لوڊ ڪندي، پراڻي ڪنٽينر کي روڪيو ۽ هڪ نئون شروع ڪيو (اسان جي صورت ۾، سرور ڊجيٽل اوشن پليٽ فارم تي هلندو آهي).

پهرين، توهان کي هڪ خودڪار عمل قائم ڪرڻ جي ضرورت آهي عمارت، ٽيگنگ، ۽ تصوير کي ڊاکر هب ڏانهن ڌڪڻ لاء. اهو سڀ ڪجهه ان سان ملندڙ جلندڙ آهي جيڪو اسان اڳ ۾ ئي دستي طور ڪيو آهي، سواءِ ان جي ته اسان کي تصويرن تي منفرد ٽيگ لڳائڻ ۽ لاگ ان خودڪار ڪرڻ جي حڪمت عملي جي ضرورت آهي. مون کي ڊيپلائيمينٽ اسڪرپٽ جي ڪجهه تفصيلن سان مشڪل هئي، جهڙوڪ ٽيگنگ حڪمت عملي، لاگ ان، SSH ڪيئي انڪوڊنگ، SSH ڪنيڪشن اسٽيبلشمينٽ. پر خوشقسمتيءَ سان منهنجو بواءِ فرينڊ بيش سان تمام سٺو آهي، جيئن ٻين ڪيترين ئي شين سان. هن اسڪرپٽ لکڻ ۾ منهنجي مدد ڪئي.

تنهن ڪري، اسڪرپٽ جو پهريون حصو تصوير کي اپ لوڊ ڪري رهيو آهي Docker Hub. اهو ڪرڻ بلڪل آسان آهي. ٽيگنگ اسڪيم جيڪا مون استعمال ڪئي ان ۾ شامل آهي هڪ گٽ هيش ۽ هڪ گٽ ٽيگ کي گڏ ڪرڻ، جيڪڏهن هڪ موجود آهي. اهو يقيني بڻائي ٿو ته ٽيگ منفرد آهي ۽ اهو آسان بڻائي ٿو ته اسيمبلي جي سڃاڻپ ڪرڻ لاء جنهن تي اهو ٻڌل آهي. DOCKER_USERNAME и DOCKER_PASSWORD صارف ماحول جي متغير آھن جيڪي ٽريس سي آء انٽرفيس استعمال ڪندي سيٽ ڪري سگھجن ٿيون. 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}

اسڪرپٽ جو ٻيو حصو ڇا هوندو مڪمل طور تي ان تي منحصر آهي ته توهان ڪهڙي ميزبان کي استعمال ڪري رهيا آهيو ۽ ان جو ڪنيڪشن ڪيئن منظم ڪيو ويو آهي. منهنجي حالت ۾، جڏهن کان مان ڊجيٽل سمنڊ استعمال ڪريان ٿو، مان سرور سان ڳنڍڻ لاءِ حڪم استعمال ڪريان ٿو ڊاڪٽر. جڏهن AWS سان ڪم ڪندي، افاديت استعمال ڪئي ويندي aws، ۽ ايئن.

سرور قائم ڪرڻ خاص مشڪل نه هو. تنهن ڪري، مون بنيادي تصوير جي بنياد تي هڪ بوند قائم ڪيو. اهو ياد رکڻ گهرجي ته سسٽم جيڪو مون چونڊيو آهي، هڪ دفعي ڊڪر جي دستي تنصيب ۽ ڊڪر جي هڪ دفعي دستي لانچ جي ضرورت آهي. مون ڊڪر کي انسٽال ڪرڻ لاءِ Ubuntu 18.04 استعمال ڪيو، پوءِ جيڪڏھن توھان پڻ استعمال ڪري رھيا آھيو 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

ڌيان ڏيڻ لاء ڪجهه شيون

اهو ممڪن آهي ته جڏهن توهان سرور سان ڳنڍيو 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)?

مون سکيو ته هڪ اسٽرنگ ڪيئي کي بنيادي 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 ترتيب دستي طور تي، تنهن ڪري مون صرف هڪ لوڊ بيلنس ٺاهيو ۽ ان جا تفصيل ڊي اين ايس ۾ رڪارڊ ڪيا. DigitalOcean جي صورت ۾، مثال طور، لوڊ بيلنس تي خودڪار تجديد خود دستخط ٿيل سرٽيفڪيٽ ٺاهڻ هڪ سادي، مفت ۽ تيز طريقو آهي. هن طريقي سان اضافو فائدو آهي ته اها ضرورت هجي ته لوڊ بيلنس جي پويان هلندڙ ڪيترن ئي سرورن تي ايس ايس ايل قائم ڪرڻ تمام آسان بڻائي ٿي. اهو سرورن کي پاڻ کي اجازت ڏئي ٿو ته "سوچڻ" جي باري ۾ SSL بابت هرگز نه، پر ساڳئي وقت بندرگاهن کي معمول وانگر استعمال ڪريو 80. تنهن ڪري لوڊ بيلنس تي SSL ترتيب ڏيڻ تمام آسان ۽ وڌيڪ آسان آهي SSL ترتيب ڏيڻ جي متبادل طريقن کان.

ھاڻي توھان بند ڪري سگھوٿا سرور تي سڀ بندرگاھ جيڪي ايندڙ ڪنيڪشن قبول ڪن ٿا - سواءِ بندرگاھ جي 80، لوڊ بيلنسر ۽ بندرگاهه سان رابطو ڪرڻ لاءِ استعمال ڪيو ويو 22 SSH لاء. نتيجي طور، انھن ٻنھي کان سواءِ ٻي ڪنھن بندرگاھ تي سرور تائين پھچڻ جي ڪوشش ناڪام ٿي ويندي.

نتيجو

مون سڀ ڪجھ ڪرڻ کان پوءِ مون هن مواد ۾ ڳالهايو ، نه ته ڊاڪر پليٽ فارم ۽ نه ئي خودڪار سي آءِ / سي ڊي زنجيرن جا تصور مون کي وڌيڪ خوفزده ڪيو. مان هڪ مسلسل انضمام جي زنجير کي قائم ڪرڻ جي قابل ٿي چڪو آهيان، جنهن دوران ڪوڊ ٽيسٽ ڪيو ويندو آهي ان کان اڳ پيداوار ۾ وڃڻ کان اڳ ۽ ڪوڊ خودڪار طريقي سان سرور تي لڳايو ويندو آهي. اهو سڀ ڪجهه اڃا تائين مون لاءِ نسبتاً نئون آهي، ۽ مون کي پڪ آهي ته منهنجي خودڪار ڪم جي فلو کي بهتر ڪرڻ ۽ ان کي وڌيڪ ڪارائتو بڻائڻ جا طريقا موجود آهن. تنهن ڪري جيڪڏهن توهان وٽ هن معاملي تي ڪي خيال آهن، مهرباني ڪري مون کي خبر ڏيو. مون ڏانهن ڄاڻ مون کي اميد آهي ته هي مضمون توهان جي ڪوششن ۾ توهان جي مدد ڪئي آهي. مان يقين ڪرڻ چاهيان ٿو ته ان کي پڙهڻ کان پوءِ، توهان تمام گهڻو سکيو جيترو مون سکيو آهي، جڏهن ته مون ان ۾ جيڪا ڳالهه ڪئي آهي، ان جي هر شيءِ جو اندازو لڳايو آهي.

پي ايس اسان ۾ بازار اتي هڪ تصوير آهي Dockerجنهن کي هڪ ڪلڪ ۾ انسٽال ڪري سگهجي ٿو. توھان چيڪ ڪري سگھو ٿا ڪنٽينرز جي آپريشن تي VPS. سڀني نون گراهڪن کي 3 ڏينهن جي مفت ٽيسٽ ڏني وئي آهي.

پيارا پڙهندڙن! ڇا توھان پنھنجي منصوبن ۾ CI/CD ٽيڪنالاجي استعمال ڪندا آھيو؟

هڪ CI / CD زنجير ٺاهڻ ۽ Docker سان خودڪار ڪم

جو ذريعو: www.habr.com

تبصرو شامل ڪريو