概要
CIツールでプライベートリポジトリをgo getしようとするとたまに遭遇する
fatal: could not read Username for 'https://github.com': terminal prompts disabled
の対応方法をまとめます。
原因
go getはデフォルトだとHTTPS
で通信しようとしますが、プライベートリポジトリだとそこへアクセスするための認証情報が必要です。
その認証情報がないため上記のエラーが発生します。
HTTPSかSSHか
GitHubはHTTPSかSSHで通信をすることが可能です。なのでやり方としては大きく3つあります。
HTTPSでやる場合
$HOME/.netrc
に認証情報を書く- 認証情報を使って
$HOME/. gitconfig
にinsteadOf
の設定をする
ここで言う認証情報は通常のログインID&PWであったり、PAT(Personal Access Token)だったりします。
SSHでやる場合
- sshの設定をして
$HOME/. gitconfig
にinsteadOf
の設定をする
対応
HTTPSでやる場合
個人のログインID&PWだとMFAの設定でコケるパターンがあるので、PATをあらかじめ用意する方針にします。
https://github.com/settings/tokensでPATを発行します。
権限はrepo
があれば十分でしょう。
a. $HOME/.netrc
に認証情報を書く
先程用意したPATを以下のフォーマットで$HOME/.netrc
に置きます。
machine github.com login <PAT>
以上で完了です。
b. $HOME/. gitconfig
にinsteadOf
を設定
<PAT>
にトークンを付ける形で以下のコマンドを実行します。
$ git config --global \ url."https://<PAT>:x-oauth-basic@github.com/".insteadOf "https://github.com/"
直接$HOME/.gitconfig
に以下を追記します。
[url "https://<PAT>:x-oauth-basic@github.com/"] insteadOf = https://github.com/
以上で完了です。
SSHでやる場合
a. $HOME/. gitconfigにinsteadOfの設定をする
sshキーの登録を済ませておき、先ほどと同じように$HOME/. gitconfig
にinsteadOf
の設定をします。
$ git config --global \ url."ssh://git@github.com".insteadOf "https://github.com"
もしくは直接$HOME/.gitconfig
に以下を追記します。
[url "ssh://git@github.com/"] insteadOf = https://github.com/
CIでsshキーの設定したのにterminal prompts disabled
のエラーが出る!というケースは大抵この設定が漏れてます。
その他
CircleCIだとcheckout
ステップ時に自動でやってくれており、自前で処理を追加しなくても済みます。
逆にcheckout
ステップを使ってないジョブでは、その自動処理が抜けてコケるパターンにハマることがあります。
まとめ
fatal: could not read Username for 'https://github.com': terminal prompts disabled
のエラー時の手法は上記のようにいくつかありますが、ネットだとそれぞれが書いてあってちょっとややこしかったのでまとめました。