BitriseでGitHubのPrivate Repositoryにアクセスして、非公開のCocoaPodsライブラリをインストールする

# 問題

BitriseでGitHubのPrivate Repositoryにアクセスして、非公開のCocoaPodsライブラリをインストールしようとすると、非公開なのでインストールできない。ビルド対象のRepositoryだけでなく、ライブラリ側のPrivate RepositoryにもBitriseのSSH　keyを登録しようとしても、GitHubは複数Repositoryに対して単一のSSH keyを登録することを許していない。

# 解決方法

ビルド対象のプロジェクトと、非公開のCocoaPodsライブラリの置いてあるPrivate Repositoryへのアクセス権を持ったユーザーに、BitriseのSSH keyを登録する。

## GitHubは他のRepositoryやユーザーに紐づくSSH keyを重複して登録できない

以下のURLから引用。

[Adding projects with submodules or with private CocoaPods repos \- Bitrise DevCenter](https://devcenter.bitrise.io/faq/adding-projects-with-submodules/)

> If your git hosting service does not support the use of a single SSH key for multiple repositories (for example GitHub does not support this!), you'll have to register the SSH key for a user account.

*あなたが利用しているGitホスティングサービスが、一つのSSH keyを複数のリポジトリに利用できない場合、SSH keyをユーザーに登録する必要があります。(GitHubは利用できません！)*

そのため、BitriseのSSH keyの登録先を整理する必要が出てきます。

## 手順1. ビルド対象のプロジェクトに紐づいているBitriseのSSH keyの登録を解除する

Bitriseに新規プロジェクトを追加する際に `No, auto-add SSH key` を押してスタートした場合、ビルド対象のプロジェクトのGitHub　Repositoryに自動でBitriseのSSH keyが登録されます。ここでSSH keyを登録しておくと、非公開のCocoaPodsライブラリの置いてあるPrivate Repository側にはBitriseのSSH keyを登録できません。(先述した通り、GitHubが一つのSSH keyを複数のリポジトリに利用できないためです)

そのため、もしここで　`No, auto-add SSH key` を選択していた場合は、自動で登録されるBitriseのSSH keyの登録を解除する必要があります。この後の手順でビルド対象のプロジェクトと、非公開のCocoaPodsライブラリの置いてあるPrivate Repositoryへのアクセス権を持ったユーザーにSSH keyを登録し直す必要があるからです。

![Add_new_App_-_Bitrise.png](https://qiita-image-store.s3.amazonaws.com/0/46597/6a6c7f3e-069e-5814-dee8-71717da959a7.png)

また、手動で他所のRepositoryやユーザーにBitriseのSSH keyを登録していた場合も同様に登録を解除してください。

## 手順2a. ビルド対象のプロジェクトと、非公開のCocoaPodsライブラリの置いてあるPrivate Repositoryへのアクセス権を持ったユーザーに、BitriseのSSH keyを登録する

Bitriseのプロジェクトの中にある `Settings` タブから `SSH settings` でSSH keyをコピーします。

![bitrisesetting.png](https://qiita-image-store.s3.amazonaws.com/0/46597/b19202d5-b053-ba7f-8ecb-a98b242d44f3.png)

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/46597/3bf8e48f-8a78-fdec-375e-61b761458e72.png)

これでBitrise上でビルドを実行し、CIの `pod install` が成功すれば完了です。

その後、GitHubの右上にあるアイコンの箇所から、 `Settings` の中の `SSH and GPG keys` タブを開きます。 `New SSH key` からSSH keyを追加する画面に遷移して、先ほどコピーしたBitriseのSSH keyを追加します。

![a.png](https://qiita-image-store.s3.amazonaws.com/0/46597/3b009432-3969-2766-1c66-000cdd9d4ac6.png)

![スクリーンショット 2018-03-21 0.15.09.png](https://qiita-image-store.s3.amazonaws.com/0/46597/261aa62d-8ad0-27f2-208b-93a2e3e3c478.png)

## 手順2b. ビルド対象のプロジェクトと、非公開のCocoaPodsライブラリの置いてあるPrivate Repositoryへのアクセス権を持ったbotユーザーに、BitriseのSSH keyを登録する

`手順2a` の方法でも良いですが、別の方法もあります。ビルド対象のプロジェクトと、非公開のCocoaPodsライブラリの置いてあるPrivate Repositoryへのアクセス権を持ったbotユーザーを作成し、そのユーザーにBitriseのSSH keyを登録する方法です。

以下のURLから引用。

[Adding projects with submodules or with private CocoaPods repos \- Bitrise DevCenter](https://devcenter.bitrise.io/faq/adding-projects-with-submodules/)

> In this case (e.g. GitHub), there is an easy workaround for the issue. Simply by adding a "bot" / "machine" user with the SSH key to the repositories you can solve the problem. Add the SSH key you would like to use to the user and add the user to the projects. You don't have to add the "bot" user with read and write permission, it is enough to assign read permissions. After that you can use the SSH key to clone to the repository or any submodule. It's that simple.

*この場合、問題の簡単な回避策があります。リポジトリにSSH keyを持つ "bot" / "machine" ユーザーを追加するだけで、問題を解決できます。使用するSSHキーをユーザーに追加し、そのユーザーをプロジェクトに追加します。「bot」ユーザに読み書き権限を追加する必要はありません。読み込み権限を割り当てるだけで十分です。その後、SSH keyを使用してリポジトリまたはサブモジュールにクローンを作成できます。簡単ですね。*

とあります。ユーザーに直接SSH keyを登録するのではなく、GitHubに新たなbotユーザー(通常のユーザーと扱いは変わらない。日々人が使うものとは別のユーザーというだけ)を作成します。そのbotユーザーにビルド対象のプロジェクトと、非公開のCocoaPodsライブラリの置いてあるPrivate Repositoryへのアクセス権を与えて(Collaboratorとして追加したり、Organizationに加えるなど)、 `手順2a` でやった通り、BitriseのSSH keyを登録してあげれば完了です。

# まとめ

BitriseでGitHubのPrivate Repositoryにアクセスして、非公開のCocoaPodsライブラリをインストールする方法を紹介しました。社内ライブラリを利用するとき必要でした。多分Bitrise以外のCIでも同様のことが必要になって、手順も似たようなものになるはずです。

今回はGitHubが単一のSSH keyを複数のRepository(あるいは複数のRepositoryとユーザー)に登録することを許可していないために起こった問題でしたが、他のBitbucketやGitLabなどのGitホスティングサービスではできるので問題にはなりません。

非公開のCocoaPodsライブラリの置いてあるRepositoryにアクセスする方法として紹介しましたが、例えば `fastlane match` を利用して、ビルド対象のRepositoryとは別のPrivate Repositoryに証明書を管理する場合などにも、同じことが必要になるでしょう。

# 参考・関連
- [Adding projects with submodules or with private CocoaPods repos \- Bitrise DevCenter](https://devcenter.bitrise.io/faq/adding-projects-with-submodules/)
- [Managing deploy keys \| GitHub Developer Guide](https://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys)