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

参照:

Visual Studio 2017 15.4 のアップデート後、Azure Storage Emulator が起動できないときのメモ

Visual Studio 2017 15.4 のアップデート後、次のようなエラーメッセージが表示され、Azure Storage Emulator のインストールに失敗しました。
f:id:miso_soup3:20171016150200p:plain

このとき、「人気のソリューションを確認する」や「問題の表示」などから、詳細のログを確認できます。
一度、Azure Storage Emulator をアンインストールし、https://docs.microsoft.com/ja-jp/azure/storage/common/storage-use-emulator#start-and-initialize-the-storage-emulator Azure ストレージ エミュレーターを使用した開発とテスト | Microsoft Docs ここから再インストールしようとしましたが、そのときもエラーが発生し、インストールができませんでした。「C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator」の中身は空っぽで、フォルダ自体も削除できない状態でした。どこのプロセスから利用しているのか見つけられなかったので、一度マシンを再起動した後、Azure Storage Emulator のみ再インストールすることで復帰しました。

下記の@takekazuomiさんの情報もご参考ください。