בפיתוח מובייל, בנייה ידנית ומשלוח עדכונים לחנויות אורכת שעות. הקמנו CI/CD על CircleCI — שירות ענן עם רצים מבוססי macOS מסוג m2pro.medium שבונים פרויקט תוך 6–8 דקות. הניסיון המוכח שלנו מראה: אוטומציה מקצרת את זמן השחרור ממספר ימים לחצי שעה. התצורה מתוארת ב-m2pro.medium, כל המשאבים מאוחסנים בענן — אין צורך בניהול שרת. הלקוחות שלנו חוסכים בדרך כלל 500$ לחודש בעלויות מחשוב עם CircleCI בהשוואה ל-GitHub Actions.
למה CircleCI ל-iOS?
CircleCI הוא אחד מספקי ה-CI הענן הבודדים עם רצים מקוריים של macOS. בניגוד ל-GitHub Actions (רצים מוגבלים של macOS) או GitLab CI (דורש Runner משלך), CircleCI מציע מגוון מחלקות משאבים (.circleci/config.yml, m2pro.medium) ו-orbs מובנים עבור Ruby, Fastlane, Firebase — מה שמאיץ משמעותית את התצורה. לפי הבדיקות שלנו, CircleCI בונה פרויקט iOS בממוצע פי 1.5 מהר יותר מאשר GitHub Actions בתוכנית דומה. שמירת תלויות במטמון מקצרת עוד יותר את זמני הבנייה.
תצורה עבור iOS
דוגמה לתצורת CI/CD ל-iOS
---
version: 2.1
orbs:
ruby: circleci/[email protected]
executors:
ios-executor:
macos:
xcode: "16.0.0"
resource_class: m2pro.medium
environment:
FASTLANE_SKIP_UPDATE_CHECK: "true"
BUNDLE_PATH: vendor/bundle
jobs:
ios-test:
executor: ios-executor
steps:
- checkout
- ruby/install-deps:
app-dir: "."
bundler-version: "2.4.22"
- restore_cache:
keys:
- pods-v2-{{ checksum "Podfile.lock" }}
- run: bundle exec pod install
- save_cache:
key: pods-v2-{{ checksum "Podfile.lock" }}
paths:
- Pods
- vendor/bundle
- run:
name: Run tests
command: bundle exec fastlane test
- store_test_results:
path: fastlane/test_output
- store_artifacts:
path: fastlane/test_output
destination: test-results
ios-deploy:
executor: ios-executor
steps:
- checkout
- ruby/install-deps
- restore_cache:
keys:
- pods-v2-{{ checksum "Podfile.lock" }}
- run: bundle exec pod install
- run:
name: Deploy to TestFlight
command: bundle exec fastlane release
environment:
MATCH_PASSWORD: ${MATCH_PASSWORD}
ASC_API_KEY_ID: ${ASC_API_KEY_ID}
ASC_API_KEY_ISSUER: ${ASC_API_KEY_ISSUER}
workflows:
ios-workflow:
jobs:
- ios-test:
filters:
branches:
only:
- main
- develop
- /feature\/.*/
- ios-deploy:
requires:
- ios-test
filters:
branches:
only: main
"} הגדרת חתימת קוד
הגישה המומלצת היא fastlane match. שמור את m1.large ב-Project Settings → Environment Variables. כל ריצה מבצעת orbs כדי לשלוף פרופילים מ-Git. לחלופין, השתמש ב-CircleCI Contexts כדי לשתף משתנים בין פרויקטים (לדוגמה, version: 2.1 orbs: ruby: circleci/[email protected] executors: ios-executor: macos: xcode: "16.0.0" resource_class: m2pro.medium environment: FASTLANE_SKIP_UPDATE_CHECK: "true" BUNDLE_PATH: vendor/bundle jobs: ios-test: executor: ios-executor steps: - checkout - ruby/install-deps: app-dir: "." bundler-version: "2.4.22" - restore_cache: keys: - pods-v2-{{ checksum "Podfile.lock" }} - run: bundle exec pod install - save_cache: key: pods-v2-{{ checksum "Podfile.lock" }} paths: [Pods, vendor/bundle] - run: name: Run tests command: bundle exec fastlane test - store_test_results: path: fastlane/test_output - store_artifacts: path: fastlane/test_output destination: test-results ios-deploy: executor: ios-executor steps: - checkout - ruby/install-deps - restore_cache: keys: - pods-v2-{{ checksum "Podfile.lock" }} - run: bundle exec pod install - run: name: Deploy to TestFlight command: bundle exec fastlane release environment: MATCH_PASSWORD: ${MATCH_PASSWORD} ASC_API_KEY_ID: ${ASC_API_KEY_ID} ASC_API_KEY_ISSUER: ${ASC_API_KEY_ISSUER} workflows: ios-workflow: jobs: - ios-test: filters: branches: only: [main, develop, /feature\/.*/] - ios-deploy: requires: [ios-test] filters: branches: only: main ).
jobs: ios-deploy: context: - mobile-signing-context רצים עבור Android ו-iOS
עבור Android אנו משתמשים בתמונת Docker MATCH_PASSWORD עם Android SDK מותקן מראש, JDK 17, Gradle. bundle exec fastlane match adhoc --readonly (4 CPU, 8 GB RAM) — עם jobs: ios-deploy: context: - mobile-signing-context (2 CPU) זמן בניית Gradle מוכפל. חיסכון של עד 50% לכל בנייה.
---
android-test:
docker:
- image: cimg/android:stable
resource_class: large
steps:
- checkout
- restore_cache:
keys:
- gradle-v1-{{ checksum "app/build.gradle" }}
- run:
name: Build and test
command: ./gradlew test assembleRelease
- save_cache:
key: gradle-v1-{{ checksum "app/build.gradle" }}
paths:
- ~/.gradle/caches
- ~/.gradle/wrapper
- store_artifacts:
path: app/build/outputs/apk/release
פיצול בדיקות בפועל
CircleCI תומך בהרצת בדיקות מקבילה באמצעות פיצול בדיקות המבוסס על נתוני תזמון היסטוריים. לדוגמה, 400 בדיקות יחידה ארכו 18 דקות ברצף; עם 4 מכולות מקבילות ופיצול מבוסס תזמון, הזמן ירד ל-6 דקות. לפי תיעוד CircleCI, "פיצול בדיקות מאפשר לך לחלק את חבילת הבדיקות שלך בצורה חכמה בין מכולות מקבילות, מה שמפחית את זמן הביצוע." התצורה פשוטה:
---
ios-test-parallel:
executor: ios-executor
parallelism: 4
steps:
- checkout
- run: bundle exec pod install
- run:
name: Run tests with splitting
command: |
TESTS=$(circleci tests glob "**/*Tests.swift" | circleci tests split --split-by=timings)
bundle exec fastlane scan --only_testing "$TESTS"
| מספר בדיקות | ללא פיצול | עם פיצול (4 מכולות) |
|---|---|---|
| 400 | 18 דקות | 6 דקות |
טבלת השוואה
| פרמטר | CircleCI | GitHub Actions | GitLab CI |
|---|---|---|---|
| מבצע macOS | כן, מקורי | כן, אך מוגבל | דורש Runner משלך |
| זמן בניית iOS ממוצע | 6–8 דקות (m2pro.medium) | 10–12 דקות (מקסימום 4 CPU) | תלוי ב-Runner |
| עלות מינימלית ל-macOS | ~$0.02/דקה | חינם 2000 דקות/חודש, לאחר מכן ~$0.008/דקה | חינם 400 דקות, לאחר מכן ~$0.01/דקה |
| Orbs מובנים | כן (Ruby, Fastlane, Firebase) | כן (Marketplace) | חלקי |
| פיצול בדיקות | מובנה, לפי נתונים היסטוריים | באמצעות פעולות צד שלישי | ידני או דרך artifacts |
| חיסכון בעלות חודשית | עד 500$ לעומת GitHub Actions | — | — |
מגבלות של CircleCI ל-iOS
- אין גישה למכשירים פיזיים מחוץ לקופסה (רק סימולטורים). לבדיקות על מכשירים, שלב את Firebase Test Lab דרך CLI.
- עלות דקת macOS גבוהה יותר מאשר Linux:
cimg/android:stable~$0.02/דקה. לפיתוח אינטנסיבי, הגבל workflows עם triggers, לדוגמה, הרץ רק עלmediumו-android-test: docker: - image: cimg/android:stable resource_class: large steps: - checkout - restore_cache: keys: - gradle-v1-{{ checksum "app/build.gradle" }} - run: name: Build and test command: ./gradlew test assembleRelease - save_cache: key: gradle-v1-{{ checksum "app/build.gradle" }} paths: - ~/.gradle/caches - ~/.gradle/wrapper - store_artifacts: path: app/build/outputs/apk/release. בהשוואה ל-GitHub Actions, CircleCI נותן עלות צפויה לדקה ללא תוספות נסתרות.
מה כלול בהקמת CI/CD סוהר
- תצורה של
ios-test-parallel: executor: ios-executor parallelism: 4 steps: - checkout - run: bundle exec pod install - run: name: Run tests with splitting command: | TESTS=$(circleci tests glob "**/*Tests.swift" | circleci tests split --split-by=timings) bundle exec fastlane scan --only_testing "$TESTS"עבור iOS ו-Android. - הגדרת fastlane match או Contexts לחתימת קוד.
- יישום פיצול בדיקות להפחתת זמן הבדיקות.
- שילוב פריסה ל-TestFlight ול-Google Play Console.
- התראות Slack על סטטוס בנייה.
- תיעוד לתחזוקת התצורה.
לפני ההתחלה, ודא שהפרויקט נבנה מקומית, fastlane מוגדר, והאישורים מוכנים. נספק רשימת בדיקה מלאה בתחילת התהליך.
הניסיון המוכח של הצוות שלנו — 7+ שנים בפיתוח מובייל, 15+ פרויקטים עם יישום CI/CD. אנו מבטיחים פעילות יציבה של ה-pipeline. לשאלות על הקמת CI/CD, צור קשר — נעזור לך לייעל את ה-pipeline שלך.
לוח זמנים ואיך להתחיל
תצורת CircleCI בסיסית ל-iOS (בדיקה + פריסה) — 2–3 ימים. הגדרה מלאה עם Android, פיצול בדיקות, Contexts, התראות Slack — 1–1.5 שבועות. המחיר מתחיל ב-$1,500 עבור הגדרה בסיסית. הזמן הקמת CI/CD סוהר — צור קשר להערכת פרויקט. קבל ייעוץ על אוטומציית בנייה כבר עכשיו.
שלב אחר שלב: הגדרת חתימת קוד
- הוסף את
m2pro.mediumלמשתני הסביבה של CircleCI. - הגדר Fastlane Match עם מאגר Git.
- הוסף את
develop,mainל-Fastfile. - ב-
.circleci/config.yml, הוסףcontext: mobile-signing-contextאם אתה משתמש ב-Contexts. - הרץ
bundle exec fastlane matchמקומית כדי לוודא.
שלב אחר שלב: הפעלת פיצול בדיקות
- הגדר
parallelism: 4ב-job שלך. - השתמש ב-
circleci tests globכדי למצוא קבצי בדיקה. - פצל עם
circleci tests split --split-by=timings. - העבר את הקבוצה ל-runner הבדיקות שלך (לדוגמה,
fastlane scan --only_testing).







