2019年8月30日金曜日

BitriseでアプリのバージョンとビルドナンバーをXcodeとかAndroid Studioを使わずに簡単に管理するための方法的なお話

  • このエントリーをはてなブックマークに追加

Birtriseはとても便利なCI/CDなわけで。
アプリをビルドしてadhoc配布もしてくれるわ、App Store上にアップロードもしてくれるわ、Google Play Storeにもアップしてくれるわといいことが多い。
もちろんアプリビルドとかがあると無料プランでは収まるわけがないから課金をせざるをえないんだけど、それでも十分すぎるほど楽になる感じ。

けどまぁ普通にやっているとアプリのバージョンとかビルドナンバーはXcodeを開いたりAndroid Studioを開いたりして管理しないといけなくかなり面倒。
もちろんBitriseのステップでビルドナンバーを埋め込んでくれるステップがあったりするんだけど、それはBitriseのジョブIDに準拠する形になるのでバージョンが飛んでしまうのが個人的にはあまり好きじゃなく。
かといって定数としていくつとか入れるのも面倒だし、Tagおよびリリースを発行したタイミングをトリガーにして、そのタグ名の中にビルドナンバーも埋め込んで、さらにバージョンも埋め込んじゃうっていう強引な方法もあるけど、それだとAdhoc配信するときとかどうするんだ?っていう感じでもあったり。

ということで今日はバージョンやビルドナンバーをなるべく簡単に管理する方法的なお話をば。

どうしてこうしたのとか長くなったので方法をまずは簡単に説明でも。

■versionを管理するファイルの作成

とりあえずリポジトリ内にVERSION_ENVというファイルを用意してあげましょう的な。
ちなみにVERSION_ENVの中身はkey=value形式で記述されている必要がある。

# VERSION_ENV
VERSION_NAME=0.0.0
VERSION_NUMBER=2


■ステップを跨いだ環境変数を定義するためのシェル記述

で、次にnpm installをするステップの次にシェルスクリプトを実行するステップをいれてあげる。
後述するけどenvmanというのを使えばステップ跨いだ環境変数を定義することができる。

#!/usr/bin/env bash
# fail if any commands fails
set -e
# debug log
set -x

# write your script here
while read line
do
  IFS='='
  set -- $line
  envman add --key $1 --value $2
done < ./VERSION_ENV

envmanについて

envmanだけどBitriseにもともと組み込まれている感じ。
最初はnpm scriptでnodeで実行するようにしようとしたけどnodeで実行してもダメだったのでこういう感じでシェルでやることになったっていう。

envman add --key foo --value "bar"
envman run bash -c 'echo $foo'

ちなみに厄介なところとしては、envman addをしたところですぐに環境変数としてexportされるわけではないということ。
だから同じステップ内で使いたいとかってなると上記のようにenvman run bash -cしてあげないとダメ。

// /path/to/file/which/contains/the/value
FOO=1
BAR=buzz

# key-valueを手動で入れる
envman add --key SOME_KEY --value "bar"

# valueをファイルから読みこむ
envman add --key SOME_KEY --valuefile /path/to/file/which/contains/the/value

またさらに厄介なところとして、--valuefileオプションをつけてあげることでファイルの中身を環境変数に設定することができる。
できるんだけど、気をつけておきたいところとしてSOME_KEY=ファイルの中身となるので、jsonだろうがymlだろうがなんだろうがパースしてくれるわけじゃないのに気をつけましょう的な。
$SOME_KEY["FOO"]とかそういうことはできないし、echo $SOME_KEYすると普通に中身がそのまま表示されるだけです的な。


■バージョンの環境変数からXcodeにバージョンとビルドナンバーを埋め込む

で、さらにXcodeにバージョン名とビルドナンバーを埋め込むステップを差し込んであげる。

Set Xcode Project Build Numberを選択して諸々を設定しましょう的な。 $VERSION_NAMEとか$VERSION_NUMBERが先ほどVERSION_ENVから取得した環境変数。
Androidも同様にChange Android versionCode and versionNameっていうのがあるからできますよ的な。


■この方法に至るまでのあれやこれやな話

基本的にiOSではplist内にバージョンが記述されていたりするし、Androidではgradle内に記述されていたりする。
ここをビルド時に直接変更してくれればいいわけで。
iOSだったらSet Xcode Project Build Numberっていうステップがあるし、AndroidだったらChange Android versionCode and versionNameがあるのでこれらを追加しましょう的な。
ビルドナンバーに関しては仮にBitriseのジョブIDでよいとしても、アプリのバージョンを直接毎回追加するとか色々と意味がないなぁと思ったり。
もちろん変数操作をしてもいいんだけどそれって普通に考えて無理じゃない?ってなる。

Bitriseでは環境変数をinput値として使用することができるので、バージョンだったりビルドナンバーを環境変数なりで埋め込んでビルドしちゃえば割といい感じになるわけで。
けどそれでもビルド毎にEnv Varsに入れるのは現実的じゃないし、かといって自動的に他でやる方法ないよねと思ったりなんだり。

もしくはBitriseではシェルを走らせることができるので、そこでexport APP_VERSION=0.0.0みたいな感じでやればいいと思ったりするんだけど、Bitriseでは環境変数を別ステップに持ち越すことができないので、埋め込むタイミングでその環境変数が空になってしまうという問題がある。
そこでBitrise上にインストールされているenvmanというのを使ってステップをまたぐことができる環境変数を作成するという方法でいけるんじゃないかと。
Expoだとapp.jsonにてversionを管理したりしてるわけで、そういうのと似たようなニュアンスで行きたいからそんなこんなでちょっと強引なこんな方法になってしまったけどっていう。


ってな感じでできました的な。
あれやこれやの後にコードとか諸々載せようと思ってたけどあれやこれやが微妙に長いからあれやこれやは後にしたっていう。

ちなみに個人的にはXcodeとAndroid Studioを極力触りたくないというところからこういう感じになった。
もちろんBitriseを使わないでビルドするとかとなるとちゃんと両方ともいじらないといけないので要注意なんだけど。

ってな感じで工夫してあげればExpoみたいに極力面倒なことをカットできるからBitriseっていいよね的なみたいな。

0 件のコメント:

コメントを投稿

Adsense