gh auth loginで作成されたクレデンシャルだけで生活するためにgh-doを作った

GitHub CLIgh auth login で作成されたクレデンシャルはOSのセキュアストレージに保存されるようになりました。

次のエントリが詳しいです。

blog.kyanny.me

「じゃあ、もう全部セキュアストレージに保存されたクレデンシャルを使えばOK」となるのですが、なかなかそうはいきません。

なぜかというとGitHubのクレデンシャルを使うツールによって環境変数の扱いが異なるからです。

GitHubのクレデンシャル設定の歴史(私の記憶版)

注意: 以下は、あくまで私の記憶であって実際と異なるかもしれません。

前史

GitHub CLIgh )やGitHub Actionsの登場以前は、クレデンシャルを保存する環境変数名として使われていたのは GITHUB_TOKEN でした。また、github.comとEnterpriseを切り替えるための環境変数名は定まっていなかった気がします。

GitHub Actions の登場

GitHub Actionsが登場したことで、GitHub Actionsがデフォルトで設定している環境変数が認知されるようになってきました。

docs.github.com

これにより、 GITHUB_API_URL といった「github.comとEnterpriseを切り替える」環境変数に対応したツールが登場してきました。

GitHub CLIgh )の浸透

そしてGitHub CLIが広く使われるようになってきて、GitHub CLIがサポートする環境変数GH_HOST GH_TOKEN など)が認知されるようになってきました。

cli.github.com

異なる環境変数の取り扱いにまとめて対応する

上記のような経緯が(たぶん)あったので、GitHubのクレデンシャルを扱うツールはその登場時期によって認識する環境変数が異なります。

独自に環境変数名を定めているものはしかたないとしても、当時のデファクトスタンダード環境変数に対応していたツールにはなんとか対応したいと考えました。

また、GitHub CLIには gh auth token というトークンそのものを取得するコマンドがありますが、「github.comとEnterpriseを切り替える」環境変数まで設定してくれる訳ではありません。

というわけで、gh-do というコマンドを作りました。

gh-do

github.com

gh-doは何かというと gh auth login で保存されたクレデンシャルとホスト名を使って環境変数を設定してくれるツールです。

インストール

gh-doはGitHub CLI 拡張機能としてインストールして gh do として実行できます。

$ gh extension install k1LoW/gh-do
$ gh do --help
gh-do is a tool to do anything using GitHub credentials.

Usage:
  gh-do [flags]

Flags:
      --help
  -h, --hostname string   The hostname of the GitHub instance to do
      --insecure          Use insecure credentials
  -v, --version           version for gh-do

また、単体のコマンド gh-do としてインストールすることも可能です。macOSであれば Homebrewでインストールできます。

$ brew install k1LoW/tap/gh-do

使い方

引数にコマンドがあれば、環境変数を設定したうえでコマンドを実行してくれますし、

gh do -- any-command arg arg arg

引数が何もなければ環境変数をexportコマンドの形で出力します。

$ gh do
export GH_HOST=github.com
export GH_TOKEN=gho_xxxxxXXXXXXXXxxxxxxxXXXXXXXXXxxXXxxx
export GH_ENTERPRISE_TOKEN=
export GITHUB_ENTERPRISE_TOKEN=
export GITHUB_TOKEN=gho_xxxxxXXXXXXXXxxxxxxxXXXXXXXXXxxXXxxx
export GITHUB_API_URL=https://api.github.com
export GITHUB_GRAPHQL_URL=https://api.github.com/graphql

github.comとEnterpriseの切り替え」も環境変数 GH_HOST を読んで自動で切り替えてくれます。 また --hostname ( -h ) オプションで切り替えることも可能です。

$ gh-do --hostname enterprise.internal
export GH_HOST=enterprise.internal
export GH_TOKEN=gho_yyyyyYYYYYYYYyyyyyyyYYYYYYYYYyyYYyyy
export GH_ENTERPRISE_TOKEN=gho_yyyyyYYYYYYYYyyyyyyyYYYYYYYYYyyYYyyy
export GITHUB_ENTERPRISE_TOKEN=gho_yyyyyYYYYYYYYyyyyyyyYYYYYYYYYyyYYyyy
export GITHUB_TOKEN=gho_yyyyyYYYYYYYYyyyyyyyYYYYYYYYYyyYYyyy
export GITHUB_API_URL=https://enterprise.internal/api/v3
export GITHUB_GRAPHQL_URL=https://enterprise.internal/api/graphql

デフォルトではOSのセキュアストレージに保存されたクレデンシャルしか使わないようになっていますが、--insecure オプションを付与することでGitHub CLIと同様にクレデンシャル用環境変数にも反応してくれます。

$ gh do --insecure

ところで

envchainにまとめるというのも汎用性高くてとてもオススメです。

github.com

というわけで

gh auth login で作成されたクレデンシャルだけの生活がはじまる...

github.comのSettingsにあるクレデンシャルはゼロ)

と思ったのですが、現在はまだ完全には至っていません。

Jasperめちゃ便利なのでオススメです*1

jasperapp.io

*1:GHESのPR/Issueビューワーとしてフル活用しています