برنامه نویس node js و DevOps کار - دانشآموخته اقتصاد علاقهمند به کارآفرینی و استارتاپ ها - sadeghmohebbi.ir
کار با Gitlab CI/CD برای یکپارچه سازی پیوسته (Continuous Integration)
سلامی دوباره ... یادمه همین دو سه ماه پیش بود که ما در حین کار متوجه شدیم که طبق زمان بندی شون توی این پست Gitlab تحریمون کرده حتی یک issue هم براش درست شده توی گیت لب! خب اول یه مقدار به مشکلاتی برخوردیم ولی خوشبختانه GitLab اپن سورس بود و فرداش روی سرور مون یکیش رو نصب کردیم و همه چیز به روال عادی (سریع تر و بهتر از قبل) برگشت. غرض این که می خواستم بگم ابتدا GitLab ce روی سرور خودتون یا برای تست روی لوکال نصب کنید. راهنمای جامع و بسیار خوبی توسط خود گیت لب توی لینک زیر هست
https://about.gitlab.com/installation/
مشکل کجاست و راه حل!؟
من در چندپر هر روز به هزاران مشکل و باگ برمی خورم تا حدی که تسک های من (بک اند) ۲ تا ۳ برابر فرانت هست و البته تسک های انجام شده من هم همین طور! خب این مشکلات به سرعت روی لوکال برطرف می شه و طبق پیش بینی دوستان فرانت باید سریع روی سرور این کد ها اعمال بشه تا کارها راه بیوفته. برای این کار من ssh می زدم بعدش مراحل build و run رو دستی انجام می دادم. این کار سرعت من رو خیلی کم می کرد و از طرفی ضریب اشتباه رو بالا می برد (یادمه یه بار فولدر عکس هایی که دوستان اضافه کرده بودن و حدود ۴۰ تا عکس بود رو پاک کردم!) این موضوع برای آپدیت های فرانت به مراتب سخت تر بود و در این وضعیت چاره ای جز پیدا کردن راه حل وجود نداره!
اخیرا با مفهومی آشنا شدم به نام Continuous Integration که میاد مراحل تست و اجرای برنامه هارو سریع تر و اتوماتیک و کوتاه تر می کنه. من با این موضوع برای اولین بار از طریق این دوره ی فرانش آقای طحانی آشنا شدم. ابزار های زیادی برای این کار وجود داره و از چندتاشون می شه Jenkins و Circle CI و Travis رو نام برد. در این نوشته ی کوتاه ما می خوایم روش کار با GitLab Runner رو بررسی کنیم چون به نظرم واقعا قدرتمند و در عین حال سادست. سناریو ما به این صورت بود که ما دو تا سرور یکی برای تست و یک سرور اصلی داریم. ما توی هر دو تا سرور یک پکیج کوچیک به نام gitlab runner رو نصب کنیم تا بیاد کامند های لازم رو به صورت اتوماتیک به ازای هر git push روی سرور تست اجرا کنه و هر وقت لازم بود بتونیم از توی gitlab کد هامون رو روی سرور اصلی (بدون نیاز به ssh کردن و ...) اپدیت و اجرا کنیم. فکر می کنم این یه نمونه مثال ساده ولی کاربردیه چون باهاش می شه هر کاری که بخوایم به طور اتوماتیک روی سرور انجام بدیم ... خب البته gitlab runner امکانات زیادی داره که فعلا ازش می گذریم (نیاز پیدا نکردم بهشون!)
نصب و راه اندازی
به روز رسانی ۲۴ مرداد ۹۸: روش نصب بهتر و جدیدی توسط گیت لب پیشنهاد شده که از لینک زیر می تونید دنبال کنید: https://docs.gitlab.com/runner/install/linux-repository.html
از اینجا می تونید خیلی راحت روی سیستم خودتون نصب کنید (تقریبا شبیه همه هستند) ولی من در اینجا طریقه ی نصب روی cent os رو می ذارم به همراه یه تجربه ای که بهش برخورد کردم (منبع کد های زیر از این صفحه است با اندکی تغییر)
کامند های زیر میاد پکیج مورد نظر رو از مخرن مربوطه دانلود می منه و توی پوشه خودش ذخیره می کنه.
# Linux x86-64
sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
# Linux x86
sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-386
# Linux arm
sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-arm
بعدش میایم با کامند زیر به پکیج دانلود شده دسترسی execute شدن رو می دیم.
sudo chmod +x /usr/local/bin/gitlab-runner
یه نکته این که توی داکیومنتیشن اصلی یه مرجله اینجا داره که میاد یک یوزر جدید به نام gitlab-runner به سیستم ما اضافه (useradd) می کنه. اگر می خواید کد هاتون با یوزر فعلی یا روت اجرا بشه اون مرحله رو بیخیال بشید. می ریم سراغ مرحله ی بعدی
gitlab-runner install --user=<user name> --working-directory=<user home directory>
sudo gitlab-runner start
من خودم می خواستم کد های بیلد و اجرای اپ با کاربر root اجرا بشن به همین خاطر از کامند های زیر استفاده کردم. ضمنا ممکنه سیستم خطای command not found بده که مشکلی نیست و باید از دایرکتوری نصبش استفاده کرد. خلاصه ی کلام می شه کامند های زیر:
/usr/local/bin/gitlab-runner install --user=root --working-directory=/root
sudo /usr/local/bin/gitlab-runner start
خب در اینجا نصب Gitlab Runner به پایان رسید. می تونید با کامند زیر از صحت نصب مطمئن بشید:
gitlab-runner --version
شناسوندن یا register کردن به GitLab
برای بهره برداری ابتدا باید GitLab Runner رو که به تازگی نصب کردید رو به پروژه تون register کنید. برای این کار به منوی Settings > CI / CD برید و در بخش Runners با صفحه ی زیر مواجه می شید:
مطالعه ی سریع توضیحات خود GitLab هم خالی از لطف نیست! خب .. پایین تر برید تا به بخش Setup a specific Runner manually برسید (من آدرس و توکن مربوطه توی عکس رو خراب کردم)
حالا با کامند زیر مراحل register کردن رو شروع می کنیم:
gitlab-runner register
بعدش میاد آدرس و توکن و نام و تگ و نوی script اجرایی رو می پرسه و شما هم اطلاعات رو وارد می کنید و سپس اینتر رو می زنید. البته حواس تون هست که نام و تگ runner هم مهمه چون بعدا لازمش داریم (پس یه اسم معنی دار و درست و حسابی براش تعیین کنید مثلا development یا production یا ... !!!)
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
<آدرسی که توی گیت لب دارید>
Please enter the gitlab-ci token for this runner:
<توکن پایینش توی همون گیت لب>
Please enter the gitlab-ci description for this runner:
> development
Please enter the gitlab-ci tags for this runner (comma separated):
> production,root
Registering runner... succeeded runner=fx-sadGwkx
Please enter the executor: docker-ssh, docker-ssh+machine, ssh, virtualbox, docker+machine, kubernetes, docker, parallels, shell:
> shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
همون جا توی گیت لب اگر صفحه رو رفرش کنید یه بخشی دقیقا پایین عکس قبلی به نام Runners activated for this project ایجاد می شه که وضعیت اتصال runner ها رو نشون می ده (برای هر پروژه می تونید چندین runner داشته باشید) و حدودا بعد ۳ الی ۴ دقیقه وقتی که سبز شد یعنی که همه چیز درست انجام شده (نکته ی قابل توجه اینه که خیلی از runner ها به دلیل نقص فنی در این مرحله جون سالم به در نمی برن پس صبور باشید و مصمم !)
تنظیم برای پروژه
یه فایلی رو بایستی با نام زیر توی روت پروژه تون ایجاد کنید:
.gitlab-ci.yml
خود GitLab در اینجا یه داکیومنت فوق العاده داره برای ایجاد و تنظیم این فایل و البته به با کلی مثال در اینجا ولی من خودم از کد های زیر برای تنظیم این فایل استفاده کردم. در واقع میام برای هر پوش یه گیت clone و سپس npm install و ادامه که مشخصه. development اسم همون runner هست که مشخص کردیم و when یا مقدار always میاد روی هر git push این script رو انجام می ده
deploy-core-test:
script: 'npm install;pm2 startOrRestart ecosystem.config.js --update-env'
when: "always"
tags:
- "development"
variables:
GIT_STRATEGY: 'clone'
در منوی سمت چپ صفحه ی پروژه تون توی GitLab یک بخشی هست به نام CI / CD که به طور خلاصه میاد وضعیت کار هایی (Jobs) که به gitlab runner سپردین رو نمایش میده و خیلی مدیریت و کنترل و برنامه ریزی روی اون ها لذت بخش هست.
امیدوارم به دردتون بخوره...حتما gitlab runner این طور که نشون می ده ابزاری بسیار خفن تر از این حرفاست. این کار من مثل اینه که بیایم از لپ تاپ برای فیلم دیدن استفاده کنیم! البته که فیلم دیدن خیلی خوبه ولی انصافا کلی کار می شه باهاش کرد که من بهره ای نبردم...
پس نوشت: من اول داشتم با Jenkins ور می رفتم ولی بعد از دو سه روز تلاش و اذیت بنده به نتیجه ای نرسید. به همین خاطر رفتم سراغ GitLab :)
مطلبی دیگر از این انتشارات
معرفی محله و مراکز مهم سعادت آباد تهران
مطلبی دیگر از این انتشارات
refactor یک برنامه sync به async در ASP.NET - بخش اول
مطلبی دیگر از این انتشارات
مهم ترین نکته امنیتی که تو کدت نادیدش گرفتی ?