اتوماسیون در توسعه نرمافزار دیگر یک گزینه نیست، بلکه یک ضرورت است. در پروژههایی که بهصورت تیمی و با کدهای پیچیده توسعه داده میشوند، هماهنگسازی فرایندهای تست، بیلد، و استقرار، بدون ابزارهای خودکار، تقریباً غیرممکن است. یکی از راهحلهای محبوب و قدرتمند برای این منظور، استفاده از GitLab CI/CD است؛ سیستمی که در دل GitLab ساخته شده و امکان تعریف، اجرا و نظارت بر پایپلاینهای CI/CD را با انعطاف بالا فراهم میکند.
در این مطلب، بهصورت گامبهگام با مفاهیم، اجزای کلیدی، ساختار فایل پیکربندی .gitlab-ci.yml
، و شیوههای پیادهسازی پایپلاینهای CI/CD در GitLab آشنا میشویم. همچنین مثالهایی از استفاده واقعی و بهترین شیوهها برای بهکارگیری GitLab CI/CD را بررسی میکنیم.
GitLab CI/CD چیست و چه کاری انجام میدهد؟
GitLab CI/CD مجموعهای از ابزارها و قابلیتهاست که برای یکپارچهسازی مداوم (Continuous Integration) و تحویل/استقرار مداوم (Continuous Delivery/Deployment) طراحی شده است. این سیستم به تیمها کمک میکند تا تغییرات کد را بهصورت خودکار تست، بیلد، و در محیطهای مختلف مستقر کنند.
در گیتلب، CI/CD بهصورت یکپارچه در مخزن پروژه شما تعبیه شده است. بهمحض اینکه تغییراتی در کد (مثلاً از طریق Merge Request یا Push) ایجاد شود، GitLab با استفاده از فایل پیکربندی .gitlab-ci.yml
میتواند مجموعهای از مراحل (stages) و وظایف (jobs) را اجرا کند. این وظایف میتوانند شامل اجرا شدن تستهای خودکار، ساختن پروژه، تحلیل استاتیک کد، بستهبندی (build)، و استقرار در محیطهای staging یا production باشند.
مزیت اصلی GitLab CI/CD در سادگی و یکپارچگی آن است. شما نیازی به استفاده از ابزار جانبی یا سرویس خارجی ندارید؛ همهچیز از داخل GitLab قابل مدیریت است، از تعریف وظایف گرفته تا مانیتورینگ و گزارشگیری.
در ادامه مطلب قصد داریم با بررسی موارد زیر بهصورت عمیقتری با این ابزار آشنا شویم:
- GitLab Runner
- فایل
.gitlab-ci.yml
- مراحل (Stages) و وظایف (Jobs)
- متغیرها و آرتیفکتها
- مثال کامل از یک پایپلاین واقعی
GitLab Runner چیست و چه نقشی در اجرای CI/CD دارد؟
GitLab Runner قلب تپنده اجرای وظایف CI/CD در GitLab است. زمانی که شما یک پایپلاین تعریف میکنید، این Runnerها هستند که دستورها و اسکریپتهای شما را اجرا میکنند. GitLab Runner یک اپلیکیشن متنباز است که میتواند روی ماشینهای مختلف (لینوکس، ویندوز، مک یا حتی کانتینرهای داکر) نصب شود و وظایف تعریفشده در فایل .gitlab-ci.yml
را اجرا کند. این وظایف ممکن است شامل تست، بیلد، آنالیز کد، یا استقرار باشند.
انواع GitLab Runner:
Shared Runner
این نوع توسط ادمین GitLab ارائه میشود و بین چند پروژه به اشتراک گذاشته میشود. برای پروژههای عمومی یا کوچک، گزینه مناسبی است.
Specific Runner
فقط برای پروژه خاصی تنظیم شده و معمولاً در سازمانها برای کنترل بیشتر روی محیط اجرا، مورد استفاده قرار میگیرد.
نحوه کار:
هر وقت تغییری در مخزن ایجاد شود که یک پایپلاین را فعال کند (مثلاً Push یا Merge Request)، GitLab یک یا چند Job را طبق فایل .gitlab-ci.yml
ایجاد میکند. Runner یکی از این وظایف را دریافت کرده، در محیطی امن اجرا میکند و نتیجه را به GitLab بازمیگرداند.
مزیت اصلی Runnerها:
- امکان اجرای موازی وظایف
- اجرای وظایف در محیطهای مختلف (Docker ،Shell ،Kubernetes ،SSH و...)
- مقیاسپذیری بالا
- کنترل دقیقتر روی محیط اجرا (در صورت Self-hosted بودن)
فایل .gitlab-ci.yml
: ساختار، قواعد و مثال اولیه
فایل .gitlab-ci.yml ستون فقرات GitLab CI/CD است. این فایل در ریشه مخزن پروژه قرار میگیرد و شامل تعریف مراحل، وظایف و تنظیمات پایپلاین است. GitLab با خواندن این فایل، تصمیم میگیرد که چه کاری، در چه زمانی، و چگونه انجام شود.
ساختار کلی فایل .gitlab-ci.yml
یک فایل ساده ممکن است ساختاری شبیه زیر داشته باشد:
stages:
- build
- test
- deploy
build-job:
stage: build
script:
- echo "Building the app..."
test-job:
stage: test
script:
- echo "Running tests..."
deploy-job:
stage: deploy
script:
- echo "Deploying to production..."
اجزای اصلی فایل:
stages
لیستی از مراحل (مانند build ،test ،deploy) که ترتیب اجرای Jobها را مشخص میکند.
jobs
هر Job یک وظیفه مستقل است که در یک Stage اجرا میشود. هر Job شامل دستورات زیر است:
- stage: تعیین مرحله اجرا
- script: لیستی از دستوراتی که باید اجرا شوند
- only یا rules: مشخص میکند چه زمانی Job اجرا شود
- artifacts: فایلهایی که باید بین مراحل حفظ شوند
- variables: تعریف متغیرهای محلی
یک مثال کاربردی:
stages:
- test
- deploy
unit-tests:
stage: test
script:
- npm install
- npm test
deploy-to-staging:
stage: deploy
script:
- ./deploy.sh staging
only:
- main
در این مثال، ابتدا تستها اجرا میشوند. اگر موفق باشند، در صورتی که برنچ main
باشد، کار استقرار انجام میشود.
متغیرهای GitLab CI/CD
متغیرها در GitLab CI/CD به شما اجازه میدهند تنظیمات حساس، پارامترهای تکراری، و مقادیر قابل پیکربندی را بهشکل امن و قابل کنترل مدیریت کنید. استفاده درست از متغیرها باعث سادهتر شدن فایلهای CI و افزایش امنیت میشود.
انواع متغیرها در GitLab
1. متغیرهای تعریفشده در فایل .gitlab-ci.yml
:
شما میتوانید متغیرها را مستقیماً درون فایل تعریف کنید:
variables:
NODE_ENV: production
DEPLOY_DIR: /var/www/app
2. متغیرهای محیطی در GitLab UI:
از طریق تنظیمات پروژه (Project > Settings > CI/CD > Variables) میتوانید متغیرهای محرمانه مثل Token یا Password را تعریف کنید. این متغیرها در فایل قابل مشاهده نیستند و امن باقی میمانند.
3. متغیرهای پیشفرض GitLab:
GitLab خودش مجموعهای از متغیرهای از پیش تعریفشده را فراهم میکند مثل:
CI_COMMIT_BRANCH
CI_PIPELINE_ID
CI_JOB_STAGE
CI_PROJECT_NAME
- و دهها متغیر دیگر...
مثال استفاده:
variables:
APP_ENV: staging
deploy:
stage: deploy
script:
- echo "Deploying to $APP_ENV environment"
- ./deploy.sh $APP_ENV
نکته امنیتی:
برای مدیریت رمزها و توکنها هرگز آنها را درون فایل .gitlab-ci.yml ننویسید. همیشه از متغیرهای امن (Protected Environment Variables) در GitLab UI استفاده کنید.
آرتیفکتهای GitLab CI/CD
در جریان اجرای یک پایپلاین، گاهی لازم است خروجی یک مرحله (Stage) به مرحله بعدی منتقل شود. برای این منظور، GitLab از قابلیتی به نام Artifacts (آرتیفکتها) استفاده میکند. آرتیفکتها فایلها یا پوشههایی هستند که پس از پایان یک Job ذخیره میشوند و در Jobهای بعدی یا برای دانلود توسط کاربران در دسترس قرار میگیرند.
چرا به آرتیفکت نیاز داریم؟
مثالها:
- خروجی بیلد (مثلاً فایل اجرایی یا فایلهای فشرده) باید به مرحله استقرار منتقل شود.
- نتایج تست یا گزارش پوشش کد باید برای بررسی در GitLab ذخیره شود.
- فایلهای لاگ یا تحلیل استاتیک کد باید قابل دانلود باشند.
نحوه تعریف آرتیفکت:
build-job:
stage: build
script:
- npm run build
artifacts:
paths:
- dist/
در این مثال، محتوای پوشه dist/
پس از اجرای Job ذخیره میشود و در مراحل بعدی قابل استفاده یا دانلود است.
گزینههای مفید برای پیکربندی آرتیفکتها:
paths
: مسیر فایلها یا پوشههایی که باید ذخیره شوندexpire_in
: مدت زمانی که آرتیفکتها در GitLab باقی میمانند (مثلاً 1 week)when
: تعیین زمان ذخیره آرتیفکت (مثلاً always یا on_success)
مثال پیشرفته:
test-job:
stage: test
script:
- npm test --coverage
artifacts:
paths:
- coverage/
expire_in: 2 days
when: always
آرتیفکتها ابزار کلیدی برای ساخت پایپلاینهای حرفهای و منعطف هستند؛ بدون آنها، اطلاعات بین مراحل گم میشود.
اتوماسیون استقرار (Automated Deployment) با GitLab CI/CD
یکی از مهمترین و کاربردیترین قابلیتهای CI/CD، استقرار خودکار (Deployment Automation) است؛ یعنی اینکه پس از تست موفق کد، برنامه بهطور خودکار به محیطهای staging یا production بدون دخالت انسان منتقل شود.
GitLab CI/CD این قابلیت را بهشکلی ساده اما قدرتمند در اختیار شما میگذارد.
اجزای کلیدی برای استقرار خودکار
- مرحلهی deploy در فایل .gitlab-ci.yml
- متغیرهایی برای تعیین محیط و تنظیمات محرمانه (مثل SSH key یا Token)
- اسکریپت مناسب برای کپی فایلها یا فراخوانی سرویس استقرار
مثال ساده: استقرار در سرور از طریق SSH
deploy-job:
stage: deploy
script:
- scp -r ./dist/* user@your-server:/var/www/app/
only:
- main
در این مثال، پس از Push روی برنچ main، فایلهای ساختهشده در پوشه dist/
از طریق scp به سرور منتقل میشوند.
استقرار در محیطهای مختلف (staging / production)
deploy-to-staging:
stage: deploy
script:
- ./deploy.sh staging
only:
- develop
deploy-to-production:
stage: deploy
script:
- ./deploy.sh production
only:
- main
اینجا، بسته به اینکه در کدام برنچ Push صورت گیرد، استقرار به محیط مربوط انجام میشود.
استفاده از محیطها (Environments) در GitLab
GitLab این امکان را میدهد که محیطهای مختلف تعریف کرده و وضعیت هر یک را در UI مشاهده کنید:
deploy-to-production:
stage: deploy
script:
- ./deploy.sh production
environment:
name: production
اتوماسیون استقرار باعث کاهش خطای انسانی، افزایش سرعت انتشار و حفظ ثبات در فرایند توسعه میشود.
بهترین شیوههای استفاده از GitLab CI/CD
داشتن یک پایپلاین CI/CD صرفاً کافی نیست؛ آنچه مهم است پایدار بودن، سریع بودن، امن بودن و مقیاسپذیر بودن پایپلاینهاست. در این بخش، مجموعهای از Best Practices یا بهترین شیوهها برای استفاده مؤثر از GitLab CI/CD را معرفی میکنیم.
۱. فایل .gitlab-ci.yml را ماژولار و قابل نگهداری نگه دارید
از include استفاده کنید تا فایلهای CI را تقسیم و سازماندهی کنید:
include:
- local: 'ci/test.yml'
- remote: 'https://example.com/ci/deploy.yml'
بهجای تکرار اسکریپتها، آنها را در فایلهای شل (bash) ذخیره کنید و فراخوانی نمایید.
۲. از کش (cache) استفاده کنید تا سرعت پایپلاین افزایش یابد
cache:
paths:
- node_modules/
با کش کردن پکیجها یا بیلدهای میانی، سرعت اجرای مراحل بعدی بهطور چشمگیری افزایش مییابد.
۳. Jobهای سنگین را موازی کنید
بهجای یک Job طولانی، آن را به چند Job کوچکتر تقسیم کرده و همزمان اجرا کنید. این کار باعث کاهش زمان کلی پایپلاین میشود.
۴. خطاهای تست را در پایپلاین early fail کنید
هرچه زودتر بفهمید کدی خراب است، بهتر است. بنابراین:
- مرحله تست را جلوتر از بقیه قرار دهید.
- از دستور exit 1 در اسکریپتها استفاده کنید تا روی اولین خطا متوقف شوند.
۵. از متغیرهای محیطی امن استفاده کنید
هیچ توکنی، پسوردی یا کلید SSH نباید در فایل .gitlab-ci.yml ذخیره شود. بهجای آن، از رابط GitLab UI برای تعریف متغیرهای امن استفاده کنید (Settings > CI/CD > Variables).
۶. از قابلیت environments و deployments بهدرستی بهره بگیرید
با تعریف محیطها و ردیابی نسخههای مستقرشده، میتوانید وضعیت و تاریخچهی هر محیط را از داشبورد GitLab مشاهده و مدیریت کنید.
۷. مستند کنید و لاگها را جدی بگیرید
لاگ اجرای Jobها را بررسی و تحلیل کنید. اسامی واضح برای Jobها، مراحل و فایلها انتخاب کنید و ساختار پیامهای Commit و Merge را با قواعد مشخص حفظ کنید.
در پایان
GitLab CI/CD ابزاری توانمند و انعطافپذیر برای خودکارسازی فرایندهای توسعه، تست، و استقرار نرمافزار است. با استفاده از فایل .gitlab-ci.yml
، تعریف مراحل و وظایف دقیق، بهرهگیری از GitLab Runner، و بهکارگیری متغیرها و آرتیفکتها، میتوان چرخه توسعه را سریعتر، دقیقتر و قابل اعتمادتر کرد.
شما میتوانید برای مطالعات بیشتر به مستندات خود GitLab مراجعه کنید.
اتوماسیون استقرار و پیادهسازی بهترین شیوهها در طراحی پایپلاین نهتنها کیفیت کد را بالا میبرد، بلکه همکاری تیمی را بهبود میدهد و امکان تحویل مداوم (CD) را برای تیمهای حرفهای فراهم میسازد. اگر بهدنبال سرعت، ثبات، و مقیاسپذیری در پروژههای خود هستید، تسلط بر GitLab CI/CD یکی از مهمترین گامها در مسیر DevOps خواهد بود.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید