GitHub CLI のアカウントをレポジトリごとに自動的に切り替える
TL;DR
社用とプライベート用などで複数の GitHub アカウントを使い分けている場合、レポジトリを移動するたびに gh
コマンドのログインユーザーを切り替えるのが面倒だった
Git の user.email
に基づいて gh
のアカウントを切り替える shell script を作成し、gh
のエイリアスとして設定することで、レポジトリごとのアカウント切り替えを完全に自動化できた
モチベーション
弊社のように GitHub Enterprise などを導入した企業の社員は社用とプライベート用で複数の GitHub アカウントを切り替えて使用していることが多いと思う
この場合 GitHub の UI 上の操作ブラウザのプロファイル単位で切り替えるなどすれば特に問題ないが、困るのは gh
(GitHub CLI) でのユーザー切り替えである
gh
は複数のユーザーのログイン状態を同時に保持しておくことはできるが、各種操作を行う場合には当然操作を行いたいユーザーに切り替える (gh auth switch
) 必要がある
「操作を行いたいユーザー」とはほとんどの場合機械的に求まる (業務レポジトリなら社用アカウント、それ以外ならプライベートアカウントなど) ものであるから、どうにか切り替えを自動化できないか考えた
実装・設定
社用レポジトリとプライベートレポジトリでは Git の user.email
にそれぞれ対応する社用とプライベート用のメールアドレスを設定していることに注目した
※同一のメールアドレスを複数の GitHub アカウントに紐づけることはできないため、複数の GitHub アカウントを運用している方はメールアドレスをレポジトリごとに使い分ける設定が済んでいることになる
なお余談ながら、この Git アカウントはディレクトリに基づいて自動的に切り替えるように設定ができる
本稿の内容と合わせて運用するのがおすすめである
gh
のアカウント自動切り替えスクリプト
Git の設定に基づいて gh
のアカウントを自動的に切り替える shell script ghautoswitch
を作成する
責務は user.email
の値を取得し、社用のメールアドレスであった場合には社用、それ以外の場合はプライベート用の GitHub アカウントに切り替えることまで
#!/usr/bin/env bash
set -euo pipefail
if ! email=$(git config user.email); then
echo 'user.email is not defined.'
exit 0
fi
if [ "$email" = "john.doe@company.com" ]; then
gh auth switch --user johndoe-work
else
gh auth switch --user johndoe-private
fi
Shell エイリアスの設定
gh
コマンドのエイリアスとして設定することで、gh
コマンド実行前に必ず自動切り替えが行われるようにする
alias gh='ghautoswitch && gh'
これにより、どのレポジトリでも gh
コマンドを実行するだけで、適切なアカウントが自動的に選択される
使用例
# 社用レポジトリで実行
cd ~/work/company-project
gh pr create # 自動的に社用アカウントに切り替わってからプルリクエスト作成
# 個人開発のレポジトリで実行
cd ~/personal/my-project
gh pr create # 自動的にプライベートアカウントに切り替わってからプルリクエスト作成
結果
従来通り gh
コマンドを叩くだけで、アカウントは勝手に適切なものを使用してくれる、という体験が実現できかなり快適になった
ただエイリアスの性質上、毎回 gh auth switch
が実行されるため、わずかな実行時間のオーバーヘッドがあることには留意されたい
個人的にはほとんど気にならない程度だった
Discussion