こんにちは。ソフトウェアエンジニアの@kitasukeです。
今回は、CircleCI上でビルドしたDockerコンテナ内でGitHubのプライベートリポジトリにアクセスする方法を紹介します。 他にもいくつか方法があるので、用途によってそちらのほうが適しているかもしれません。
Dockerコンテナをビルドして開発環境をデプロイする際に、Dockerコンテナ内のパッケージマネージャーによる依存解決でGitHubのプライベートリポジトリにアクセスする必要がありました。 今回採用した方法は、CircleCIのジョブ経由でGitHubのアクセストークンをDockerコンテナに渡して、該当するリポジトリに対してsshの代わりにアクセストークン付きのhttps経由でアクセスします。 このやり方だと、アクセストークンでアクセスできるリポジトリだけを対象にできて、なおかつ少ない変更で済むので良いかなと思いました。
順番に設定すべき内容を説明します
まずは、GitHubアクセストークンをCircleCIの設定ページでセットします。
Build > Project > Settings > Environment VariablesのAdd Variableからトークンをセットします。
例として、GITHUB_TOKENという名前でセットすると、config.ymlから $GITHUB_TOKEN
と記述すると値を取得できます。
詳細な説明はこのページを参照してください。
https://circleci.com/docs/2.0/env-vars/#overview
次に、そのトークンをCircleCIからDockerへ渡す方法です。
docker buildには --build-arg
というオプションで下記のように変数を渡せます。
// config.yml
RUN docker build -t xxx:yyy --build-arg GITHUB_TOKEN=$GITHUB_TOKEN .
--build-arg
の詳細はこちらを参照してください。
https://docs.docker.com/engine/reference/commandline/build/
Docker側では、Dockerfileで下記のようにARGの定義をすると変数を受け取れます。
// Dockerfile
ARG GITHUB_TOKEN
ARG の詳細はこちらを参照してください。
https://docs.docker.com/engine/reference/builder/
最後に、Dockerコンテナ内でGitHubプライベートリポジトリにアクセスする前に、該当のリポジトリにsshではなくhttps経由でアクセスするように設定します。
git config
の url.<base>.insteadOf
利用して、下記のようにGitHubアクセストークンと共に設定します。
オーガナイゼーション名はオプショナルです。
// Dockerfile
RUN git config --global url."https://$GITHUB_TOKEN:@github.com/ORGANIZATION/".insteadOf git@github.com:ORGANIZATION/
url.<base>.insteadOf
の詳細はこちらを参照してください。
https://git-scm.com/docs/git-config#Documentation/git-config.txt-urlltbasegtinsteadOf
この方法だと、ユーザー毎にGitHubアクセストークンが必要になる可能性があります。 それを避けるために、オーガナイゼーション内のbotユーザーのトークンを使用しました。 そうでないとトークンを共有して使い回せないので、その点は注意してください。
CircleCIのEnvironment Variablesを利用してGitHubアクセストークンをセキュアにセットできました。 また、同じオーガナイゼーション内であれば別のプライベートリポジトリにも共通のトークンでアクセスできます。 他のやり方も検討しましたが、今回の用途だとこの方法が手っ取り早くて少ない変更で済みました。