電気ひつじ牧場

技術メモと日常のあれこれ

外部のプライベートリポジトリへの依存がある時にCircleCIでビルドする

組織内部で管理しているプライベートリポジトリのライブラリなどを使いたい時は、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がアクセスできるようになります。

f:id:cha-shu00:20211005223327p:plain

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"