CI/CD סוהר לנייד עם Jenkins

בנייה ידנית ושחרור של אפליקציות מובייל גוזלים זמן צוות שיכול להיות מושקע בפיתוח. אנחנו מקימים CI/CD דרך Jenkins במתכונת turnkey, ומבצעים אוטומציה של כל התהליך מקומיט ועד פרסום בחנות. הצוות שלנו מטפל בהגדרת agents, pipelines ובשילוב fastlane, ומספק פתרון אמין וסקלבילי עם תמיכה מתמשכת.

פיתוח ותמיכה בכל סוגי היישומים הניידים:

יישומים ניידים למידע ובידור
אפליקציות חדשות, משחקים, מדריכים, קטלוגים מקוונים, אפליקציות מזג אוויר, אפליקציות כושר ובריאות, אפליקציות נסיעות, אפליקציות חינוכיות, רשתות חברתיות ומסנג'רים, חידונים, בלוגים ופודקאסטים, פורומים, אגרגטורים
יישומים ניידים למסחר אלקטרוני
חנויות מקוונות, אפליקציות B2B, מרקטפלייסים, בורסות מקוונות, שירותי קאשבק, בורסות, פלטפורמות דרופשיפינג, תוכניות נאמנות, משלוחי מזון ומוצרים, מערכות תשלום.
יישומים ניידים לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, ניהול פרויקטים, כלים לצוותי מכירות, ניהול פיננסי, ניהול ייצור, ניהול לוגיסטיקה ומשלוחים, ניהול משאבי אנוש, מערכות ניטור נתונים
יישומים ניידים לשירותים אלקטרוניים
פלטפורמות מודעות מסווגות, בתי ספר מקוונים, בתי קולנוע מקוונים, פלטפורמות שירות אלקטרוניות, פלטפורמות קאשבק, אירוח וידאו, פורטלים נושאיים, פלטפורמות הזמנות ותזמון מקוונות, פלטפורמות מסחר מקוונות

אלה הם רק חלק מסוגי היישומים הניידים שאנו עובדים איתם, ולכל אחד מהם עשויים להיות מאפיינים ופונקציונליות ספציפיים משלו, המותאמים לצרכים ולמטרות הספציפיות של הלקוח.

השירותים שאנו מציעים
מציג 1 מתוך 1כל 1734 השירותים
CI/CD סוהר לנייד עם Jenkins
מורכב
~3-5 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית מובייל עבור FEEDME
    פיתוח אפליקציית מובייל עבור FEEDME
    971
  • פיתוח אפליקציית מובייל עבור XOOMER
    פיתוח אפליקציית מובייל עבור XOOMER
    869
  • פיתוח אפליקציית מובייל עבור RHL
    פיתוח אפליקציית מובייל עבור RHL
    1289
  • פיתוח אפליקציית מובייל עבור ZIPPY
    פיתוח אפליקציית מובייל עבור ZIPPY
    1143
  • פיתוח אפליקציית מובייל עבור Affhome
    פיתוח אפליקציית מובייל עבור Affhome
    1076
  • פיתוח אפליקציית מובייל עבור חברת FLAVORS
    פיתוח אפליקציית מובייל עבור חברת FLAVORS
    677

הרכבה ידנית שעתית של אפליקציות מובייל ולאחר מכן העלאה ל-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 שלב אחר שלב:

  1. התקינו Xcode 16 (ראו Apple Developer) ו-Command Line Tools על ה-Mac.
  2. הגדירו Keychain עם אישורי חתימת קוד (ודאו שה-Keychain לא נעול).
  3. התקינו fastlane דרך gem install fastlane או brew install fastlane. Fastlane Docs ממליצים על כך לאוטומציה.
  4. הגדירו CocoaPods או Swift Package Manager (התלויות יישמרו במטמון).
  5. חברו את ה-agent ל-Jenkins Controller דרך SSH (מצב LaunchDaemons אינו מתאים — השתמשו ב-launchctl עבור סשן GUI).
  6. הוסיפו שלב 'Unlock Keychain' ב-Jenkinsfile (ראו להלן).

ארכיטקטורת Jenkins לפיתוח מובייל

Jenkins Controller (Linux/macOS)
├── macOS Agent (для iOS)
│   ├── Xcode 16
│   ├── fastlane
│   └── CocoaPods / SPM
└── Linux Agent (для Android)
    ├── JDK 17
    ├── Android SDK
    └── Gradle

Agents מתחברים דרך 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 מלאה — כתבו לנו.