Bitrise でシークレットな情報を .plist ファイルに書き込む
Bitrise & Xcode & GitHub で、シークレットな情報を管理する方法の1つとして。
iOS アプリにて、GitHub の OAuth 認証を実装するため、GitHub Client Id・GitHub Secrey Key をコードで参照しています。 この2つの値は、開発時・Bitrise でのビルドでは必要ですが、GitHub リポジトリにはコミットしたくありません。そのため、以下のような方法を採りました。手順を記載します。
- Client Id, Secret Key は、.plist ファイルに記述する
- GitHub には、.gitignore でコミットしないようにする
- Bitrise のサイトにて、Secret 変数に Client Id, Secret Key の値を登録する
- Bitrise のビルドフローに、.plist に Client Id, Secret Key を書き込むスクリプトを追加する
手順
Xcode プロジェクト
Xcode プロジェクト内に、以下のように「Secret」フォルダを作成し、「settings.template.plist」「settings.plist」ファイルを追加します。
2つの .plist ファイルには、どちらも「githubClientId」「githubSecretKey」の値を String として追加します。また、「settings.plist」には、実際の ClientId, Secret Key を入力します(開発時に使うため)。下の画像は、settings.plist の画像です。
.gitignore
.gitignore ファイルには、次のように記述します。
Gistan/Secret/* !Gistan/Secret/*.template.plist
Gistan
というのは、プロジェクト名の例です。settings.template.plist はコミットしますが、settings.plist ファイルはコミットしないように設定しています。
このとき、2つのファイルともプロジェクトのアイテムとして project.pbxproj に追加されている状態なので、git clone したときは settings.plist のファイルが無くエラーになるので注意です。今回はこの対策はしていません。
plist ファイルの読み取り
コードでは、次のようにして .plist ファイルの中身を参照しています。
Settings.swift :
struct Settings: Codable { var githubClientId: String var githubSecretKey: String }
値を参照するところ:
import Foundation func loadSettings() throws { let settingURL: URL = URL(fileURLWithPath: Bundle.main.path(forResource: "settings", ofType: "plist")!) let data = try Data(contentsOf: settingURL) let decoder = PropertyListDecoder() let settings = try decoder.decode(Settings.self, from: data) print(settings.githubClientId) }
Bitrise にて
Bitrise > Workflow Editor > Secret にて、次のように変数を設定して ClientId, Secret Key を登録します。
Bitrise > Workflow Editor > Workflow にて、Xcode のビルド前に「Script」を実行するステップを追加します。
Script の中身:
#!/bin/bash # fail if any commands fails set -e # debug log set -x # write your script here #!/bin/sh secretPath=$BITRISE_SOURCE_DIR/Gistan/Secret cp $secretPath/settings.template.plist $secretPath/settings.plist plutil -replace githubClientId -string $GitHubClientId $secretPath/settings.plist plutil -replace githubSecretKey -string $GitHubSecretKey $secretPath/settings.plist
settings.template.plist をコピーして、settings.plist ファイルを作成し、plutil
コマンドにて、Client Id, Secret Key の値を置き換えています。
※以上の方法は、.plist ファイルをコピーしているため、settings.template.plist ファイルが無駄なファイルとなっています。別の方法として、コピーせずに直接 settings.plist ファイルを作成するスクリプトを記述した方がスマートかもしれません。
※ClientId, Secret Key を「Secret」ではなく「Env Vars」タブで登録すると、bitrise の設定ファイル bitrise.yml に変数の値が含まれてしまいます。今回のような API キーの場合は、Secret として登録するのが良さそうです。bitrise.yml の中身は、Workflow Editor から「bitrise.yml」タブにて確認できます。また、Secret・Env Vars 両方とも ${キー名} でスクリプトから参照できます。
参照: