2020年9月についにGitHub CLI 1.0が登場しましたね。🎉

ソースコード、ドキュメントはこちらから

 

👉https://github.com/cli/cli

👉https://cli.github.com/

 

GitHub CLIは、go言語製のGitHub公式のCLIツールです。(既存のGitHubのCLIツールとして有名なのはhubらしいですね)

 

従来はcommitなどの作業はターミナルで行うが、PRの作成などはブラウザを開いて行う必要がありました。 

ターミナル→ブラウザ→ターミナル...みたいに頻繁にアプリを切り替える必要があり、個人的にはこのタイミングでコンテキストスイッチによって集中力が途切れがちでした。

GitHubを開くためにブラウザ開いたのに、YouTubeのタブが開いていてそのまま...なんてことはよくありますよね...?GitHub CLIを利用すればこの切り替えの手間がなくなり、快適なGitHubライフを送ることができるというわけなんですね。

 

2020年2月頃にβ版がリリースされていたのですが、2020年9月にβ版が終了してGitHub CLI 1.0としてリリースされました。 β版では対応していなかったGitHub Enterprise Serverも利用できるようになったみたいです。

ちょうど業務でEnterpriseを使っているので利用してみようと思い、休み期間中にGitHubCLI(ghコマンド)をいろいろ触ってみたので、学んだことを何回かに分けて共有していきたいと思います。

 

今回は、ghコマンドのできることと、GitHubおよびGitHubEnterprise用の環境を構築する手順を紹介します。

 

ghコマンド 何ができるの

 

ghコマンドは、基本的にgh <command> <subcommand> [flags]で実行します。

commandとして利用上記できるのは、CORE COMMANDSADDITIONAL COMMANDSです。 おそらく、このCORE COMMANDSを使うことがghコマンドを使う目的であると思います。

できることは、基本的に以下の通りです。

- repoコマンド
  - リポジトリの作成、clone、fork、など

- prコマンド
  - PRの閲覧、作成、一覧表示、レビューなど

- issueコマンド
  - issueの作成、閲覧、一覧表示、closeなど

- releaseコマンド
  - releaseの作成、削除など 新しいタグを作成するなど。

- gistコマンド
  - gistを作成、削除、一覧表示など

 

ちなみにADDITIONAL COMMANDSには以下の6種類があります。

ADDITIONAL COMMANDS
  alias:      Create command shortcuts
  api:        Make an authenticated GitHub API request
  auth:       Login, logout, and refresh your authentication
  completion: Generate shell completion scripts
  config:     Manage configuration for gh
  help:       Help about any command

 

検証環境

Mac OS X

現在MacOS, Windows, Linuxに対応しています。

 

 

まずはinstall

macOSなのでbrewでinstallします。

$ brew install gh

versionを確認

🎉🎉

$ gh --version
gh version 1.0.0 (2020-09-16)
https://github.com/cli/cli/releases/tag/v1.0.0

これでインストールは完了です。

 

認証

まずはGitHubアカウントの設定を行います。認証にはブラウザで行う方法と、GitHubで発行したアクセストークンを利用する方法があります。 設定方法は対話形式とコマンド一発で行う方法などがあります。

 

今回は一番簡単な「ブラウザで対話形式」と、今後楽になる「アクセストークンで一発」の組み合わせの2通り紹介します。

 

ブラウザで対話形式

gh authコマンドのうち、loginコマンドを利用します。

$ gh auth login

 

まずはGitHub.comを利用するかGitHub Enterprise Serverを利用するか選択します。今回はGithub.comを利用してみます。

? What account do you want to log into?  [Use arrows to move, type to filter]
> GitHub.com
  GitHub Enterprise Server

 

ログインの方法を選択します。今回はブラウザを利用しました。

? How would you like to authenticate?  [Use arrows to move, type to filter]
> Login with a web browser
  Paste an authentication token

 

enterを押すとone-time codeが出力されると同時にブラウザが開きます。

 

 

one-time codeが求められるので入力します。

 

デフォルトでは以下の権限が与えられていることがわかります。


Existing access

- Create gists
- Read org and team membership, read org projects
- Full control of private repositories

 

指示に従ってぽちぽちしていくと認証が完了します。

 

次にプロトコルを選択します。HTTPSSSHを選択します。

✓ Authentication complete. Press Enter to continue...

? Choose default git protocol  [Use arrows to move, type to filter]
  HTTPS
> SSH

以上で終了です。

 

 

アクセストークンで、コマンド一発パターン

 

まずはGitHubでアクセストークンを発行します。以下の通りブラウザで操作します。

  • AccountのSettingsを開く

  • タブにあるDevelopers settingを選択

  • タブにあるPersonal access tokensを選択

  • Generate new tokenを選択

ここから、必要な権限をチェックし、Generate tokenを押します。

 

 

無事に発行されました。(一応隠してあるけど個人用アカウントでなんの権限もないゴミで、さらにすでに削除済みなのでご安心を)

 

これをどこか安全な場所にテキストファイルとして保管しておきます。

以下のコマンドで実行すると、一発で認証できます。

$ gh auth login --hostname (GHEならhost指定) --with-token < /path/to/enterprise_account
もしくは
$ gh auth login --with-token < /path/to/github_account

 

ちなみに、--hostnameでhostを指定しない場合はgithub.comが指定されます。 https://github.com/cli/cli/blob/929e082c13909044e2585af292ae952c9ca6f25c/internal/ghinstance/host.go#L8

 

これで認証は完了です。

 

ちなみにghのaliasコマンドを利用することで、loginをもっと簡略化することもできます。 (github.comアカウントとenterpriseアカウントが同時にログインできるので、ログアウトをする機会もおそらくほとんどないはずなので、ログインを簡略化する必要はあまりないかもですが参考までに。)

lというaliasコマンドをghコマンドに追加してみます。

$ gh alias set --shell l 'gh auth login --with-token < /path/to/github_account'

 

これ以降、これでログインできます。

$ gh l

 

loginしているアカウントを確認

以下のコマンドで確認することができます。

$ gh auth status

 

logout

ログアウトは以下の通りです。

$ gh auth logout

 

 

エディタの設定

PRやissueを書く時などのエディタを設定します。今回はvimを設定しました。

$ gh config set editor vim

ちなみに公式ドキュメントによれば現状Windowsでは常にメモ帳らしい。

On Windows, the editor will currently always be Notepad.

 

さいごに

ghコマンドいろいろ触ってみたけど、かなり便利なので、次回以降は主要コマンドの解説の記事を書きたいと思います。