ローカルでgitignoreしていたファイルも含めてBitriseでビルドしたい


はじめに

今回は多くの企業で利用されているモバイルアプリCI/CDのBitriseを自分のアプリでも動かしてみようと思いBitriseで環境を構築しました。
その際GitHub上にプッシュしていないAPIキーの入ったplistファイルをBitrise上でどう生成させるかという壁に直面したのでそれを記事にしました。

目次

  1. Bitrise導入
  2. Secretsの設定とファイルの生成

Bitrise導入

今回はiOSアプリで開発をしたので以下の公式手順を元にBitriseにiOSアプリを追加します。
https://devcenter.bitrise.io/jp/getting-started/getting-started-with-ios-apps/

試しにビルドしましたがこの時点ではまだリモートリポジトリのファイルをBitriseに移しただけなので当然テスト時に下のエラーが発生します。

❌  error: Build input file cannot be found: '/Users/vagrant/git/[アプリ名]/Resources/Key.plist' (in target '[アプリ名]' from project '[アプリ名]')

今回はAPIキーの内容をKey.plistに保存するようにしています。
ここからビルド時にファイルKey.pistのファイルを生成するようにワークフローを追加していきます。

Secretsの設定とファイルの生成

BitriseのWorkFlowエディタ内のSecretsでシークレット環境変数を設定できるのでそこで.gitignoreしていたファイルの内容をコピペして貼り付けます。ただファイルの中身は数十行になっておりそれらを1行にして管理したかったのでbase64でエンコードした状態で値を設定しました。

base64については下の記事を参考にしてください。
https://qiita.com/PlanetMeron/items/2905e2d0aa7fe46a36d4

Expose for Pull Requests? の設定はデフォルトでは❎ になっていますがこれだとGitHubでプルリクエストを出してBitriseを回すときにこのSecretsが利用できずエラーになってしまうため✅ にします。

次にWorkflowでSecretsを利用してファイルの生成をします。

Workflowsの項目で + ボタンからStepの追加をします。今回はファイルを生成するためにシェルスクリプトを利用するのでScriptという名前のステップを追加します。(画像でいうと上から3つめ)
アプリをクローンしてからファイルを生成しなければ実行は失敗するので必ずGit Clone Repositoryの後にステップを追加するようにしてください。

その後Scriptのステップを押すとScriptの内容を入力するテキストがあるのでそこで

echo ${NEWS_API_KEY_PLIST_BASE} | base64 --decode > [アプリ名]/[ignoreしたファイルパス]

を記述することによってテスト時にignoreしたファイルが生成され${NES_API_KEY_PLIST_BASE}の中身が書き込まれます。今回はbase64で値をエンコーディングしていたため書き込み時にデコードさせていますが特に必要がない場合は|base64 --decodeの部分を消去して実行してください。

この状態でもう一度Bitriseを実行します。

今度はビルド成功させることができました。

さいごに

そもそもなぜこういった機密な情報をGitHub上にあげてはいけないのでしょうか。リポジトリを公開するならまだしもprivateリポジトリにしてセキュリティ面を保証していれば問題ないのではないでしょうか。

2021年1月〜4月頃、CodecovのBash Uploaderを改竄し、不正に取得した認証情報を使用してGitHubに不正アクセスされるケースがありました。
このように安易にAPI情報や顧客情報などを残すとたとえセキュリティ面を保証していても認証情報がGitHub以外のツールから不正に盗まれ覗かれてしまう危険性があるので、今回のようにテスト時のみ機密情報の入ったファイルを生成し、GitHub上のレポジトリに残さないようにすることが重要だと思います。

参考文献