Skip to content

Instantly share code, notes, and snippets.

@kitasuke
Created February 5, 2020 17:23
Show Gist options
  • Save kitasuke/22b2db5fc339216fc9e17c672213ba6a to your computer and use it in GitHub Desktop.
Save kitasuke/22b2db5fc339216fc9e17c672213ba6a to your computer and use it in GitHub Desktop.
docker-private-repo-jp

CircleCI上のDockerコンテナからGitHubプライベートリポジトリにアクセスする

こんにちは。ソフトウェアエンジニアの@kitasukeです。

今回は、CircleCI上でビルドしたDockerコンテナ内でGitHubのプライベートリポジトリにアクセスする方法を紹介します。 他にもいくつか方法があるので、用途によってそちらのほうが適しているかもしれません。

概要

Dockerコンテナをビルドして開発環境をデプロイする際に、Dockerコンテナ内のパッケージマネージャーによる依存解決でGitHubのプライベートリポジトリにアクセスする必要がありました。 今回採用した方法は、CircleCIのジョブ経由でGitHubのアクセストークンをDockerコンテナに渡して、該当するリポジトリに対してsshの代わりにアクセストークン付きのhttps経由でアクセスします。 このやり方だと、アクセストークンでアクセスできるリポジトリだけを対象にできて、なおかつ少ない変更で済むので良いかなと思いました。

詳細内容

順番に設定すべき内容を説明します

CircleCIの環境変数

まずは、GitHubアクセストークンをCircleCIの設定ページでセットします。 Build > Project > Settings > Environment VariablesのAdd Variableからトークンをセットします。 例として、GITHUB_TOKENという名前でセットすると、config.ymlから $GITHUB_TOKEN と記述すると値を取得できます。 詳細な説明はこのページを参照してください。

https://circleci.com/docs/2.0/env-vars/#overview

Dockerへ変数を渡す

次に、そのトークンを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/

sshの代わりにhttps経由でアクセス

最後に、Dockerコンテナ内でGitHubプライベートリポジトリにアクセスする前に、該当のリポジトリにsshではなくhttps経由でアクセスするように設定します。 git configurl.<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アクセストークンをセキュアにセットできました。 また、同じオーガナイゼーション内であれば別のプライベートリポジトリにも共通のトークンでアクセスできます。 他のやり方も検討しましたが、今回の用途だとこの方法が手っ取り早くて少ない変更で済みました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment