組織内部で管理しているプライベートリポジトリのライブラリなどを使いたい時は、CircleCIがそのリポジトリに対するアクセス権限を持っている必要があります。普通にプロジェクトをセットアップした場合、CCIのExecutorはそのプロジェクトに対するアクセス権限しか持っていないため、別のリポジトリへのアクセスは通常拒否されます。
例えば、composer install
した時に次のようなエラーが出た場合がそれに該当します。
Cloning into '/var/www/html/vendor/proj/libs'... error: cannot run ssh: Not Found fatal: unable to fork
こういった操作はuser keyを使うことで可能になります。
2種類のkey
鍵はCCIコンソールのProject Settings > SSH keysで設定できます。
deploy key
deploy keyを使うことで単一のリポジトリに対する権限を持つことができます。CCIのコンソールからGitHubのプロジェクトをセットアップすると、自動的にこのdeploy keyが作成され、GitHub側には公開鍵、CCI側が内部的に秘密鍵を設定します。この認証情報をもとにリポジトリのコードのcheckoutが行われます。
user key
user keyを使うことで、あるGitHubユーザと同等の権限を持つことができます。あるGitHubユーザというのはCCIのコンソール画面でuser keyを設定するために認証したユーザのことです。そのため、そのユーザがアクセスできる全てのリポジトリにCCIがアクセスできるようになります。
machine user
user keyを設定すれば他のプライベートなリポジトリにもアクセスできますが、それを設定したユーザの見られたくないリポジトリにもアクセスできてしまいます。そのため、依存リポジトリへのアクセスに限定した専用のユーザを作成するのが望ましいとされています。そのようなユーザはmachine userと呼ばれます。
注意点
このuser keyはCCI Executorの.sshディレクトリにインストールされます。そのため、Executorの中で直接composer update
やらgo mod download
する場合は問題ないですが、Dockerイメージをビルドする際はうまくいきません。そのときはリポジトリの中に依存リポジトリに対するdeploy keyを持たせて、Dockerfileでその鍵を指定する方法があります。
COPY pull_key /root/.ssh/id_rsa RUN chmod 600 /root/.ssh/id_rsa ENV GIT_SSH_COMMAND="ssh -i /root/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"