Sobes.tech
Middle+

Мобилдик тиркемелер үчүн CI/CD өнүктүрүүдө кандай тажрыйбаңыз бар?

sobes.tech AI

AIден жооп

Мен мобилдик тиркемелер үчүн CI/CD конвейерлерин түзүүдө тажрыйбага ээмин (iOS жана Android).

Иштеген негизги этаптар:

  • Жыйноо: iOS үчүн Xcodebuild жана Android үчүн Gradle колдонуу. Жыйноо системалары менен интеграция (Jenkins, GitLab CI/CD, CircleCI, GitHub Actions).
  • Тестирлөө: Юнит тесттерди, интеграциялык тесттерди, UI тесттерди симуляторлордо/эмуляторлордо же реалдуу түзмөктөрдө иштетүү (Firebase Test Lab, BrowserStack, Device Farm аркылуу).
  • Кол коюу: Тиркемелерди жарыкка чыгаруу үчүн автоматташтыруу (Code Signing Identities, Provisioning Profiles iOS үчүн; Keystore Android үчүн).
  • Таратуу:
    • Ички жыйноолор: iOS үчүн TestFlight жана Android үчүн Firebase App Distribution/Internal Test Tracks колдонуу.
    • Дүкөндөргө жарыялоо: Артефактарды App Store Connectке жүктөө автоматташтыруу Fastlane же iTunes Connect Transporter аркылуу жана Google Play Store үчүн Google Play Developer API же Fastlane аркылуу.

Колдонулган инструменттер:

  • CI/CD системдери: Jenkins, GitLab CI/CD, GitHub Actions.
  • Жыйноо/таратуу автоматташтыруу инструменттери: Fastlane, Gradle, Xcodebuild.
  • Тартынмаларды башкаруу: CocoaPods, Carthage iOS үчүн; Gradle Dependency Management Android үчүн.
  • Тестирлөө инструменттери: XCTest, EarlGrey, Appium, Espresso, UI Automator.
  • Булуттык тестирлөө кызматтары: Firebase Test Lab, BrowserStack.
  • Версия контрол системдери: Git.

Пайплайндин мисалы (жөнөкөйлөштүрүлгөн):

# .gitlab-ci.yml мисалы GitLab CI/CD үчүн

стадийлер:
  - build
  - test
  - deploy_internal
  - deploy_store

өзгөрмөлөр:
  ANDROID_BUILD_TOOLS: "30.0.3"
  ANDROID_SDK_ROOT: "$CI_PROJECT_DIR/android-sdk"

кэш:
  жолдор:
    - ~/.gradle/caches
    - ~/.gradle/wrapper
    - Pods/

build_android:
  этап: build
  сүрөт: openjdk:11-jdk-slim
  өзгөрмөлөр:
    GRADLE_OPTS: "-Dorg.gradle.daemon=false"
  алдын-ала скрипт:
    - apt-get жаңыртуу && apt-get орнотуу -y unzip
    - mkdir $ANDROID_SDK_ROOT
    - wget https://dl.google.com/android/repository/commandlinetools-linux-7583922_latest.zip
    - unzip commandlinetools-linux-7583922_latest.zip -d $ANDROID_SDK_ROOT
    - yes | $ANDROID_SDK_ROOT/cmdline-tools/bin/sdkmanager --licenses
    - $ANDROID_SDK_ROOT/cmdline-tools/bin/sdkmanager "platforms;android-30" "build-tools;$ANDROID_BUILD_TOOLS"
    - export PATH=$PATH:$ANDROID_SDK_ROOT/cmdline-tools/bin:$ANDROID_SDK_ROOT/platform-tools
    - cd android
  скрипт:
    - ./gradlew assembleRelease
  унутру:
    - android/app/build/outputs/apk/release/*.apk

build_ios:
  этап: build
  сүрөт: macos_runner # Спецификалык macOS/Xcode рънэр талап кылынат
  алдын-ала скрипт:
    - gem install bundler
    - cd ios
    - bundle install
  скрипт:
    - bundle exec fastlane build release
  унутру:
    - ios/*.ipa # же башка fastlane чыгуу

test_android_unit:
  этап: test
  сүрөт: openjdk:11-jdk-slim
  алдын-ала скрипт:
    - cd android
  скрипт:
    - ./gradlew testReleaseUnitTest

test_ios_unit:
  этап: test
  сүрөт: macos_runner
  алдын-ала скрипт:
    - pod install # CocoaPods колдонулса
    - cd ios
  скрипт:
    - xcodebuild test -project YourApp.xcodeproj -scheme YourApp -destination 'platform=iOS Simulator,name=iPhone 12'

deploy_android_firebase:
  этап: deploy_internal
  сүрөт: openjdk:11-jdk-slim
  алдын-ала скрипт:
    - apt-get update && apt-get install -y curl
    - curl -sL https://firebase.tools | bash
    - cd android
  скрипт:
    - firebase appdistribution:distribute app/build/outputs/apk/release/*.apk --app <firebase-app-id> --token $FIREBASE_TOKEN --release-notes "Автоматташтырылган курулуш ${CI_PIPELINE_IID}" --testers-file ../testers.txt

deploy_ios_testflight:
  этап: deploy_internal
  сүрөт: macos_runner
  алдын-ала скрипт:
    - cd ios
  скрипт:
    - bundle exec fastlane pilot upload

deploy_android_play_store:
  этап: deploy_store
  сүрөт: openjdk:11-jdk-slim
  алдын-ала скрипт:
     - apt-get update && apt-get install -y python3 python3-pip
     - pip3 install google-api-python-client oauth2client
     - cd android
  скрипт:
     - echo "$GOOGLE_PLAY_KEY_JSON" | base64 --decode > service_account_key.json
     - bundle exec fastlane supply
  only:
    - tags # Дүкөнгө гана тэгдер менен чыгуу

deploy_ios_app_store:
  этап: deploy_store
  сүрөт: macos_runner
  алдын-ала скрипт:
    - cd ios
  скрипт:
    - bundle exec fastlane deliver
  only:
    - tags # Дүкөнгө гана тэгдер менен чыгуу

Жумушумдун негизги багыттары — куруу убактысын оптималдаштыруу, Flaky Tests-тин санын азайтуу, пайплайндын абалы тууралуу кабарлоо жөндөөлөрү. Подписка жана сертификаттарды башкаруу боюнча коопсуздукка өзгөчө көңүл бөлдүм. CI/CD системаларында сырсөздөрдү сактоо үчүн сырдуу өзгөрмөлөрдү колдонуп келдим.