Sobes.tech
Middle+

Какъв е вашият опит в разработването на CI/CD за мобилни приложения?

sobes.tech AI

Отговор от AI

Имам опит в изграждането на CI/CD конвейери за мобилни приложения (iOS и Android).

Ключовите етапи, с които работих:

  • Сглобяване: Използване на Xcodebuild за iOS и Gradle за Android. Интеграция с системи за сглобяване (Jenkins, GitLab CI/CD, CircleCI, GitHub Actions).
  • Тестване: Стартиране на юнит тестове, интеграционни тестове, UI тестове на симулатори/емуулатори или реални устройства (с помощта на Firebase Test Lab, BrowserStack, Device Farm).
  • Подписване: Автоматизация на процеса по подписване на приложения за публикуване (Code Signing Identities, Provisioning Profiles за iOS; Keystore за Android).
  • Разпространение:
    • Вътрешни сборки: Използване на TestFlight за iOS и Firebase App Distribution/Internal Test Tracks за Android.
    • Публикуване в магазини: Автоматизация на качването на артефакти в 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

stages:
  - build
  - test
  - deploy_internal
  - deploy_store

variables:
  ANDROID_BUILD_TOOLS: "30.0.3"
  ANDROID_SDK_ROOT: "$CI_PROJECT_DIR/android-sdk"

cache:
  paths:
    - ~/.gradle/caches
    - ~/.gradle/wrapper
    - Pods/

build_android:
  stage: build
  image: openjdk:11-jdk-slim
  variables:
    GRADLE_OPTS: "-Dorg.gradle.daemon=false"
  before_script:
    - apt-get update && apt-get install -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
  script:
    - ./gradlew assembleRelease
  artifacts:
    paths:
      - android/app/build/outputs/apk/release/*.apk

build_ios:
  stage: build
  image: macos_runner # Изисква специфичен macOS/Xcode рънър
  before_script:
    - gem install bundler
    - cd ios
    - bundle install
  script:
    - bundle exec fastlane build release
  artifacts:
    paths:
      - ios/*.ipa # Или какъвто и да е изходът на fastlane

test_android_unit:
  stage: test
  image: openjdk:11-jdk-slim
  before_script:
    - cd android
  script:
    - ./gradlew testReleaseUnitTest

test_ios_unit:
  stage: test
  image: macos_runner
  before_script:
    - pod install # ако се използва CocoaPods
    - cd ios
  script:
    - xcodebuild test -project YourApp.xcodeproj -scheme YourApp -destination 'platform=iOS Simulator,name=iPhone 12'

deploy_android_firebase:
  stage: deploy_internal
  image: openjdk:11-jdk-slim
  before_script:
    - apt-get update && apt-get install -y curl
    - curl -sL https://firebase.tools | bash
    - cd android
  script:
    - 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:
  stage: deploy_internal
  image: macos_runner
  before_script:
    - cd ios
  script:
    - bundle exec fastlane pilot upload

deploy_android_play_store:
  stage: deploy_store
  image: openjdk:11-jdk-slim
  before_script:
     - apt-get update && apt-get install -y python3 python3-pip
     - pip3 install google-api-python-client oauth2client
     - cd android
  script:
     - echo "$GOOGLE_PLAY_KEY_JSON" | base64 --decode > service_account_key.json
     - bundle exec fastlane supply
  only:
    - tags # Публикуване в магазина само при тагове

deploy_ios_app_store:
  stage: deploy_store
  image: macos_runner
  before_script:
    - cd ios
  script:
    - bundle exec fastlane deliver
  only:
    - tags # Публикуване в магазина само при тагове

Работих върху оптимизация на времето за сглобяване, намаляване на Flaky Tests, настройка на известия за статуса на пайплайна. Специално внимание отделях на сигурността при подписването и управлението на сертификати/ключове. Използвах секретни променливи в системите за CI/CD за съхранение на чувствителни данни.