git管理下から除外したgoogle-services.jsonをCircle CIから読み込む

TL;DR

  • jsonファイルをbase64化してテキストにする
  • それをCircle CIの環境変数に設定
  • circle.ymlでjsonファイルにデコードする命令を書く

概要

google-services.jsonはFirebaseなどのgoogleサービスと連携するために必要なファイルだが、これはプライベートな情報であるためGithub等のpublicリポジトリの管理下に置くべきではない。

だが、単純にファイルを除外するだけだとCIサービスからファイルを参照できなくなり、ビルドに失敗する。

Circle CIではドキュメントに方法が記載されているが、Firebaseの場合、単純にこの通りではうまくいかないので、本記事ではファイルを除外し、Circle CIで正常にビルドできるようにするまでをメモしておく。

手順

google-services.jsonの除外

.gitignoregoogle-services.jsonを追加すればok。

google-services.jsonをbase64化

ターミナルから以下コマンドを実行。

$ openssl base64 -in <SOURCE_FILE_NAME> -out <OUT_FILE_NAME>

Circle CIの環境変数に登録

Circle CIプロジェクト設定のEnvironment Variablesに追加する。

例えば、こんな感じ。

GOOGLE_SERVICES_JSON xxxxxxxxx...

circle.ymlの設定

設定した環境変数のテキストをjsonファイルにデコードする処理を書く。

dependencies:
  pre:
    ...
    - echo $GOOGLE_SERVICES_JSON | base64 --decode --ignore-garbage > ${HOME}/${CIRCLE_PROJECT_REPONAME}/app/google-services.json

CircleCIのドキュメントでは${HOME}/gcloud-service-key.jsonとなっているが、これだとno such file or directory的なエラーが出るので、プロジェクト名とモジュール名(Firebaseで利用する際にはこの直下にjsonファイルを置くことになるので)も指定する必要がある。

appまで指定しないとデコード処理は通るが、アプリのビルド処理でファイルが見つからずコケることになる。

ちなみに、${HOME}/home/ubuntu${CIRCLE_PROJECT_REPONAME}はプロジェクト名が返る。

これで正常にビルドできるようになった。