development, staging, production...

Tue Nov 12, 2013

環境による設定の切り替えについて

ウェブアプリケーション開発

  • development (開発者の手元のPCだったりVMだったり)
  • staging (本番環境と同等の環境)
  • production (本番環境)

スマートフォンアプリ開発

  • development (手元でデバッグする用)
  • beta (社内β配信用)
  • release (Google Playにアップロードする用)

Androidでの環境の切り替え

  • 要件
    • APIのエンドポイントをステージングと本番環境で自動で切り替えたい
  • 前提条件
    • ビルドツールはGradleを使っている
  • 解決方法
    • buildConfigに定数を定義する(buildConfigプロパティに渡したStringが直接Generateされます)
// build.gradle
buildTypes {
    debug {
        buildConfig "public static final boolean STAGING = true;"
        debuggable true
        runProguard false
    }
    ...
/** Automatically generated file. DO NOT MODIFY */
package com.cookpad.android.activities;

public final class BuildConfig {
    public static final boolean DEBUG = Boolean.parseBoolean("true");

    // lines from build type: debug
    public static final boolean STAGING = true;
}
public class MyApiClient {
    public static final String endpoint = BuildConfig.STAGING ? "my.staging.server" : "my.service";
    ...
}

!!!簡単!!!

もうちょっとだけ続きます。

実際のビルド環境

  • development (ローカルPCでのビルド、デバッグ用、ステージングを向いてる、ログを出力する、ProGuardは無効、DeployGateは有効、Crashlyticsは無効…)
  • beta (Jenkinsでのビルド、社内β配信用、本番環境を向いてる、ログは出力する、ProGuardは有効、DeployGateは有効、Crashlyticsは無効…)
  • release (Jenkinsでビルド、Google Playにアップロードする用、本番環境を向いている、ProGuardは有効、DeployGateは無効、Crashlyticsは有効…)

API、課金周り、その他もろもろで設定項目が多い場合に buildConfig を使うとファイルが三項演算子だらけになって読みにくくなるので、弊社では buildTypesproductFlavors の設定で環境を切り替えています。

// build.gradle
buildTypes {
    debug {
        debuggable true
        runProguard false
    }
    beta {
        signingConfig signingConfigs.cookpadConfig
        debuggable true
        runProguard true
        proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
        proguardFile file('proguard-project-common.txt')
        proguardFile file('proguard-project-beta.txt')
    }
    release {
        signingConfig signingConfigs.cookpadConfig
        debuggable false
        runProguard true
        proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
        proguardFile file('proguard-project-common.txt')
        proguardFile file('proguard-project-release.txt')
    }
}

productFlavors {
    staging {}
    product {}
}

これにOSバージョンが加わると…

buildTypes * productFlavors * OS version * 解像度 = ビルド時間∞

Jenkinsでビルドが40分超え…

{% oembed https://twitter.com/rejasupotaro/status/397977669062500352 %}

設定を見なおして現在24分。(まだ長い)

AndroidのテストはGradleで並列化できない。Espressoで並列化?Robolectric使う?(次回以降のポテトチップスで……)

まとめ

buildConfigに書いたStringはそのままソースになります



  « Previous: Next: »