miso_soup3 Blog

主に ASP.NET 関連について書いています。

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」ファイルを追加します。

f:id:miso_soup3:20171021194943p:plain

2つの .plist ファイルには、どちらも「githubClientId」「githubSecretKey」の値を String として追加します。また、「settings.plist」には、実際の ClientId, Secret Key を入力します(開発時に使うため)。下の画像は、settings.plist の画像です。

f:id:miso_soup3:20171021195100p:plain

.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 を登録します。

f:id:miso_soup3:20171023172821p:plain

Bitrise > Workflow Editor > Workflow にて、Xcode のビルド前に「Script」を実行するステップを追加します。

f:id:miso_soup3:20171021201306p:plain

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 両方とも ${キー名} でスクリプトから参照できます。

参照: