GitLab CI: ماهیت، پایپ‌لاین‌ها و یکپارچه‌سازی مداوم

نویسنده: IT Sectr منتشر شده: 2026-04-13 زمان مطالعه: 8 دقیقه

GitLab CI یک سیستم یکپارچه‌سازی و تحویل مداوم درون‌ساخته شده در GitLab است که ساخت، آزمایش و استقرار اپلیکیشن‌های موبایل را از طریق پایپ‌لاین‌ها در پیکربندی YAML خودکار می‌کند. بر اساس GitLab, 2024، این پلتفرم ماهانه بیش از ۳۰۰ میلیون پایپ‌لاین را پردازش می‌کند و از runners ابری و خودمیزبان پشتیبانی می‌کند.

نکات کلیدی

  • GitLab CI — سیستم CI/CD درون‌ساخته در GitLab برای خودکارسازی ساخت و آزمایش پروژه‌های موبایل
  • Pipeline — دنباله‌ای از stages که روی runners اجرا می‌شود و در .gitlab-ci.yml توصیف می‌شود
  • Runner — عاملی که jobs پایپ‌لاین را اجرا می‌کند، می‌تواند ابری یا self-hosted باشد
  • Stage — گروه منطقی jobs (build, test, deploy) که به صورت موازی در یک مرحله اجرا می‌شود
  • Artifact — نتیجه اجرای job (APK, IPA, گزارش‌ها) که بین stages منتقل می‌شود

GitLab CI چیست؟

GitLab CI بخشی از اپلیکیشن یکپارچه DevSecOps گیت‌لب است که یکپارچه‌سازی، تحویل و استقرار مداوم را شامل می‌شود. این سیستم در سال ۲۰۱۲ به عنوان یک پروژه جداگانه ظاهر شد، اما سپس مستقیماً در GitLab ادغام شد. اصل اصلی — پیکربندی به عنوان کد (Configuration as Code) از طریق فایل .gitlab-ci.yml در ریشه مخزن. GitLab CI هم در نسخه ابری SaaS و هم در نصب self-managed در دسترس است.

برای توسعه موبایل، GitLab CI خودکارسازی ساخت APK و IPA، اجرای تست‌های ابزاری، تحلیل ایستای کد، امضای اپلیکیشن‌ها و انتشار در فروشگاه‌ها را ارائه می‌دهد. پلتفرم از تصاویر Docker برای محیط‌های سفارشی پشتیبانی می‌کند که امکان نصب از پیش Android SDK، NDK، Xcode و سایر ابزارها را فراهم می‌کند. Container Registry داخلی ذخیره و توزیع تصاویر را در تیم ساده‌تر می‌کند.

معماری GitLab CI: Runners، Pipelines و Stages

معماری GitLab CI از سه مؤلفه کلیدی تشکیل شده است. GitLab Runner عاملی است که jobs را اجرا می‌کند. Runners به سه نوع shared (ارائه شده توسط GitLab)، group (برای گروه پروژه‌ها) و specific (برای یک پروژه) تقسیم می‌شوند. هر runner با تعیین executor ثبت می‌شود: Shell، Docker، Kubernetes یا VirtualBox. GitLab Runner از خودکار‌‌مقیاس‌سازی (auto-scaling) برای مدیریت بارهای اوج پشتیبانی می‌کند.

Pipeline مجموعه‌ای از stages است که به صورت ترتیبی اجرا می‌شوند. در داخل یک stage، jobs به صورت موازی اجرا می‌شوند. ساختار معمولی برای پروژه موبایل: build → test → deploy. اگر job در stage test با خطا پایان یابد، deploy اجرا نمی‌شود. می‌توان اجرای دستی (when: manual) را برای استقرار پیکربندی کرد. همچنین triggerهای multi-project pipelines برای سناریوهای پیچیده CI/CD بین مخازن پشتیبانی می‌شود.

Executorهای GitLab Runner

Docker executor — محبوب‌ترین برای CI/CD اپلیکیشن‌های موبایل. هر job در یک کانتینر Docker تمیز اجرا می‌شود که ایزوله بودن و تکرارپذیری را تضمین می‌کند. برای ساخت Android از تصویر android-sdk با SDK از پیش نصب شده استفاده می‌شود، برای iOS — macOS runner با Shell executor.

پیکربندی .gitlab-ci.yml برای پروژه‌های موبایل

فایل .gitlab-ci.yml خط لوله را در قالب YAML تعریف می‌کند. بخش‌های اصلی: image (تصویر Docker)، stages (لیست مراحل)، variables (متغیرهای محیطی)، before_script (دستورات قبل از هر job) و خود jobs با بخش‌های script، artifacts، cache. GitLab CI از include پشتیبانی می‌کند — اتصال فایل‌های YAML خارجی برای استفاده مجدد از پیکربندی‌های مشترک بین پروژه‌ها.

متغیرها در GitLab CI می‌توانند در چندین سطح تنظیم شوند: سراسری در UI، در فایل پیکربندی، در تنظیمات گروه و پروژه. اولویت متغیرها توسط سلسله‌مراتب تعیین می‌شود: trigger variables بالاترین اولویت را دارند، سپس CI/CD variables از UI، سپس از .gitlab-ci.yml. متغیرها می‌توانند محافظت شوند (protected) که آنها را فقط برای branchها و tagهای محافظت شده قابل دسترس می‌کند.

متغیرهای پایه و تصویر

yaml
image: openjdk:17-jdk-slim

variables:
  ANDROID_SDK_VERSION: "35"
  GRADLE_OPTS: "-Dorg.gradle.daemon=false"

stages:
  - build
  - test
  - deploy

cache:
  key: $CI_COMMIT_REF_SLUG
  paths:
    - .gradle/

ساخت job با artifactها

job generate-apk پروژه Gradle را می‌سازد و APK را به عنوان artifact ذخیره می‌کند. Artifactها بین stages منتقل می‌شوند — job deploy می‌تواند از APK ساخته شده استفاده کند. مدت زمان نگهداری artifactها از طریق expire_in پیکربندی می‌شود.

yaml
generate-apk:
  stage: build
  script:
    - ./gradlew assembleRelease
  artifacts:
    paths:
      - app/build/outputs/apk/release/
    expire_in: 1 day

GitLab CI در مقابل GitHub Actions: تفاوت‌های کلیدی

در انتخاب بین GitLab CI و GitHub Actions برای پروژه موبایل، در نظر گرفتن زیرساخت تیم مهم است. GitLab CI یک Container Registry داخلی ارائه می‌دهد که می‌توان از آن برای ذخیره تصاویر Docker با Android SDK استفاده کرد. GitHub Actions به GitHub Packages یا رجیستری‌های خارجی متکی است. GitLab همچنین دارای SAST داخلی (آزمون امنیتی ایستای برنامه) برای تحلیل کد از نظر آسیب‌پذیری‌ها است.

GitLab CI مدل runner انعطاف‌پذیرتری ارائه می‌دهد — از Kubernetes executor، auto-scaling و تصاویر سفارشی پشتیبانی می‌کند. GitHub Actions در ادغام با اکوسیستم GitHub و بازار actions برنده است. GitLab CI نیاز به پیکربندی دستی برای بسیاری از وظایفی دارد که در GitHub Actions با یک action آماده حل می‌شوند.

از دیدگاه CI/CD برای پروژه‌های موبایل: GitLab CI برای شرکت‌هایی که از GitLab Self-Managed استفاده می‌کنند و به runners خودمیزبان با Docker/Kubernetes نیاز دارند مناسب‌تر است. GitHub Actions برای تیم‌های کوچکی که از GitHub ابری استفاده می‌کنند و برای actions آماده و سادگی پیکربندی ارزش قائل هستند راحت‌تر است.

مقایسه قابلیت‌ها

ویژگیGitLab CIGitHub Actions
پیکربندی.gitlab-ci.yml.github/workflows/*.yml
RunnerSelf-hosted + sharedHosted + self-hosted
ExecutorهاDocker, K8s, ShellVM (Ubuntu, macOS, Win)
بازار اقداماتندارد (الگوهای CI)Marketplace (15k+ action)
ساخت iOSmacOS runner یا K8smacOS hosted runner

مثال پایپ‌لاین برای پروژه Android

پایپ‌لاین کامل برای Android شامل: lint، تست واحد، ساخت و استقرار در Firebase App Distribution. پایپ‌لاین از تصویر Docker با Android SDK، ذخیره‌سازی کش Gradle و اجرای موازی lint و تست در یک stage استفاده می‌کند. این رویکرد زمان کل پایپ‌لاین را کاهش می‌دهد، زیرا وظایف lint و تست به یکدیگر وابسته نیستند.

برای پروژه‌های iOS ساختار پایپ‌لاین به دلیل نیاز به macOS runner و امضای کد متفاوت است. پایپ‌لاین iOS معمولی شامل: نصب CocoaPods یا SPM، اجرای تست‌ها روی شبیه‌ساز، بایگانی پروژه Xcode، استخراج IPA و بارگذاری در TestFlight. GitLab CI برای iOS از macOS runners استفاده می‌کند — یا GitLab SaaS macOS runners با محدودیت زمانی، یا self-hosted runner روی Mac mini یا MacStadium.

yaml
image: androidsdk/android-35:latest

stages:
  - lint
  - test
  - build
  - deploy

lint-check:
  stage: lint
  script: ./gradlew lint

unit-tests:
  stage: test
  script: ./gradlew test

assemble-release:
  stage: build
  script: ./gradlew assembleRelease
  artifacts:
    paths: [app/build/outputs/apk/release/]

deploy-firebase:
  stage: deploy
  script:
    - firebase appdistribution:distribute
    --app $FIREBASE_APP_ID
    --token $FIREBASE_TOKEN
    --groups testers

بهینه‌سازی زمان ساخت در GitLab CI

بهینه‌سازی پایپ‌لاین‌های ساخت موبایل در GitLab CI نیاز به توجه به جزئیات دارد. پیکربندی صحیح cache و artifacts امکان کاهش زمان ساخت را چندین برابر فراهم می‌کند. برای تحلیل عملکرد، GitLab CI/CD Analytics را ارائه می‌دهد — داشبوردی با معیارهای مدت زمان پایپ‌لاین‌ها، بار runners و تنگناها. این معیارها را به طور منظم برای یافتن فرصت‌های بهینه‌سازی تحلیل کنید. تنظیم resource_group اجرای موازی یک پایپ‌لاین را مسدود می‌کند — این برای جلوگیری از تداخل‌ها هنگام استقرار مفید است.

استراتژی شاخه‌ها برای CI نیز مهم است. توصیه می‌شود پایپ‌لاین کامل را فقط برای شاخه‌های main و release اجرا کنید و برای شاخه‌های feature — فقط lint و تست‌های واحد. این کار دقایق runners را ذخیره می‌کند و بازخورد را به توسعه‌دهندگان سرعت می‌بخشد. GitLab CI از workflow:rules پشتیبانی می‌کند — قوانین شرطی برای شامل یا حذف کردن jobs بسته به شاخه، فایل‌های تغییر یافته یا متغیرهای محیطی.

ذخیره‌سازی کش وابستگی‌ها — راه اصلی سرعت‌بخشی. GitLab CI .gradle، Pods و node_modules را بین اجراها کش می‌کند. کلید کش شامل $CI_COMMIT_REF_SLUG یا هش فایل lock است. زمان ساخت پروژه Android با کش صحیح از ۱۰–۱۵ به ۲–۴ دقیقه کاهش می‌یابد. کش می‌تواند توزیع‌شده باشد — GitLab از cache:key با fallback به کلیدهای قبلی پشتیبانی می‌کند.

تصویر Docker با ابزارهای از پیش نصب شده در وقت نصب صرفه‌جویی می‌کند. توصیه می‌شود یک تصویر سفارشی با Android SDK، NDK و سطح API مورد نیاز ایجاد کنید. اجرای موازی jobs (lint، test، assemble) در stages مختلف زمان کل پایپ‌لاین را کاهش می‌دهد. Pull policies برای تصاویر (if-not-present) شروع jobs را سرعت می‌بخشد. همچنین می‌توان از dependency proxy برای کش کردن تصاویر در سطح نمونه GitLab استفاده کرد.

جنبه مهم دیگر بهینه‌سازی — استفاده از artifactها بین مراحل است. فایل‌های حجیم APK و IPA بهتر است از طریق dependency منتقل شوند تا اینکه در هر job دوباره ساخته شوند. برای پروژه‌های بزرگ با ده‌ها ماژول، توصیه می‌شود Gradle Build Cache را در سطح پایپ‌لاین فعال کنید و remote cache را در یک انبار مشترک پیکربندی کنید. Timeout برای هر job باید بر اساس زمان ساخت مورد انتظار تنظیم شود — این کار از فرآیندهای قفل شده جلوگیری می‌کند.

مثال با کش و pull policy

yaml
cache:
  key: $CI_COMMIT_REF_SLUG
  paths:
    - .gradle/
    - app/build/

image:
  name: registry.example.com/android-builder:3.5
  pull_policy: if-not-present

سوالات متداول

هزینه GitLab CI چقدر است؟

در GitLab.com طرح رایگان شامل ۴۰۰ دقیقه CI/CD در ماه و ۵ کاربر است. Premium (۲۹ دلار/ماه) ۱۰۰۰۰ دقیقه و jobs موازی بیشتر می‌دهد. Self-managed GitLab محدودیت دقیقه ندارد.

چگونه Android SDK را در GitLab CI پیکربندی کنیم؟

از تصویر Docker آماده androidsdk/android-35 استفاده کنید یا SDK را از طریق sdkmanager در before_script نصب کنید. در variables ANDROID_SDK_ROOT و ANDROID_NDK_HOME را برای عملکرد صحیح Gradle مشخص کنید.

GitLab CI چه تفاوتی با GitHub Actions دارد؟

GitLab CI Container Registry داخلی، یکپارچه‌سازی Kubernetes و خودکار‌مقیاس‌سازی self-hosted را ارائه می‌دهد. GitHub Actions در تعداد actions آماده و سادگی برای تیم‌های کوچک برنده است.

آیا می‌توان از GitLab CI برای ساخت iOS استفاده کرد؟

بله، اما برای iOS macOS runner مورد نیاز است. می‌توان از GitLab SaaS macOS runners (محدود) استفاده کرد یا یک self-hosted runner روی Mac Mini راه‌اندازی کرد. GitLab خود زیرساخت ابری macOS را فراهم نمی‌کند.

چگونه فایل‌ها را بین jobs در GitLab CI منتقل کنیم؟

از طریق artifacts — فایل‌های یک job به job دیگر در چارچوب پایپ‌لاین منتقل می‌شوند. از طریق cache — برای وابستگی‌ها بین اجراها. از طریق CI/CD variables — برای مقادیر متنی و توکن‌ها.

خلاصه

  • GitLab CI — سیستم CI/CD درون‌ساخته در GitLab برای خودکارسازی ساخت، آزمایش و استقرار اپلیکیشن‌های موبایل
  • Pipeline از stages که به صورت ترتیبی اجرا می‌شوند با jobs موازی در هر stage تشکیل شده است
  • Runner از executorهای Docker، Shell، Kubernetes و VirtualBox برای محیط‌های مختلف پشتیبانی می‌کند
  • پیکربندی از طریق .gitlab-ci.yml در ریشه مخزن با بخش‌های image، variables، cache و jobs
  • کش کردن وابستگی‌ها از طریق cache و artifactها از طریق artifacts ساخت را ۳–۵ برابر سریع‌تر می‌کند
  • برای iOS macOS runner مورد نیاز است — self-hosted یا GitLab SaaS با دسترسی محدود
  • GitLab CI برای سازمان‌هایی که از GitLab Self-Managed و زیرساخت Kubernetes استفاده می‌کنند مناسب‌تر است

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید