問題点
Capistranoを使ってRailsアプリケーションをデプロイしていたところ、
プライベートリポジトリのGemをインストールしようとした際にエラーが発生。
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
ユーザー名・パスワードがないため、プライベートリポジトリを参照できない模様。
こちらの記事やbundlerのドキュメントを参照するも、結果は変わらず。
解決法
手順①環境変数を設定する
export BUNDLE_GITHUB__COM=username:password
ここまではbundlerのドキュメントを読めばOK。
手順②Capistranoに環境変数を持たせる
set :default_env, {
BUNDLE_GITHUB__COM: ENV['BUNDLE_GITHUB__COM']
}
私の場合はここが抜けていた模様。
上記2点を記述することで、無事にプライベートリポジトリのGemをインストールできました。
余談
「なんでわざわざ環境変数渡さなきゃならんのだ…」とボヤいていると、Capistranoのドキュメントにこんな一文が。
By default Capistrano always assigns a non-login, non-interactive shell.
(直訳:Capistranoは常に非ログイン・非対話型シェルを割り当てます)
どうやら、Shellの起動方法には幾つかの種類があり、Capistranoはその中からnon-interactive
を割り当てるようです。
non-interactive Shell
は~/.bash_rc
や~/.bash_profile
を読み込まないため、単に環境変数を記述したところで意味がない様子。
default_envに環境変数を渡すことで、SSHKitに環境変数を持たせているそう。SSHKitについてはよくわかっていないので、今後深堀ってみようと思います。
参考にした記事・ドキュメント
- Why does something work in my SSH session, but not in Capistrano? - Capistrano
- Credentials For Gem Sources - bundler docs
- Rails初心者がハマったCapistranoの環境変数
- PrivateGemをCapistranoでbundle installする
- bashの.profileや.bashrc等を実行する動作仕様
問題解決にあたり上記の記事・ドキュメントを参考にさせていただきました。誠にありがとうございました。
貴重なドキュメントを残してくださる先人の皆様に心より感謝と尊敬を。