راهنمای راه اندازی CD به کمک GitLab

امیرحسین بقایی • ۲۸ بهمن ۱۳۹۸

CI/CD

توی این مطلب میخوایم با هم دیگه یاد بگیریم چطور میتونیم یک pipeline خیلی ساده برای Continuous Delivery کردن نرم‌افزارمون روی بستر لیارا به کمک GitLab داشته باشیم.

پیش نیازهای این مطلب چیه؟ تقریباً هیچی به جز اینکه بدونیم git چیه و یک اکانت GitLab داشته باشیم و یک نرم‌افزار هیجان‌انگیز برای تحویل دادن به کاربران!

مقدمه کوتاهی بر GitLab CI

به صورت خیلی خلاصه GitLab به ما این امکان رو میده که بتونیم بهش بگیم هر وقت Commit خاصی روی Branch خاصی انجام شد یک سری کار برامون انجام بده. مثلا اینطوری در نظر بگیرید که هر وقت که توی Branch Master پروژه Commit‌ای زده شد باید پروژه Clone بشه، پیش نیازهاش نصب بشه، Test‌هاش اجرا بشه و اگر مشکلی نداشت، نسخه جدید نرم‌افزار جایگزین نسخه قبلی بشه. همه این کارها به راحتی نوشتن چند خط Config توی یک فایل به اسم .gitlab-ci.yml انجام میشه. این امکان GitLab در عین این که رایگانه ولی محدودیت‌هایی هم داره. میتونید اینجا درباره ویژگی‌های حالت رایگانش بیشتر بخونید.

آماده سازی محیط توسعه و طرح سناریوی فرضی

فرض میکنیم یک برنامه ساده با Nodejs توسعه داده ایم. تیم توسعه نرم‌افزارمون داره نرم‌افزار رو پیش میبره و حالا وقتشه که یک نسخه خوب تحویل مشتری بده. برنامه نویس ارشد بعد از Review کردن کدهای Branch مربوطه و دیدن نتایج Test‌ها و رفتار نرم‌افزار تصمیم میگیره نرم‌افزار رو به Master Branch انتقال بده و اصطلاحا یک نسخه Stable تحویل مشتری بده. کدهای نرم‌افزار روی GitLab نگهداری میشه و خود نرم‌افزار روی بستر لیارا در حال اجراست.

حالا بریم ببینیم چطور میشه خیلی راحت و در عین‌حال خیلی مطمئن نرم‌افزار منتشر شده رو به روز کرد!

بررسی کدهای نرم‌افزار تستی

کدهای نرم‌افزار از طریق این لینک قابل مشاهده و بررسی میباشد. یک Web Server ساده که یک فایل HTML رو Serve میکنه.

var express = require('express');
var morgan = require('morgan')
var app = express();
var path = require('path');

app.use(morgan('tiny'))
app.use(express.static('public'))

app.get('/', function(req, res) {
    res.sendFile(path.join(__dirname + '/index.html'));
});

app.listen(8000, () => console.log(`Example app listening on port 8000!`));

وقتشه که دست به کار بشیم!

کافیه وارد بخش برنامه ها بشید و روی دکمه ایجاد برنامه کلید کنید و یک برنامه Nodejs‌ای با شناسه دلخواهتون که در اصل شناسه برنامه در نظر گرفته میشه، درست کنید.

ابزار CLI لیارا رو نصب میکنیم: npm install -g @liara/cli

و بعدش توی حساب کاربری‌مون وارد میشیم: liara login

خب حالا کافیه این پروژه تستی رو Clone کنیم و داخل دایرکتوری برنامه بشیم:

git clone https://github.com/liara-ir/cd-example
cd cd-example

اگر به فایل liara.json نگاه بکنید متوجه میشید که اسم پروژه تستی ما hello-world در نظر گرفته شده است. شما باید این اسم رو متناسب با اون شناسه‌ای که در مرحله قبل به برنامه‌تون اختصاص دادید تغییر بدید.

به راحتی با زدن دستور liara deploy پروژه مون رو روی لیارا مستقر میکنیم!

استقرار اولیه

خب تا اینجا ما یک برنامه ساده که روی سیستم خودمون درست کرده بودیم رو به بستر لیارا منتقل کردیم. اگر هنوز هم براتون بعضی از مراحل این گام ابهام داره کافیه این بخش از مستندات رو مطالعه کنید.

بعد از ثبت نام توی GitLab.com کافیه یک Repo با اسم دلخواه درست کنید (من اینجا اسمش رو hello-world گذاشتم) و پروژه تستی رو که در مرحله قبل Clone کردید، مجدد داخل Repo جدیدی که ایجاد کردید، Push کنید، اینطوری:

git remote rename origin old-origin
git remote add origin https://gitlab.com/YOUR_USERNAME_IN_GITLAB/GITLAB_REPO_NAME.git
git push -u origin master

به محتویات فایل ‍.gitlab-ci.yml دقت کنید:

image: node:12-alpine

stages:
  - update-production

deploy:
  stage: update-production
  only:
    - master  
  before_script:
    - npm install -g @liara/cli@2
  script:
    - liara deploy --app $PROJECT_NAME --detach --api-token $TOKEN

هر وقت Commit‌ای روی برنچ Master صورت بگیره GitLab این فایل رو به یک Runner تحویل میده. Runner‌ها سرورهایی هستند که وظیفه شون اینه پروژه‌ها رو Build میکنند و اصلاحا pipeline‌ها رو اجرا میکنند. Runner‌ها اول به صورت پیشفرض داخل یک ماشین داکر که ما گفتیم چی باشه (اینجا node:12-alpine) پروژه ما رو Clone میکنند و بعد کارها رو طبق فایل شروع میکنند. تو این فایل ما برای سادگی فقط یک Stage تعریف کردیم. Stage‌ها مثل مراحل مختلف یک Pipeline هستند که ما مشخص میکنیم با چه ترتیبی اجرا بشن. اینجا فقط یک Stage داریم به اسم update-liara. هر ‌Stage میتونه چندین Job داشته باشه. اینجا ما یک Job داریم به اسم deploy که وظیفه اش اینه که ابزار CLI لیارا رو نصب میکنه و بعد میگه دستور deploy رو اجرا کن! به همین سادگی. (در نظر داشته باشید که در ابتدای کار Runner، پروژه شما Clone شده و همه این Command‌ها داخل دایرکتوری root پروژه شما زده میشه.) اگر به منوی CI/CD توی پنل GitLab پروژه‌تون مراجعه کنید احتمالا میبینید که پروژه داره Build میشه! ولی خب به مشکل میخوره چون باید کارهای بخش بعد رو هم انجام بدید! یعنی تنظیم ENV‌های ضروری مثل Token حساب کاربری‌تون در لیارا.

اول از همه Token حساب کاربری‌تون رو از این جا کپی کنید.

بعدش کافیه به بخش تنظیمات CI/CD در پنل GitLab‌تون برید و در بخش Variables خیلی راحت Token‌تون رو اضافه کنید. همچنین شناسه برنامه‌تون رو هم اینجا باید وارد کنید. (مقادیر رو با اسامی TOKEN و PROJECT_NAME وارد کنید. چون توی فایل .gitlab-ci.yml از این اسامی استفاده کردیم.)

تغییر ENV ها


میتونید هر اسمی برای این ENV‌ها در نظر بگیرید ولی خب باید توی فایل .gitlab-ci.yml ‌تون هم تغییرش بدید.

خب یکبار دیگه یک Commit دیگه روی پروژه روی Branch Master بزنید. و از توی پنل GitLab و از بخش CI/CD میتونید ببینید چه اتفاقی در حال رخ دادنه:

عملیات Build و Deploy

اگر همه چیز درست پیش بره باید بتونید توی پنل لیارا ببنید برنامه در حال مستقر شدنه:

عملیات Build و Deploy


حالا برای اطمینان از این که همه چیز واقعا درست کار میکنه میتونید یک تغییر توی پروژه بدید مثلا متن فایل HTML رو عوض کنید و روی branch master کامیت کنیدش تا ببینید چه قدر راحت برنامه داره به روز میشه.

به روز شدن برنامه


در پایان لازمه اشاره کنیم که شما میتونید هر طور که دوست دارید سازوکار‌های CI/CD خودتونو بچینید و این پروژه فقط یک تست برای این بود که به شما ایده بده چطور میشه همچین چیزی رو در ساده ترین حالتش پیاده کرد و عملی کرد. همچنین ابزار قدرتمند GitLab CI دارای امکانات و ویژگی‌های خیلی زیادیه که میتونید با مطالعه مستنداتش در این لینک تسلط خوبی پیدا کنید. همچنین اگر مشکلی در پیاده سازی CI/CD پروژه‌هاتون وجود داره میتونید از پشتیبانی لیارا کمک بگیرید.

برای ارائه پیشنهادات و یا نظرات‌ درباره لیارا، می‌توانید از طریق توئیتر، تلگرام و یا اینستاگرام با ما در ارتباط باشید.