Android Fastfile pour créer et télécharger plusieurs versions de Beta par Crashlytics


Exemple

Ceci est un exemple de configuration de Fastfile pour une application multi-saveur. Cela vous donne la possibilité de créer et de déployer toutes les saveurs ou une seule saveur. Après le déploiement, il signale à Slack le statut du déploiement et envoie une notification aux testeurs de la version bêta du groupe de testeurs Crashlytics.

Pour créer et déployer toutes les saveurs, utilisez:

fastlane android beta

Pour créer un seul APK et déployer, utilisez:

fastlane android beta app:flavorName

En utilisant un seul fichier Fastlane, vous pouvez gérer les applications iOS, Android et Mac. Si vous utilisez ce fichier, une seule platform - platform applications n'est pas requise.

Comment ça marche

  1. android argument android dit fastlane que nous allons utiliser :android plateforme :android .
  2. À l'intérieur :android plateforme :android , vous pouvez avoir plusieurs voies. Actuellement, je n'ai que :beta lane. Le second argument de la commande ci-dessus spécifie la voie que nous voulons utiliser.
  3. options[:app]
  4. Il y a deux tâches Gradle . Tout d'abord, il fonctionne gradle clean . Si vous avez fourni une saveur avec une clé d' app , fastfile exécute gradle assembleReleaseFlavor . Sinon, il exécute gradle assembleRelease pour générer toutes les gradle assembleRelease de build.
  5. Si nous construisons pour tous les goûts, un tableau de noms de fichiers APK générés est stocké dans SharedValues::GRADLE_ALL_APK_OUTPUT_PATHS . Nous l'utilisons pour parcourir les fichiers générés et les déployer sur Beta par Crashlytics . notifications champs de notifications et de groups sont facultatifs. Ils sont utilisés pour informer les testeurs enregistrés pour l'application sur la version bêta de Crashlytics .
  6. Si vous connaissez Crashlytics, vous savez peut-être que pour activer une application sur le portail, vous devez l'exécuter sur un périphérique et l'utiliser en premier. Sinon, Crashlytics assumera l'inactivité de l'application et générera une erreur. Dans ce scénario, je le capture et le signale à Slack comme un échec. Vous saurez ainsi quelle application est inactive.
  7. Si le déploiement réussit, fastlane enverra un message de réussite à Slack .
  8. #{/([^\/]*)$/.match(apk)} cette regex est utilisée pour obtenir le nom de saveur du chemin APK. Vous pouvez le supprimer si cela ne fonctionne pas pour vous.
  9. get_version_name et get_version_code sont deux plugins Fastlane permettant de récupérer le nom et le code de la version de l'application. Vous devez installer ces gemmes si vous voulez utiliser, ou vous pouvez les supprimer. En savoir plus sur les plugins ici.
  10. L'instruction else sera exécutée si vous construisez et déployez un seul APK. Nous n'avons pas à fournir apk_path à Crashlytics car nous n'avons qu'une seule application.
  11. error do bloc à la fin est utilisé pour être averti si quelque chose ne va pas pendant l'exécution.

Remarque

N'oubliez pas de remplacer SLACK_URL , API_TOKEN , GROUP_NAME et BUILD_SECRET par vos propres informations d'identification.

fastlane_version "1.46.1"

default_platform :android

platform :android do

    before_all do
        ENV["SLACK_URL"] = "https://hooks.slack.com/servic...."
    end
    
    lane :beta do |options|
        # Clean and build the Release version of the app.
        # Usage `fastlane android beta app:flavorName`
    
        gradle(task: "clean")
    
        gradle(task: "assemble",
               build_type: "Release",
               flavor: options[:app])
    
        # If user calls `fastlane android beta` command, it will build all projects and push them to Crashlytics
        if options[:app].nil?
            lane_context[SharedValues::GRADLE_ALL_APK_OUTPUT_PATHS].each do | apk |
    
                puts "Uploading APK to Crashlytics: " + apk
    
                begin
                    crashlytics(
                      api_token: "[API_TOKEN]",
                      build_secret: "[BUILD_SECRET]",
                      groups: "[GROUP_NAME]",
                      apk_path: apk,
                      notifications: "true"
                    )
    
                    slack(
                      message: "Successfully deployed new build for #{/([^\/]*)$/.match(apk)} #{get_version_name} - #{get_version_code}",
                      success: true,
                      default_payloads: [:git_branch, :lane, :test_result]
                    )
                rescue => ex
                    # If the app is inactive in Crashlytics, deployment will fail. Handle it here and report to slack
                    slack(
                        message: "Error uploading => #{/([^\/]*)$/.match(apk)} #{get_version_name} - #{get_version_code}: #{ex}",
                        success: false,
                        default_payloads: [:git_branch, :lane, :test_result]
                    )
                end
            end
    
            after_all do |lane|
                # This block is called, only if the executed lane was successful
                slack(
                    message: "Operation completed for #{lane_context[SharedValues::GRADLE_ALL_APK_OUTPUT_PATHS].size} app(s) for #{get_version_name} - #{get_version_code}",
                    default_payloads: [:git_branch, :lane, :test_result],
                    success: true
                )
            end
        else
            # Single APK upload to Beta by Crashlytics
            crashlytics(
                api_token: "[API_TOKEN]",
                build_secret: "[BUILD_SECRET]",
                groups: "[GROUP_NAME]",
                notifications: "true"
            )
    
            after_all do |lane|
                # This block is called, only if the executed lane was successful
                slack(
                    message: "Successfully deployed new build for #{options[:app]} #{get_version_name} - #{get_version_code}",
                    default_payloads: [:git_branch, :lane, :test_result],
                    success: true
                )
            end
        end
    
        error do |lane, exception|
            slack(
                message: exception.message,
                success: false,
                default_payloads: [:git_branch, :lane, :test_result]
            )
        end
    end
end