読者です 読者をやめる 読者になる 読者になる

中年エンジニアの開発と生活の日々

中年エンジニアがソフトウェア開発や日々の生活で得た知見の備忘録

Circle CI で iOS アプリと Android アプリのビルド番号を更新する

Circle CI のビルド番号を AndroidiOS のアプリのビルド番号に反映させる方法を紹介します。

Circle CI のビルド番号とは

Circle CI ではビルドごとに一意の値が決まるようにビルド番号を環境変数で用意しています。

CIRCLE_BUILD_NUM

この環境変数は Circle CI 側でナンバリングされます。

AndroidiOS の共通ルール

iOS アプリも Android アプリもアプリケーションのバージョンとビルドを特定するためのプロパティを持ちます。自分の今まで手がけているプロジェクトではバージョン番号は手動で更新、ビルド番号は自動で更新するようにシステムを構築することが多かったです。

Android のバージョン番号

Android のバージョン番号はアプリケーションの build.gradle の中にある defaultConfig に記載します。 以下の例では versionCode をビルド番号として、versionNameにバージョン番号(この例では 1.0.0)を記載しています。 versionCode には環境変数 CIRCLE_BUILD_NUM があれば、その番号をビルド番号にして、なければ 1 を使用します。 なので、Circle CI 上ではなく手元でビルドすると常に1になります。

android {
    compileSdkVersion 2X
    buildToolsVersion "2X.X.X"

    defaultConfig {
        applicationId "com.myApplication"
        minSdkVersion XX
        targetSdkVersion XX
        versionCode System.getenv("CIRCLE_BUILD_NUM") ? System.getenv("CIRCLE_BUILD_NUM").toInteger() : 1
        versionName "1.0.0"

    }

iOS のバージョン番号

iOS のバージョン番号は info.plist に格納されています。以下の例では CFBundleShortVersionString に Version 番号を、CFBundleVersionにビルド番号が格納されています。この例ではバージョン番号は 1.0.0、ビルド番号は1です。

 <key>CFBundleShortVersionString</key>
    <string>1.0.0</string>
    <key>CFBundleVersion</key>
    <string>1</string>

plist ファイルを直接更新することもできますが、XMLの値更新などをゼロからテンプレート処理をしようしてやるのは結構大変なので、自分は fastlane の機能を使用してビルド番号を書き換えています。 以下のように fastlane でビルド番号を更新する lane を作成してビルドの前に呼び出します。

Fastfileの抜粋です。fastlane のアクション increment_build_number に対して番号を設定することによって、ビルド番号を指定できます。

  desc 'Set build number to CIRCLE_BUILD_NUM'
  lane :set_build_num do
    buildNum = ENV['CIRCLE_BUILD_NUM']
    if buildNum == nil then
      buildNum = "1"
    end
    increment_build_number build_number: buildNum
  end

この lane を呼び出すことによってinfo.plistファイルが更新されます。

更新したビルド番号を Git に反映すべきか否か

現状は更新したビルド番号を Git には反映させていないが、ポリシーによっては反映させることも必要になります。ただ、その場合は android のbuild.gradleに環境変数を埋め込むのではなく、テンプレート処理などを行って、ファイルを書き換える処理が必要になります。

また、CIで Git を更新する場合はこの更新によってCIが起動しないように、Gitのコミット時にコメントの頭に [ci skip] をつけるなどしないと、永遠に CI が回り続けるので注意しましょう。

もっと、良いやり方があれば、指摘していただけると幸いです。