開発Tips

BitriseでAndroidビルドをするときにハマった4つのポイント

仕事で CI サービス Bitrise を使うことになり、Android のビルドを通すまでに何度もつまずきました。ドキュメントどおりにやってもエラーが続いたので、ハマったポイントと解決策を4つ残しておきます。

つまずき1: NDK を使っているとビルドが通らない

アプリが NDK を利用している場合、WorkFlow で SDK のインストールと合わせて NDK のインストールも行う必要がありました。SDK だけ入れて NDK を忘れると、ビルド時に見つからず失敗します。

つまずき2: build.gradle に署名設定が書いてある

build.gradle にすでに署名(signing)設定を書いている場合、Bitrise の「Android Sign」ステップと二重になってかみ合いません。署名込みで build.gradle が完結しているなら、Gradle Runner でそのままビルドする方が素直でした。

つまずき3: なぜか SDK インストールで失敗する

SDK インストールのステップが不安定で失敗することがありました。最終的にはビルドを全部 fastlane に寄せて、Bitrise からは lane を呼ぶだけにすることで安定しました。CI 側の個別ステップを減らし、ビルドロジックを fastlane に集約する方針です。

つまずき4: Artifacts で APK が取得できない

ビルドは通るのに Artifacts に APK が出てこない。原因は余計なステップが APK の出力を邪魔していたことでした。不要なジョブ(特に不安定だった SDK インストール)を削り、最小構成にしたら取得できるようになりました。

結果、WorkFlow はこんな見た目に落ち着きました。

Bitrise の WorkFlow 画面

落ち着いた bitrise.yml(例)

個人開発でも build.gradle に署名設定を入れているケースは多いと思うので、参考までに最小構成の bitrise.yml を置いておきます(トークン類はすべて環境変数参照です)。

---
format_version: '7'
default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git
project_type: android
workflows:
  debug-deploy:
    steps:
    - activate-ssh-key@4.0.3:
        run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}'
    - git-clone@4.0.14: {}
    - script@1.1.5:
        title: Do anything with Script step
        inputs:
        - content: |
            #!/usr/bin/env bash
            set -e
            set -x
    - cache-pull@2.0.1: {}
    - gradle-runner@1.9.0:
        inputs:
        - gradle_task: assembleDebug
        - gradlew_path: "$PROJECT_LOCATION/gradlew"
    - deploygate--upload-app-bitrise-step@1.0.1:
        inputs:
        - owner_name: "$DEPLOYGATE_OWNER"
        - app_path: "$BITRISE_APK_PATH"
        - message: "[$BITRISE_BUILD_NUMBER] Debug Build [$BITRISE_GIT_BRANCH]"
        - api_key: "$DEPLOYGATE_API_KEY"
    - deploy-to-bitrise-io@1.4.1: {}
    - cache-push@2.2.0: {}
    - slack@3.1.2:
        inputs:
        - webhook_url: "$SLACK_URL"
app:
  envs:
  - opts: { is_expand: false }
    PROJECT_LOCATION: "."
  - opts: { is_expand: false }
    MODULE: app
  - opts: { is_expand: false }
    VARIANT: ''
trigger_map:
- push_branch: master
  workflow: debug-deploy

まとめ

Bitrise の Android ビルドでハマったら、(1) NDK の入れ忘れ、(2) 署名設定の二重定義、(3) ステップの不安定さは fastlane 集約で回避、(4) 余計なステップを削って最小構成に——この4点を疑ってみてください。「ステップを足す」より「削って fastlane に寄せる」方が、結果的に安定しました。