GitHub CLIで外部リポジトリを指定すると向き先がgithub.comになる
概要
GitHub CLI で外部リポジトリに対してコマンドを打つと、向き先のホストがgithub.comになります。
そのため、GitHub Enterpriseなどgithub.com以外のリポジトリを指定した場合には、明示的にホストを指定しないとリポジトリを見つけることができません。
対策として、GH_HOST
を環境変数に設定して向き先を指定する必要があります。
問題に遭遇した経緯
そもそもこの仕様を知ったのは、gh-bumpに起票された下記のissueから。
gh-bumpはSemantic Versioningに基づいてリリースを作成するGitHub CLIの拡張コマンドです。コマンド自体はGoで実装していて、gh-bumpというシェルスクリプトでGoのバイナリを実行しています。
寄せられたissueの内容は、「GitHubのリポジトリに対しては正常に動作するが、GitHub Enterpriseのリポジトリに対して実行すると既存のリリースを取得することができない」というものでした。
また、回避策として「GH_HOST
を環境変数として渡すと正常に動作する」ということも記載されていました。
正常にリリースが取得できている状態
リリースが取得できていない状態(最初のリリースとして処理されている)
原因の解明
gh-bumpは内部的にはローカルにインストールされているGitHub CLIのバイナリを実行しているので、 GitHub CLIの動作による問題だろうという見立てを立て、issueを探りました。 すると、GitHub Enterpriseに対してコマンドが動かないという似たような内容のissueを複数見つけました。
メンテナのコメントを読んでみると、どうやら外部のリポジトリ(カレントディレクトリでないリポジトリ)を指定した場合にはデフォルトで向き先がgithub.comになるという仕様があるようです*1。
回避するには GH_HOST
を設定するようにとも記載されています。
We default to github.com for commands where the current repository is not the context: #1745
https://github.com/cli/cli/issues/3232#issuecomment-799592227
GitHub CLIには外部リポジトリを指定する -R
オプションがあります。
gh-bumpでもこのオプションをサポートしていて、カレントディレクトリを気にしないで済むので下記のように常にこのオプションを指定して実行していました。
// b.Repositoryのリリースを取得する gh("release", "view", "-R", b.Repository)
結果として、GitHub Enterpriseのリポジトリでgh-bumpを実行すると、内部で -R
オプション付きでGitHub CLIが実行されてホストがgithub.comになるため、リポジトリの情報が取得できないというのが原因でした。
gh-bumpでの対応
対応として、外部リポジトリに対して実行されたのかどうかを保持することで処理を分岐するようにしました。
if isCurrent { gh("release", "view") } else { gh("release", "view", "-R", b.Repository) }
これにより、カレントリポジトリに対する実行はそのままカレントリポジトリに対して実行されるので、向き先の変更が起きずにGitHub Enterpriseのリポジトリから情報を取得できるようになりました。
所感
自分はGitHub Enterpriseの環境をもっていないため、今回の問題に関してまったく気づくことができませんでした。 しかし、issueをもらうことで問題に気づくことができ、さらにはGitHub CLIの仕様に関して少し詳しくなりことができました。 これは自分にとってとてもいい経験になったなと思います。
また、人助けもできたうえ、使ってもらえているという実感を得ることができて嬉しかったです。OSSいいですね。
ちなみに、このissueをCloseした後にもっとちゃんと機能を作ろうという気持ちになり、リファクタと機能追加を行いました。 もともと「最低限動くやつで公開しちまえ」という気持ちで作ったのですが、やっぱり使ってくれている人がいると思うと改善していこうというモチベーションがわきますね。
今後も誰かの役に立つ何かを作れたらいいなと思います。
*1:いずれ修正する予定とも書いてありました