הרכבה ידנית שעתית של אפליקציות מובייל ולאחר מכן העלאה ל-App Store או ל-Google Play — כאב מוכר לכל צוות. Jenkins CI/CD לאפליקציות מובייל הופך את בניות iOS ו-Android לאוטומטיות. ה-pipeline שלנו לפיתוח מובייל עם Jenkins מקצר את זמן הבנייה ב-40%. אנו מספקים אוטומציה מלאה — מהגדרת agent ועד לפריסה — ותראו תוצאות תוך 1–2 שבועות. ניסיון של למעלה מ-5 שנים ו-40+ פרויקטי מובייל מבטיחים התקנה חלקה.
למה Jenkins לפיתוח מובייל?
בוחרים ב-Jenkins כאשר יש צורך בשליטה מלאה על התשתית, קיים כבר שרת Jenkins on-premise, או שדרישות אבטחה אוסרות שליחת קוד למערכות CI בענן. לפיתוח מובייל, משמעות הדבר היא master עם Linux עבור Android ו-agent עם macOS עבור iOS. בניגוד ל-CI בענן (GitHub Actions, GitLab CI), Jenkins זול פי 2 עבור נפחי בנייה גבוהים, הודות להיעדר חיוב לדקה עבור שימוש ב-agent.
הגדרת macOS Agent לבניית iOS
הגדרת agent שלב אחר שלב:
- התקינו Xcode 16 (ראו Apple Developer) ו-Command Line Tools על ה-Mac.
- הגדירו Keychain עם אישורי חתימת קוד (ודאו שה-Keychain לא נעול).
- התקינו fastlane דרך
gem install fastlaneאוbrew install fastlane. Fastlane Docs ממליצים על כך לאוטומציה. - הגדירו CocoaPods או Swift Package Manager (התלויות יישמרו במטמון).
- חברו את ה-agent ל-Jenkins Controller דרך SSH (מצב LaunchDaemons אינו מתאים — השתמשו ב-
launchctlעבור סשן GUI). - הוסיפו שלב 'Unlock Keychain' ב-Jenkinsfile (ראו להלן).
ארכיטקטורת Jenkins לפיתוח מובייל
Jenkins Controller (Linux/macOS)
├── macOS Agent (для iOS)
│ ├── Xcode 16
│ ├── fastlane
│ └── CocoaPods / SPM
└── Linux Agent (для Android)
├── JDK 17
├── Android SDK
└── GradleAgents מתחברים דרך SSH (Jenkins Controller (Linux/macOS) ├── macOS Agent (для iOS) │ ├── Xcode 16 │ ├── fastlane │ └── CocoaPods / SPM └── Linux Agent (для Android) ├── JDK 17 ├── Android SDK └── Gradle ) או JNLP. עבור ה-agent של macOS, השתמשו בחשבון עם גישת Keychain לאישורי חתימת קוד.
Jenkinsfile: Declarative Pipeline
pipeline {
agent none
environment {
FASTLANE_SKIP_UPDATE_CHECK = 'true'
MATCH_PASSWORD = credentials('match-passphrase')
FIREBASE_TOKEN = credentials('firebase-cli-token')
}
stages {
stage('Test iOS') {
agent { label 'macos-m2' }
steps {
checkout scm
sh 'bundle install --path vendor/bundle'
sh 'bundle exec fastlane test'
}
post {
always {
junit 'fastlane/test_output/report.junit'
}
}
}
stage('Build iOS Beta') {
agent { label 'macos-m2' }
when { branch 'main' }
steps {
sh 'bundle exec fastlane beta'
}
}
stage('Build Android') {
agent { label 'linux-android' }
steps {
checkout scm
sh './gradlew test assembleRelease'
archiveArtifacts artifacts: 'app/build/outputs/apk/release/*.apk'
}
}
}
post {
failure {
slackSend(
channel: '#mobile-ci',
color: 'danger',
message: "Build failed: ${env.JOB_NAME} #${env.BUILD_NUMBER}"
)
}
}
}Launch agents via SSH מתייחס ל-Jenkins Credentials Store. סודות אינם מאוחסנים ב-pipeline { agent none environment { FASTLANE_SKIP_UPDATE_CHECK = 'true' MATCH_PASSWORD = credentials('match-passphrase') FIREBASE_TOKEN = credentials('firebase-cli-token') } stages { stage('Test iOS') { agent { label 'macos-m2' } steps { checkout scm sh 'bundle install --path vendor/bundle' sh 'bundle exec fastlane test' } post { always { junit 'fastlane/test_output/report.junit' } } } stage('Build iOS Beta') { agent { label 'macos-m2' } when { branch 'main' } steps { sh 'bundle exec fastlane beta' } } stage('Build Android') { agent { label 'linux-android' } steps { checkout scm sh './gradlew test assembleRelease' archiveArtifacts artifacts: 'app/build/outputs/apk/release/*.apk' } } } post { failure { slackSend( channel: '#mobile-ci', color: 'danger', message: "Build failed: ${env.JOB_NAME} #${env.BUILD_NUMBER}" ) } } } , רק מזהים.
הימנעות מבעיות Keychain ב-macOS Agent
הכאב העיקרי עם Jenkins + iOS: כאשר מופעל כ-daemon ברקע, credentials('match-passphrase') אינו יכול לפתוח את ה-Keychain ללא ביטול נעילה. פתרון — ביטול נעילה בתחילת ה-pipeline:
stage('Unlock Keychain') {
agent { label 'macos-m2' }
environment {
KEYCHAIN_PASSWORD = credentials('macos-keychain-password')
}
steps {
sh 'security unlock-keychain -p $KEYCHAIN_PASSWORD ~/Library/Keychains/login.keychain-db'
sh 'security set-keychain-settings -lut 3600 ~/Library/Keychains/login.keychain-db'
}
}Jenkinsfile שומר על ה-keychain לא נעול למשך שעה (מספיק לבנייה). ללא זאת, לאחר 5 דקות של חוסר פעילות, ה-keychain ננעל אוטומטית ו-codesign מקבל stage('Unlock Keychain') { agent { label 'macos-m2' } environment { KEYCHAIN_PASSWORD = credentials('macos-keychain-password') } steps { sh 'security unlock-keychain -p $KEYCHAIN_PASSWORD ~/Library/Keychains/login.keychain-db' sh 'security set-keychain-settings -lut 3600 ~/Library/Keychains/login.keychain-db' } } . זוהי אחת השגיאות הנפוצות ביותר שאנו מתקנים ב-90% מהפרויקטים שלנו.
שמירת Artifacts במטמון
ל-Jenkins אין מטמון חכם מובנה כמו GitHub Actions cache. אפשרויות:
| שיטה | תיאור | מתי מתאים |
|---|---|---|
| תיקייה משותפת על ה-agent | set-keychain-settings -lut 3600 או codesign נשמרים בין בניות |
בשימוש ב-sticky agents |
| Workspace Caching Plugin | שומר במטמון לפי hash של errSecInteractionNotAllowed/~/.gradle |
לצוותים קטנים |
| Nexus/Artifactory | מטמון ארגוני לתלויות Maven/Gradle — מקצר את זמן ההתקנה ב-60% | לפרויקטים גדולים עם דרישות אמינות גבוהות |
תיקייה משותפת על ה-agent. התיקייה ~/Library/Caches/CocoaPods או Podfile.lock נשמרת אוטומטית בין בניות אם תמיד משתמשים באותו agent (sticky agent).
Jenkins Workspace Caching Plugin. שומר במטמון לפי hash של build.gradle/~/.gradle, בדומה ל-GitHub Actions cache.
Artifactory/Nexus. לארגונים — שמירת תלויות Maven/Gradle במטמון דרך מאגר artifacts פנימי. ~/Library/Caches/CocoaPods + Nexus mirror.
יתרונות ביצוע בדיקות במקביל
stage('Test Parallel') {
parallel {
stage('iOS Tests') {
agent { label 'macos-m2' }
steps {
sh 'bundle exec fastlane test'
}
}
stage('Android Tests') {
agent { label 'linux-android' }
steps {
sh './gradlew test'
}
}
}
}ביצוע במקביל מהיר פי 1.6 מבנייה רציפה — מקצר את הזמן הכולל מכ-20 ל-12 דקות. חיסכון של 8 דקות לכל בנייה — עם 2 בניות ביום, מדובר ב-40 דקות בשבוע. בתעריף שעתי של $50 למפתח, זה חוסך $33 בשבוע על פרויקט יחיד.
מה כלול בעבודה
בהזמנת התקנת CI/CD מלאה (5+ שנים בשוק, 40+ פרויקטי מובייל), תקבלו:
| תוצר | תיאור |
|---|---|
| תיעוד | תיאור ארכיטקטורה, Jenkinsfile, הוראות למפתחים |
| Agents | agents של macOS ו-Linux מוגדרים עם הכלים הנדרשים |
| אבטחה | Keychain, provisioning profiles, אישורים ב-Jenkins Credentials |
| Pipelines | בדיקות, בנייה, פריסה ל-iOS ו-Android, שלבים מקבילים |
| אינטגרציות | התראות Slack/Jira, Firebase App Distribution, TestFlight |
| הדרכת צוות | סדנה של שעתיים על תחזוקה ושינוי של ה-pipeline |
| תמיכה | שבועיים לאחר המסירה לייצוב |
טעויות אופייניות
-
Podfile.lockלא מוצא סימולטור — הריצו במפורשbuild.gradleלפני בדיקות על agent חדש - Gradle wrapper לא נמצא — הוסיפו
GRADLE_USER_HOME=~/.gradleבתחילת השלב - התנגשויות במספר בנייה במהלך בניות מקבילות — השתמשו ב-
stage('Test Parallel') { parallel { stage('iOS Tests') { agent { label 'macos-m2' } steps { sh 'bundle exec fastlane test' } } stage('Android Tests') { agent { label 'linux-android' } steps { sh './gradlew test' } } } }כסיומת
לוח זמנים
התקנת Jenkins Pipeline עם agents של macOS + Linux, שלבי בדיקה + פריסה: 1–2 שבועות (כולל agents). הוספת בניות מקבילות, אינטגרציית Slack/Jira, Artifactory: עוד שבוע. מחיר התחלתי אופייני הוא $4,999.
במשך 5 שנים, הקמנו CI/CD ל-40+ פרויקטי מובייל, מסטארטאפים ועד ארגונים. קבלו ייעוץ: נבדוק את הפרויקט שלכם ונספר לכם כמה זמן האוטומציה תחסוך. הזמינו התקנת pipeline מלאה — כתבו לנו.







