Sobes.tech
Middle+

Quelle est votre expérience dans le développement de CI/CD pour les applications mobiles?

sobes.tech IA

Réponse de l'IA

J'ai de l'expérience dans la construction de pipelines CI/CD pour les applications mobiles (iOS et Android).

Étapes clés sur lesquelles j'ai travaillé:

  • Construction: Utilisation de Xcodebuild pour iOS et Gradle pour Android. Intégration avec des systèmes de build (Jenkins, GitLab CI/CD, CircleCI, GitHub Actions).
  • Tests: Exécution de tests unitaires, tests d'intégration, tests UI sur simulateurs/emulateurs ou appareils réels (avec Firebase Test Lab, BrowserStack, Device Farm).
  • Signature: Automatisation du processus de signature des applications pour la publication (Identités de signature de code, profils d'approvisionnement pour iOS; Keystore pour Android).
  • Distribution:
    • Builds internes: Utilisation de TestFlight pour iOS et Firebase App Distribution/Inner Test Tracks pour Android.
    • Publication dans les magasins: Automatisation du téléchargement des artefacts dans App Store Connect via Fastlane ou iTunes Connect Transporter et dans Google Play Store via Google Play Developer API ou Fastlane.

Outils avec lesquels j'ai travaillé:

  • Systèmes CI/CD: Jenkins, GitLab CI/CD, GitHub Actions.
  • Outils d'automatisation de build/déploiement: Fastlane, Gradle, Xcodebuild.
  • Gestion des dépendances: CocoaPods, Carthage pour iOS; Gestion des dépendances Gradle pour Android.
  • Outils de test: XCTest, EarlGrey, Appium, Espresso, UI Automator.
  • Services de test cloud: Firebase Test Lab, BrowserStack.
  • Systèmes de contrôle de version: Git.

Exemple de pipeline (simplifié):

# Exemple .gitlab-ci.yml pour 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 # Requiert un runner macOS/Xcode spécifique
  before_script:
    - gem install bundler
    - cd ios
    - bundle install
  script:
    - bundle exec fastlane build release
  artifacts:
    paths:
      - ios/*.ipa # Ou sortie de 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 # si utilisation de 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 "Automated build ${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
     # Использование fastlane для упрощения или напрямую с API Google Play
     - 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 для хранения чувствительных данных.