GitHubやGitHub Enterpriseで、HTTPSを経由したgit pushや git pullをするとログインIDとパスワードの入力を促されますが、二段階認証を有効にしていると、正しいIDとパスワードでも認証がエラーになります。この場合、repo スコープを有効にしたトークンを用意して、パスワードの代わりにトークンを入力すれば良いです。
トークン入力を省略するため ~/.netrc の利用を案内する記事がありますけれども、さすがにトークンとはいえプレーンな形で保存するのは良くないので、最低でも暗号化しておきましょう。
macOSの場合は、いちど入力すると以降はKeychain Access.appに保存されるので~/.netrc は不要です。Keychain Access.appに保存されない場合は ~/.ssh/config で UseKeychain yes
を設定すると保存できるようになります。
そんなことを同僚氏に話したところ、なんか普通に2段階認証を設定してなくてもトークンを使うのが良いらしいということを聞いたので、今後はHTTPSとトークンでアクセスしようと思いました。
HTTPSを使いたい理由
トークンを使わなくても、SSHでアクセスすれば問題なかったんですが、この時は珍しくサブモジュールを使いました。
サブモジュールを登録したリポジトリをJenkinsでビルドする場合、
checkout([ $class: 'GitSCM', branches: scm.branches, extensions: scm.extensions + [ [ $class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: true, recursiveSubmodules: true, reference: '', trackingSubmodules: false ], ], userRemoteConfigs: scm.userRemoteConfigs ])
このように書けばサブモジュールも拾ってきてくれますが、JenkinsのGitHub Branch Source pluginはGitHubのAPIを利用してgit pullするので、parentCredentials: true
でメインリポジトリで使った資格情報を参照するとHTTPSとトークンでアクセスできますが、SSHの場合はそれとは別に鍵の設定が必要になります。あまりCI環境への依存を増やしたくなかったので、サブモジュールのremoteもHTTPSにしておく必要があってSSHが使えませんでした。