~/.netrcの使えないCI上からGitHubなどのprivate repositoryをprivate package代わりに使う
前提
- deploy 先で build プロセスを動かすことのできないプロジェクトであること
- ~/.netrc が無効な git クライアントが動いている
※ 今回の方法は依存パッケージを記述するファイルを強引に書き換えてしまうので、Gemfile と Gemfile.lock が揃っていないとそもそも build できない Heroku x Rails のような環境では使えないはずです。試してないけど。
方法
- 環境変数に token を持つ
- package を install する前に依存先の URI を token 付きのものに書き換える
- yarn を使っている場合は yarn install –no-lockfile オプションを使う
コード
以下のようなコードを事前準備の段階で実行すれば実現できる。
#! /bin/sh
if [ -n "$CIRCLE_SHA1" -a -n "$GITHUB_TOKEN" ]; then
perl -i.bak -pne "s/git\\+https:\\/\\/github\\.com\\/wtnabe/git\\+https:\\/\\/${GITHUB_TOKEN}\\@github\\.com\\/wtnabe/" package.json
fi
npm install や yarn install の前段階で package.json をゴリっと書き換えてしまっている。
また、単に https://github.com から始まる URI を書き換えるようにするといろいろ誤爆しそうなので git+https を入れたり工夫してある。
課題
- private repository のコードを依存 package として指定したい
- 通常の開発時は開発者は自分の認証情報をもとに GitHub などにアクセスしており、各自がいい具合にキャッシュとかさせているので問題ない
- CI 上ではそういうわけにはいかない。なんらかの方法で認証をパスしなければいけない
試したこと
- ssh key
- 最も素直な方法だが、GitHub には同一の鍵を複数登録できないので、CI のアクセスする repository の数が増えれば増えるほど扱いが大変
- CI の機能で自動的に生成される鍵なら問題にはならないが、CircleCI では自動セットされる deploy key があるとそれを他の repository にも適用しようとするみたいでうまくいかない(そらそうか)
- GitHub machine アカウントなら一つの鍵を使いまわせるっぽいけど、まだ試せていない
- ~/.netrc
- 以前試した ~/.netrc を利用する技は CircleCI 上では使えないっぽかった。Heroku のように deploy 先で build プロセスを走らせることができない場合は build をすべて CI 上で動かす必要があるが、そこで使えないのなら別な方法を考えるしかない
GitHub/BitbucketからAccess Tokenを使ってdeployする - あーありがち(2017-04-17)