PrivateGemをCapistranoでbundle installする

普段RailsかいていてデプロイはCapistranoを使用している

その中でbundle installする工程があるが通常はrubygemsに公開されているものを使用するので特に意識することがないがGithubのプライベートレポジトリにおいているものを使用する時はちょっと工夫が必要

例えば下記のようなGemfileがあったとして

gem 'private_gem', git: 'https://github.com/hatappi/private_gem.git'

特に何も設定せずにデプロイしようとすると下記のようなエラーが出てデプロイがこける

      01 fatal: could not read Username for 'https://github.com': No such device or address
      01 fatal: could not read Username for 'https://github.com': No such device or address
      01 fatal: could not read Username for 'https://github.com': No such device or address
      01 fatal: could not read Username for 'https://github.com': No such device or address
      01 Git error: command `git clone 'https://github.com/hatappi/private_repo.git'

この時やる手としてはGithubトークンの生成してGemfileを下記のように修正する

# Gemfile
gem 'private_gem', git: 'https://[Github token]:x-oauth-basic@github.com/hatappi/private_gem.git'

個人で使ったり特定のチームないだけで使うには良いが様々な人が見る中でトークンをベタ書きするのは気が引ける
そこで下記のようにENVにトークンをもたせる例も見ることがあるが、これだとトークンが必要ない環境であったとしてもトークンの指定をしなければならない

# Gemfile
gem 'private_gem', git: 'https://#{ENV['GITHUB_TOKEN']}:x-oauth-basic@github.com/hatappi/private_gem.git'

改めてGitHub - bundler/bundler: Manage your Ruby application's gem dependenciesのdocを見てみるとそれらしい記述がある

Bundler: bundle config

どうやら下記のような環境変数を指定しておくとプライベートレポジトリもbundle installできるようになる

$ export BUNDLE_GITHUB__COM=username:password
$ export BUNDLE_GITHUB__COM=[githubトークン]:x-oauth-basic

最終的に

# Gemfile
gem 'private_gem', git: 'https://github.com/hatappi/private_gem.git'

Gemfileの変更はしなくても良い
そのかわり今回はCapistranoでデプロイした際に環境変数を読み込めるように

/etc/environment

export BUNDLE_GITHUB__COM=[githubトークン]:x-oauth-basic

と書いて無事Capistranoでデプロイができるようになった