یکی از مفاهیم پايهی DevOps و توسعهی سریع نرم افزارها استقرار سیستم های CI/CD و تنظیم آنها جهت توسعه، تست و انتشار سریعتر نرمافزار است.
برای این کار میتوان از GitLab یا Jenkins استفاده کرد که برای محیط های توسعه کوچک تا متوسط استفاده از گیتلب پیشنهاد میشود.
اگر تا به حال از محیط های CI/CD استفاده نکردهاید بهتر از یکی از آنها را تست کنید و به سمت توسعهی مدرنتر نرمافزارتان قدم بردارید.
همچنین در صورتی که مشتاق به راه اندازی یک محیط CI/CD با استفاده از GitLab و Docker هستید، خواندن این نوشته خالی از لطف نیست.
در ادامه ما قصد داریم راه اندازی اولیه GitLab با استفاده از Docker را انجام دهیم. ما از Docker در داخل یک VPS برای میزبانی نمونه GitLab خود استفاده خواهیم کرد، در هنگام ساختن، اجراکننده های GitLab را به دلخواه تولید می کنیم و ایمیج Docker ایجاد می کنیم. با انجام مراحل گفته شده، میتوانیم build را با استفاده از استک دلخواه، اعم از Go، NodeJS، Java و غیره انجام دهیم.
برای انتخاب مناسب ترین سخت افزار ممکن، لازم است بدانیم دقیقا با سرورمجازی چکار میکنیم؟
در زیر لیست مواردی که بر روی سرور انجام میشود به همراه منابع مورد نیاز آورده شده است :
در صورتی که عملیات سنگیت با runner های فراوان اجرا کنید، نیازمند سخت افزار به مراتب قدرتمندتری خواهید بود.
در خصوص فضای دیسک مورد نیاز، لازم است بسیار سخاوتمندانه عمل کنید. GitLab بیش از حد از دیسک ذخیره سازی (هارددیسک) استفاده می کند. علاوه بر CI/CD و انجام آن، مخزن Git و حافظه پنهان ما نیز در همین سرور قرار خواهد گرفت. تنها چیزی که ما به صورت جدی نیاز داریم دیسک و رم است.
شما متیوانید میزان CPU کمتری را برای سرورمجازی خود سفارش دهید، چرا که این مورد صرفا زمان build شده نرم افزار را تحت تاثیر قرار میدهد و یک مورد حیاتی برای کارکرد سیستم CI/CD محسوب نمیشود.
مراحل انجام کار به ترتیب آورده شده است :
قبل از هرچیزی از نصب صحیح داکر و همچنین کارکرد آن مطمئن شوید.
پس از نصب Docker، اولین قدم برای تنظیم محیط، اجرای ایمیج GitLab در داخل دستگاه میزبان است. بنابراین GitLab در داخل یک کانتینر docker اجرا می شود، اما از دیسک ماشین میزبان برای ذخیره داده ها و بارگذاری تنظیمات استفاده می کند.
sudo docker run --detach \ --hostname gitlab.example.com \ --publish 127.0.0.1:4443:443 --publish 127.0.0.1:4000:80 \ --name gitlab \ --restart always \ --volume /srv/gitlab/config:/etc/gitlab \ --volume /srv/gitlab/logs:/var/log/gitlab \ --volume /srv/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest
در دستورات بالا، hostname ماشین gitlab.example.com در نظر گرفته شده است، پورت های 443, 80, 22 را بر روی سرور باز بگذارید و در دستور بالا آنها را به پورت های مشابه بر روی کانتینتر map میکنیم و در ادامهی این دستور volume های کانتینر را به ماشین میزبان یا همان هاست متصل میکنیم.
نکته : این پوشهها در ماشین میزبان نگهداری میشوند، به این معنی که این مکانها در راهاندازی مجدد کانتینر و ارتقای GitLab بدو تغییر خواهند ماند. اگر نسخه ارتقا یافته GitLab را با استفاده از یک کانتینر اجرا کنیم و همان پوشه ها را به همان مکان های میزبان نقشه برداری کنیم، می توانیم از داده های قدیمی شما با نسخه جدید GitLab دوباره استفاده کنیم.
همچنین دقت داشته باشید که در چنین حالتی مسیر تنظیمات پیش فرض نرم افزار gitlab که در آموزش ها و مستندات آن به صورت /etc/gitlab ذکر شده تبدیل به /srv/gitlab/config خواهد شد.
معمولا مستندات gitlab را طوری در نظر میگیرند که بر روی دستگه میزبان نصب شده باشد، اما در خصوص پروژهی ما، این مورد با استفاده از کانتینر راه اندازی شده و اندکی متفاوت است.
همچنین در دستورات بالا چنین عبارتی را داریم : 127.0.0.1:4443:443 --publish 127.0.0.1:4000:80
این بدان معناست که i/o فقط به لوکال هاست محدود می شود. پورت های 4443 و 4000 کانتینر هرگز در معرض شبکهی خارج از سرور میزبان قرار نمی گیرند و ما از یک پروکسی معکوس Nginx یا همان reverse proxy نصب شده در سرورمجازی برای دسترسی به URL ها استفاده خواهیم کرد.
ما می خواهیم GitLab فقط از طریق HTTPS و بر بستر یک SSL صحیح، با نام دامنه دلخواهمان، نمایش داده شده و لود شود، نام این دامنه را mydomain.com فرض میکنیم. برای تکمیل این مرحله، باید تنظیمات مورد نیازتان را سمت رجیسترار دامنه انجام دهید.
روش راهاندازی در ثبتکنندههای نام دامنه متفاوت است، اما اصل قضیه یعنی تعریف رکوردهای مورد نیاز در تمامی پنل ها یکسان است.
در این کنترل پنل، نام سابدامین (در این مورد، git) را روی IP سرورمجازی خود قرار می دهیم. در اینجا تصور میکنیم که IP سرور 55.55.55.55 باشد. تنظیمات NameServer ما اکنون باید به این شکل باشد (ممکن است موارد بیشتری جهت تعریف وجود داشته باشد، اما آنها به سناریو مربوط نمیشوند)
در قسمت بعد به نصب و راه اندازی Nginx پرداخته و همچنین گواهینامه SSL بر روی سابدامین پروژه نصب کرده و به عنوان نمونه، یک پروژه بر روی این سناریو تعریف خواهیم کرد.