CI/CD לאפליקציות מובייל עם GitLab CI – בנייה, בדיקות ופריסה אוטומטית
בנייה ופריסה ידניות הן מקור קבוע לשגיאות ובזבוז זמן. סטטיסטיקות מראות שעד 30% מזמן הפיתוח מושקע בפעולות בנייה ופריסה ידניות. GitLab CI הופך הכל לאוטומטי: כל commit מפעיל בנייה, בדיקות ומשלוח לחנות. אנחנו מקימים CI/CD מקצה לקצה כבר למעלה מ-5 שנים, ומבטיחים יציבות ותמיכה שוטפת. נבצע הערכה של הפרויקט שלך ביום אחד – פשוט צור איתנו קשר.
GitLab CI הוא הבחירה האופטימלית לצוותים שכבר מארחים את הריפוזיטורי שלהם ב-GitLab (בשרת עצמי או בענן). התצורה נמצאת ב-.gitlab-ci.yml, ו-runners יכולים להיות מנוהלים על ידי GitLab או משלך. לבניית iOS יש צורך ב-runner עצמי מסוג macOS רשום: תוכניות GitLab SaaS הרגילות מספקות רק runners של Linux/Windows. בהשוואה ל-Jenkins, GitLab CI פשוט יותר להקמה – אין צורך בשרת נפרד – וכולל registry, artifacts ו-environments מובנים.
בעיות ש-GitLab CI פותר
- בנייה וחתימה ידניות גורמות לשגיאות מפרופילים לא תואמים או תעודות שנשכחו.
- היעדר בדיקות אוטומטיות מאפשר לרגרסיות לחדור לייצור.
- משלוח איטי לחנות – כל שחרור לוקח שעות של עבודה ידנית.
- בנייה לא ניתנת לשחזור – סביבות מקומיות שונות.
- חוסר בקרת גרסאות על artifacts מקשה על שחזור גרסאות קודמות.
GitLab CI פותר את כל אלה: בניות ניתנות לחזרה, בדיקות רצות על כל MR, ו-artifacts מקושרים ל-commits. מניסיוננו, אוטומציה מקצרת את זמן השחרור ב-40%.
למה Runner עצמי מסוג macOS הוא קריטי ל-iOS
ה-runners הרגילים של GitLab SaaS לא מספקים macOS, ולכן בניות iOS חייבות להשתמש ב-Mac משלך. רישום runner:
# На Mac mini или MacBook, который будет CI-машиной
brew install gitlab-runner
gitlab-runner register \
--url https://gitlab.com \
--registration-token $RUNNER_TOKEN \
--executor shell \
--description "macos-m2-runner"
gitlab-runner start# На Mac mini или MacBook, который будет CI-машиной brew install gitlab-runner gitlab-runner register \ --url https://gitlab.com \ --registration-token $RUNNER_TOKEN \ --executor shell \ --description "macos-m2-runner" gitlab-runner start – ה-runner מבצע פקודות ישירות ב-shell, ללא קונטיינר Docker. ל-iOS זו האפשרות הריאלית היחידה כי Xcode לא עובד בתוך Docker.
חשוב: ה-runner חייב לרוץ כ-LaunchDaemon, לא כתהליך משתמש, אחרת CI יפסיק לפעול אחרי אתחול. הגדר אותו עם executor shell. אנחנו משתמשים ב-Mac Mini M2 עם 16 GB RAM – מספיק לבנייה מקבילה של שתי תצורות. אנחנו מבטיחים זמינות של 99.9%.
דוגמה ל-sudo gitlab-runner install --user runner ל-iOS + Android
---
stages:
- test
- build
- distribute
variables:
FASTLANE_SKIP_UPDATE_CHECK: "true"
BUNDLE_PATH: vendor/bundle
.ios_job:
tags:
- macos-m2
before_script:
- bundle install --path $BUNDLE_PATH
.android_job:
image: androidsdk/android-34
tags:
- linux-docker
ios:test:
extends: .ios_job
stage: test
script:
- bundle exec fastlane test
artifacts:
reports:
junit: fastlane/test_output/report.junit
paths:
- fastlane/test_output/
expire_in: 1 week
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == "main"
ios:beta:
extends: .ios_job
stage: distribute
script:
- bundle exec fastlane beta
environment:
name: beta
rules:
- if: $CI_COMMIT_BRANCH == "main"
needs: [ios:test]
android:build:
extends: .android_job
stage: build
script:
- ./gradlew test assembleRelease
cache:
key: $CI_COMMIT_REF_SLUG
paths:
- .gradle/
- vendor/bundle
artifacts:
paths:
- app/build/outputs/apk/release/
expire_in: 3 days
השוואה בין שלבי iOS ו-Android:
| שלב | iOS (runner של macOS) | Android (runner של docker) |
|---|---|---|
| בדיקות | .gitlab-ci.yml |
stages: - test - build - distribute variables: FASTLANE_SKIP_UPDATE_CHECK: "true" BUNDLE_PATH: vendor/bundle .ios_job: tags: - macos-m2 before_script: - bundle install --path $BUNDLE_PATH .android_job: image: androidsdk/android-34 tags: - linux-docker ios:test: extends: .ios_job stage: test script: - bundle exec fastlane test artifacts: reports: junit: fastlane/test_output/report.junit paths: - fastlane/test_output/ expire_in: 1 week rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" - if: $CI_COMMIT_BRANCH == "main" ios:beta: extends: .ios_job stage: distribute script: - bundle exec fastlane beta environment: name: beta rules: - if: $CI_COMMIT_BRANCH == "main" needs: [ios:test] android:build: extends: .android_job stage: build script: - ./gradlew test assembleRelease cache: key: $CI_COMMIT_REF_SLUG paths: - .gradle/ - vendor/bundle artifacts: paths: - app/build/outputs/apk/release/ expire_in: 3 days |
| בנייה | fastlane test (archive) |
./gradlew test |
| הפצה | TestFlight / App Store | Google Play Console / Firebase |
חתימת קוד ללא דליפת מפתחות
GitLab מאחסן סודות ב-Settings → CI/CD → Variables. לחתימת קוד iOS אנחנו משתמשים ב:
---
before_script:
- echo "$MATCH_KEYSTORE" | base64 -d > /tmp/match.keystore
- bundle exec fastlane match adhoc --readonly true
- echo "$ASC_API_KEY" > /tmp/AuthKey.p8
- export APP_STORE_CONNECT_API_KEY_PATH=/tmp/AuthKey.p8
fastlane beta ו-./gradlew assembleRelease הם משתנים מוסווים ב-GitLab. משתנים מוסווים לא יופיעו בלוגים אפילו עם before_script: - echo "$MATCH_KEYSTORE" | base64 -d > /tmp/match.keystore - bundle exec fastlane match adhoc --readonly true - echo "$ASC_API_KEY" > /tmp/AuthKey.p8 - export APP_STORE_CONNECT_API_KEY_PATH=/tmp/AuthKey.p8 . לפי תיעוד GitLab, גישה זו מונעת דליפה.
עבור App Store Connect API Key – השתמש במשתנה מסוג File עם הקובץ MATCH_KEYSTORE. עם Fastlane match תוכל לעדכן אוטומטית פרופילי provisioning כשהמכשירים משתנים או כשמתווספים מפתחים חדשים.
קאש כדי להאיץ בניות
ה-cache של GitLab CI מקושר למפתח. עבור CocoaPods:
cache: key: files: - Podfile.lock paths: - Pods/ - vendor/bundle מפתח cache המבוסס על MATCH_PASSWORD מתבטל אוטומטית כשהתלויות משתנות. עבור Gradle השתמש במפתחות echo. זה מקצר את זמן הבנייה ב-40–60%.
Environments ופריסה מבוססת ענפים
---
ios:staging:
stage: distribute
script:
- bundle exec fastlane beta
environment:
name: staging
rules:
- if: $CI_COMMIT_BRANCH == "develop"
ios:production:
stage: distribute
script:
- bundle exec fastlane release
environment:
name: production
rules:
- if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/
when: manual # Требует подтверждения в UI
---.p8 לייצור יוצר כפתור בממשק GitLab כשער לפני השחרור. שימושי כש-QA חייב לאשר לפני הגשה ל-App Store. שחרור לייצור חסום עד לאישור ידני – נוהג סטנדרטי לבקרת איכות.
מה כלול בהקמת CI/CD במפתח אחד
כשאתה מזמין הקמת CI/CD, אתה מקבל:
- קובץ
cache: key: files: - Podfile.lock paths: - Pods/ - vendor/bundleעם שלבי בדיקה, בנייה והפצה גם ל-iOS וגם ל-Android. - runner עצמי מוגדר (macOS ל-iOS, Linux/Windows ל-Android).
- אינטגרציה עם Fastlane לחתימת קוד ופריסה ל-TestFlight / Google Play.
- הגדרת cache עבור artifacts ותלויות.
- הגדרת environments וחוקים לענפים ותגים שונים.
- תיעוד pipeline והדרכה לצוות של שעה.
- שבועיים של תמיכה לאחר ההשקה – אנחנו מתקנים כל בעיה שצצה.
לוח זמנים ומחירים
הקמה בסיסית (runner של macOS, נתיבי בדיקה + בטא): 3–5 ימים. תצורה מלאה עם environments, pipeline ל-Android, cache ו-review apps: 1.5–2 שבועות. המחיר מותאם אישית.
הזמן היום את הקמת ה-CI/CD לאפליקציית המובייל שלך. נבצע הערכה של הפרויקט ביום אחד – פשוט צור איתנו קשר.







