Androidの統合と展開チュートリアル


我々はAndroidアプリで動作するように、我々は定期的に-自動テストの助けを借りてうまくコードをテストします.そして、それが新しいバージョンをリリースする時間であるとき、我々は我々がGoogleプレイストアに配備するAPKまたはAppBuln形式にソースコードを集めます.
それは単純なプロセスのようですが、パッケージに署名して、バージョンコードと名前を更新するように、いくつかの他のステップが関係しています.
しばらくして、手動で非常に退屈で疲れるので、このプロセスを自動化できますか?

セマフォに入る


Semaphore あなたが構築、テスト、およびあなたのAndroidプロジェクトを展開することによって、ワークフローを自動化するのに役立ちます最速とサービスです.何が問題に焦点を当てることができますこの方法:あなたのコード.
このチュートリアルでは、ネイティブのAndroidプロジェクトのセマフォを設定する方法について説明します.

必要条件


このチュートリアルについては、次の手順を実行します.

  • Git
    GitHub アカウント.
  • セマフォアカウント.あなたは無料で1つを得ることができます
    semaphoreci.com .
  • エーGoogle Play Developer account to
    アプリを公開します.
  • 1分でこのチュートリアルを終える方法


    すぐに始めるには、次のようにします.
    セマフォで、一番上のナビゲーションのリンクに従って、新しいプロジェクトを作成します.
    例リストから、Androidを選択します.
    Semaphoreはデモプロジェクトをforkします.

    セマナギデモス / セマフォデモ



    そして1分以下で完全なCI/CDパイプラインを設定します.

    それです.お済みです.マイクドロップ
    デモは、すべてのオープンソースのリストはシンプルなアプリですSemaphore demo projects Githubについてこれは、ユニットとの統合テストを含むGradle Play Publisher プラグインは、あなたのアプリケーションをストアに公開するためにGradleタスクを追加します.
    このアプリライブを見ることができますon the Play Store .
    しかし、私はあなたがここでどのようにあなた自身のAndroidプロジェクトの連続的な統合を設定する方法を学ぶ可能性が高いことを知っている.それでは、プロジェクトとしてデモプロジェクトを使用する方法を見てみましょう.
    これらの指示をプロジェクトに適応させるのは難しすぎる.しかし、チャレンジに実行する場合は、コメントのセクションで質問をすること自由に感じなさい.💬

    からのセマフォへのCI / CDの設定


    セマフォアカウントを作成した後にcreate your first Semaphore project . セマフォ設定は、リポジトリのルートディレクトリに格納されます.semaphore . あなたのエントリポイントはsemaphore.yml ファイル.
    このチュートリアルでは、構成ファイルを読み込むことによって、AndroidのCI/CDワークフローを設定する方法を説明します.あなたはセマフォと一般的なAndroidの連続の統合について最も学びますその方法.
    しかし、あなたは手でYAMLを書く必要はありません.また、セマフォのgraphical workflow builder より視覚的なアプローチのために.

    👉 See this public workflow to get a taste of Semaphore’s UI and the final project running.


    あなたのAndroidプロジェクトのためのセーフティネット


    我々は、リンギングツールを実行し、プロジェクトのテストを実行することによって、コードの定期的なチェックを実行し、それらを自動化する必要があります.セマフォで何ができるかチェックしましょうsemaphore.yml 設定ファイル.

    👉 You can see the full file of the demo project on GitHub.


    あなたのコードが走るところ


    agent:
      machine:
        type: e1-standard-2
        os_image: ubuntu1804
      containers:
        - name: main
          image: registry.semaphoreci.com/android:29
    
    ここでビルドを実行する環境を定義します.私たちは2つのVCPA、Ubuntu 18.04 OSを実行するRAMの4 GBのLinuxマシンが欲しい.また、私たちの仕事を実行するには、最新の(時点で)を書いているAndroid SDKがインストールされているコンテナにSemaphore Container Registry .

    Semaphore always caches the two latest stable versions of Android SDK to ensure that the machine is ready in no time, making our builds faster.


    グローバルジョブの設定


    global_job_config:
      env_vars:
        - name: ADB_INSTALL_TIMEOUT
          value: "10"
      secrets:
        - name: android_keys
      prologue:
        commands:
          - checkout
          - mv ~/release-keystore.jks ~/$SEMAPHORE_GIT_DIR/app/release-keystore.jks
          - cache restore gradle-wrapper
          - cache restore gradle-cache
          - cache restore android-build
    
    セマフォのGlobal Job Config パイプライン全体で共有される構成のセットを定義できます.これは私たちが1つですべてを定義することができますので、非常に有用です
    代わりにすべてのタスクでそれを繰り返すの場所.
    ここでは、新しい環境変数ADB_INSTALL_TIMEOUT それでadb エミュレータをセットアップしている間はタイムアウトしないでください
    統合テスト.
    私たちはまた、私たちはglobal secrets android_keys これにより、キーとパスワードを秘密として定義することができます.
    具体的にはdemo project 我々は、次の秘密を保存しているandroid_keys :
  • release-keystore.jks : リリースビルドに署名するキーストアファイル
  • RELEASE_KEYSTORE_PASSWORD : 当社のkeystoreパスワード;
  • RELEASE_KEY_ALIAS : キーストアのキー別名
  • RELEASE_KEY_PASSWORD : 当社のkeystoreキーパスワード;
  • service-account-key.json : the service account key ,
    デモアプリケーションを展開するために使用Play Store .
  • これは理想的な場所ので、キーなどの機密データを保存します.必ず使用するsecrets あなたのGitリポジトリに機密情報を押す代わりにビルドします.
    The prologue セクションでは、ジョブの開始前にコマンドセットを実行できます.Gitリポジトリからコードをチェックアウトし、keystoreファイルを正しいパスに移動し、ビルドを高速にするためにキャッシュを復元します.

    パイプラインブロック


    ここでは、実行するすべてのビルドタスクを追加できます.仕事を定義する
    それぞれのタスクのうち、このパイプラインで実行するコマンド.始めましょう
    トップで.

    ビルドブロック


    - name: 'Build'
      task:
        jobs:
          - name: 'Build Project'
            commands:
              - ./gradlew bundle
        epilogue:
          on_pass:
            commands:
              - cache clear
              - cache store gradle-wrapper ~/.gradle/wrapper
              - cache store gradle-cache ~/.gradle/caches
              - cache store android-build ~/.android/build-cache
    
    まず最初にやりたいことは、実行してプロジェクトを構築することです./gradlew
    bundle
    すべてがOKであることを確認する.では、epilogue , このジョブが成功した場合にのみ実行されます.

    検証ブロック


    - name: 'Verification'
      skip:
        when: "pull_request !~ '.*'"
      task:
        jobs:
          - name: 'Analyze Code'
            commands:
              - ./gradlew lint
          - name: 'Unit Tests'
            commands:
              - ./gradlew test
          - name: 'Integration Tests'
            commands:
              # Install the required tools and the emulator itself
              - sdkmanager "platform-tools" "platforms;android-29" "build-tools;30.0.0" "emulator"
              # Install system images for the emulator
              - sdkmanager "system-images;android-29;google_apis;x86"
              # Create an emulator with the installed system images
              - echo no | avdmanager create avd -n test-emulator -k "system-images;android-29;google_apis;x86"
              # Start the emulator with no audio, boot animation, window, and with GPU acceleration off
              - emulator -avd test-emulator -noaudio -no-boot-anim -gpu off -no-window &
              # Wait for the emulator to boot completely
              - adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;'
              # Dismiss the emulator lock screen and wait 1 second for it to settle
              - adb shell wm dismiss-keyguard
              - sleep 1
              # Disable window and transition animations. This is required to run UI tests correctly
              - adb shell settings put global window_animation_scale 0
              - adb shell settings put global transition_animation_scale 0
              - adb shell settings put global animator_duration_scale 0
              - ./gradlew connectedAndroidTest
        epilogue:
          always:
            commands:
              - artifact push job --expire-in 2w --destination reports/ app/build/reports/
    
    現在、本当の仕事は始まります.これは、我々がAをしている検証ブロックです
    lintチェックと実行をテストします.また、私たちはskip condition これはセマフォに対し、プルリクエストが
    オープン.
    何が起こっているのか
  • ./gradlew lintAndroid Lint それはコードを分析する
    問題があるかどうかチェックする.
  • ./gradlew testUnit Tests 我々のプロジェクトで.
  • ./gradlew connectedAndroidTestIntegration Tests , アフターセット
    エミュレータを起動します.
  • Usually, this is enough to verify the code and should always be checked/ran before merging and deploying a new app version so that we're sure that we're not introducing bugs or bad code into the project. You can add more jobs here if you need to perform additional checks.


    すべてが完了した後、エピローグでは、我々はテストレポートをアップロードしているartifacts それで、何かが我々のテストで間違っているならば、我々はより多くの詳細を見るためにレポートに相談することができます.

    👉 It's important to note that every thing will run in parallel making Semaphore builds extremely fast.


    プロモーション


    Promotions 私たちが特定の条件が満たされるとき、我々が我々のパイプラインを分岐させたいとき、使われます.これは展開に最適です.
    promotions:
      - name: Internal Deploy
        pipeline_file: deploy-internal.yml
        auto_promote:
          when: "result = 'passed' AND branch = 'dev'"
      - name: Beta Deploy
        pipeline_file: deploy-beta.yml
        auto_promote:
          when: "result = 'passed' AND branch = 'master'"
    
    我々は2つの他のパイプラインを持っているので、2つのプロモーションのように.我々は、我々は新しいコードをプッシュするときに内部トラックに我々のアプリを展開するパイプラインに促進したいdev , そして、我々が新しいコードをプッシュするとき、ベータトラックにmaster .

    それが完全な栄光であるパイプラインは、ここにあります.どのように迅速に通知します.

    連続展開:あなたもAndroidでそれを行うことができます!


    プロジェクトがすべてOKであることを確認した後、展開を自動化したい.

    Check the full configurations for the internal pipeline and beta pipeline.


    ほとんどの構成は前に説明したものと同じである.我々は、グローバルな設定には、アプリケーションを展開し、新しいブロックを追加する必要があるとして、正しいアカウントにサービスアカウントのキーを移動するコマンドを追加しました.

    展開ブロック


    - name: 'Internal Deployment'
      task:
        jobs:
          - name: "Deploy to Play Store - Beta Track"
            commands:
              - ./gradlew publishReleaseBundle --track beta
    
    ここでは、単にGoogle Play Publisher Gradleプラグイン.内部パイプラインと異なる唯一のものは引数ですtrack これはinternal 代わりにトラック.また、我々は増加することについて心配する必要はありませんversionCode セマフォワークフロー番号を使用しているので、毎回environment variable そのため、新しいビルドが実行されているときは常にインクリメントされます.

    あなたに


    完全なデモプロジェクトをチェックしてくださいGitHub 完全な例については、自分でコードを探索することを確認してください.お気軽にフォークして、次の基地として使用するSemaphore プロジェクト
    あなたが追加するようにワークフローを改善するためにできることがまだありますSlack notifications , 使用webhooks , ChangeLogファイルを更新したり、Githubのリリースを作成しても、セマフォについての良いこと、一般的なCI/CDツールは、あなたが次のAndroidアプリのコード:最終的に問題に焦点を当てることができることです.
    このチュートリアルについて質問がありますか?あなたの結果を披露したいですか?コメントを残す.🙇‍♂️