Carpe Diem

備忘録

fatal: could not read Username for 'https://github.com': terminal prompts disabledが出たら

概要

CIツールでプライベートリポジトリをgo getしようとするとたまに遭遇する

fatal: could not read Username for 'https://github.com': terminal prompts disabled

の対応方法をまとめます。

原因

go getはデフォルトだとHTTPSで通信しようとしますが、プライベートリポジトリだとそこへアクセスするための認証情報が必要です。
その認証情報がないため上記のエラーが発生します。

HTTPSSSH

GitHubHTTPSSSHで通信をすることが可能です。なのでやり方としては大きく3つあります。

HTTPSでやる場合

  1. $HOME/.netrcに認証情報を書く
  2. 認証情報を使って$HOME/. gitconfiginsteadOfの設定をする

ここで言う認証情報は通常のログインID&PWであったり、PAT(Personal Access Token)だったりします。

SSHでやる場合

  1. sshの設定をして$HOME/. gitconfiginsteadOfの設定をする

対応

HTTPSでやる場合

個人のログインID&PWだとMFAの設定でコケるパターンがあるので、PATをあらかじめ用意する方針にします。

https://github.com/settings/tokensでPATを発行します。

f:id:quoll00:20220118033008p:plain

権限はrepoがあれば十分でしょう。

f:id:quoll00:20220118033200p:plain

a. $HOME/.netrcに認証情報を書く

先程用意したPATを以下のフォーマットで$HOME/.netrcに置きます。

machine github.com
  login <PAT>

以上で完了です。

b. $HOME/. gitconfiginsteadOfを設定

<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/. gitconfiginsteadOfの設定をします。

$ 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ステップ時に自動でやってくれており、自前で処理を追加しなくても済みます。

f:id:quoll00:20220118034316p:plain

逆にcheckoutステップを使ってないジョブでは、その自動処理が抜けてコケるパターンにハマることがあります。

まとめ

fatal: could not read Username for 'https://github.com': terminal prompts disabled

のエラー時の手法は上記のようにいくつかありますが、ネットだとそれぞれが書いてあってちょっとややこしかったのでまとめました。

参考