AppCenter is 何?
Microsoftが開発している統合CI PaaS環境です。
詳しくは公式サイトを参照してください。
githubなどのgitレポジトリで連携してテストからビルドしてテスター配布までの作業を自動化できる他クラッシュレポート、Codepush,Notification、Appiumなどを使用した様々な実機によるリモート実機テストなどもサポートしています。fastlaneなどの外部ツールと連携するためのプラグイン機構もあります。
buildの構成
Appcenterのビルドフック
AppcenterのCIプロセスは
- レポジトリからのclone
- ビルド
- テスト(npm run test)
- 実機テスト(npm run test)
- 署名
- リリース
といった手順で進みます。このプロセスにおけるビルドの前後で
- appcenter-post-clone.sh
- appcenter-pre-build.sh
- appcenter-post-build.sh
というファイル名で、shellスクリプトを書くと、それぞれのファイル名に応じたタイミングでイベントフックをして、任意の処理を実行することができます。これらのファイルの配置場所はどのフレームワークや技術セットを使ったかによって微妙に配置場所が異なるので注意してください。react-nativeの場合は、package.jsonの配置場所と同じパスに置かなければいけないという制約があります(今後指定方法が増える可能性は感じています)。このあたりは、よくあるCIのパイプラインの仕組みと一緒かと思います。post-cloneとpre-buildのタイミングの違いはreact-nativeの場合は、post-cloneの場合はgit cloneを実行した直後、pre-buildはnpm install,pod installの直後に指定の処理を行うことができあます。
この機能はカスタムビルドスクリプトと呼ばれています。
についての詳細は以上のいリンクをご覧ください。
## 実際の運用例
うちのチームではCI上のビルドを行う際にfirebaseの設定が必要となるためenv/firebaseConfigディレクトリからビルドの解析パスに設定ファイルをコピーする処理をシェルで書いています
env/firebaseConfig
├── development
│ ├── GoogleService-Info.plist
│ └── google-services.json
├── production
│ ├── GoogleService-Info.plist
│ └── google-services.json
└── staging
├── GoogleService-Info.plist
└── google-services.json
#!/usr/bin/env bash
cwd=$(pwd)
baseDir="${cwd}/env/firebaseConfig/$ENV"
configFileIOS="GoogleService-Info.plist"
configFileAndroid="google-services.json"
if [ -d $baseDir ] && ! [ -z $ENV ];
then
echo "Switching to Firebase ${ENV} environment"
yes | cp -rf "$baseDir/$configFileAndroid" "${cwd}/android/app"
yes | cp -rf "$baseDir/$configFileIOS" "${cwd}/ios/app"
fi
また、Appcenterにもビルドに応じた環境変数を設定する機能がちゃんとあるので、ビルドに含まれるプライペートな情報や環境依存のパラメータははこれらを使用しましょう。例として以下にnodeのバージョンを切り替えてビルドするためのスクリプトを書いています。
set -ex
brew uninstall node@6
curl "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}.pkg" > "$HOME/Downloads/node-installer.pkg"
sudo installer -store -pkg "$HOME/Downloads/node-installer.pkg" -target "/"
ちなみに、以上の方法は公式に質問したところ、以上のようにやってくださいとの回答を得たものですので実行しても大丈夫だそうです。ビルドには時間制限があるため長期実行されているプロセスは勝手に打ち切られるとは思いますが、ちゃんと最低限モラルと暗黙の了解を守って使う必要はありますね。
appcenterには画面右下にチャットウインドウがあり、常駐のエンジニアに質問を投げかけることができるため、機能について深く突っ込んだ質問をしても親切に答えてくれます(ました)。この機能非常にありがたいので、とても好感持てました。
追記
RN0.56以上でバージョンを変える場合はnvm経由で変更するようにしてくださいとのアナウンスがありました。
まとめ
AppcenterはFabricに比べて情報が出てきづらいですが、非常に使いやすいと思いました。
FabricもFirebaseと統合されたことによって使いやすくなることは予想されますが、RNアプリに関して導入しようとしたところ、結構ハマりどころが多かったため、個人的にはAppcenterの方が楽に実装できました。
もし、興味があったら色々質問してください。僕もこういう事例あったら知りたいので、教えてくれる人いたら情報提供お待ちしいています。