2017-06-24

~/.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 上ではそういうわけにはいかない。なんらかの方法で認証をパスしなければいけない

試したこと

  1. ssh key
    • 最も素直な方法だが、GitHub には同一の鍵を複数登録できないので、CI のアクセスする repository の数が増えれば増えるほど扱いが大変
    • CI の機能で自動的に生成される鍵なら問題にはならないが、CircleCI では自動セットされる deploy key があるとそれを他の repository にも適用しようとするみたいでうまくいかない(そらそうか)
    • GitHub machine アカウントなら一つの鍵を使いまわせるっぽいけど、まだ試せていない
  2. ~/.netrc
    • 以前試した ~/.netrc を利用する技は CircleCI 上では使えないっぽかった。Heroku のように deploy 先で build プロセスを走らせることができない場合は build をすべて CI 上で動かす必要があるが、そこで使えないのなら別な方法を考えるしかない

GitHub/BitbucketからAccess Tokenを使ってdeployする - あーありがち(2017-04-17)

About

例によって個人のなんちゃらです