🔩

GitHub CLI でマルチにユーザーを切り替えて操作

2022/12/28に公開

GitHub CLI で GitHub のアカウントを複数利用[1]できると、直に API を叩くよりも便利なシーンがある。本エントリではその実現方法と管理方法として direnv というツールを併用する方法を紹介する。

GitHub CLI から参照されるアクセストークンの制御

gh auth status として現在ログインしているアカウントの情報や設定ファイルの場所が確認できる。

$ gh auth status
github.com
  ✓ Logged in to github.com as XXXX (/home/XXXX/.config/gh/hosts.yml)
  ✓ Git operations for github.com configured to use https protocol.
  ✓ Token: *******************

環境変数 GH_CONFIG_DIR を設定すると、GitHub CLI が認証/資格情報を探す場所を変更できる[2]。例えば下記のように GH_CONFIG_DIR を存在しないディレクトリ dir 等で設定すると、ログイン状態とならないことがわかる。

$ ls dir
ls: dir: No such file or directory
$ GH_CONFIG_DIR=dir gh auth status
You are not logged into any GitHub hosts. Run gh auth login to authenticate.

すなわち任意のディレクトリに設定ファイルを格納し、そのパスを GH_CONFIG_DIR に設定してやることで GitHub CLI で扱うアカウントを切り替えることができる[3]

direnv を用いて特定ディレクトリ配下での操作を特定 GitHub アカウントと紐づける

direnv は、シェル中の操作をフックしてあるディレクトリ内にファイル .envrc が配置されているとき、その中身に定義されている環境変数を自動的に適用できるツールである。これを用いれば、特定ディレクトリに移動することで GitHub CLI で扱うアカウントを即座に切り替えることができる。
例えば、あるディレクトリ X に移動したとき、X/.config ディレクトリ内に定義されているアカウントで GitHub CLI を利用するならば .envrc を下記のように設定できる。

$ cat X/.envrc
export GH_CONFIG_DIR=$PWD/.config
$ cd X
direnv: loading .envrc
direnv: export +GH_CONFIG_DIR
$ cd ..
direnv: unloading
脚注
  1. 単一のマシンアカウントとして利用するためや GitHub Enterprise 等。GitHub Docs に複数アカウントを扱う場合の規約がある。 ↩︎

  2. デフォルトで $HOME/.config/gh 配下に yaml 形式で配置されている。 ↩︎

  3. この特性を活かし、PR の reviewer に設定されたとき自動で approve する GitHub Actions をつくったのだが、直に API を叩くよりも実装が楽であった: https://github.com/falgon/roki-web-post/blob/draft/.github/workflows/kiirotori-auto-approve.yml ↩︎

Discussion