Debian LinuxとAlpine Dockerコンテナでもgh(Github CLI)コマンドを導入する


※ 当ページには【広告/PR】を含む場合があります。
2021/01/05
2022/01/27
蛸壺の技術ブログ|Debian LinuxとAlpine Dockerコンテナでもgh(Github CLI)コマンドを導入する

直近の話題でベータ公開されていた
GitHub CLIがこのほどRC版(動作時現在ではgh v1.1.0@2020-10-06)になっていたようです。

手元のDebian Linuxでも
Linuxbrewから一発導入することができました...と報告は以上なのですが、簡単な動作確認を試してみたいと思います。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集

Gh(GitHub CLI)コマンドのインストール方法

公式のGhコマンドのインストール方法でも紹介があるように、各OSでインストールする手順が細かく違います。

OSごとの全ての手順はとても取り上げられませんが、ここではDebian系のaptパッケージマネージャと、Alpine系のapkパッケージマネージャの2つに絞ってGhコマンドの導入手順をご紹介します。

【Debian Linux】Linuxbrewからインストール

Debianに限らずLinuxbrewがインストール済みであれば以下のコマンドからgithub cliが即時導入できます。

            
            $ brew update
$ brew install gh
Updating Homebrew...
==> Downloading https://linuxbrew.bintray.com/bottles/patchelf-0.11.x86_64_linux
==> Downloading from https://akamai.bintray.com/73/7396e6cf5dbe62fae0e7fcba57f88
########################################################################100.0%
#...中略
Pruned 1 symbolic links from /home/linuxbrew/.linuxbrew
==> Caveats
==> gh
Bash completion has been installed to:
  /home/linuxbrew/.linuxbrew/etc/bash_completion.d
        
たったこれだけでGithub CLIの導入完了です。Homebrewはとても便利。

バージョン確認をしてみると、

            
            $ gh --version
gh version 1.1.0 (2020-10-06)
https://github.com/cli/cli/releases/latest
        
と確かに最新版がインストールされているようです。

【Alpine Linux】apkパッケージマネージャから直にインストール

別記事の
【GitHub活用メモ】GitHubの認証をSSH接続方式にしてみる(Dockerコンテナ対応済)の内容で、Alpine Dockerコンテナ内からGitHubのレポジトリを操作する基本の話をしていました。

公式にはAlpineへのGhコマンドのインストール方法の説明はありませんが、Alpine公式には既に
ビルド済みパッケージが提供されて、より簡単にGhコマンドを導入できます。

            
            FROM alpine:3.15

RUN apk update && apk upgrade && \
    apk add --no-cache bash git openssh expect

#👇GitHub CLIコマンドを追加
RUN apk add --no-cache github-cli

CMD ["bash"]
        
先程のLinuxbrewより更に簡単な使えるのが有り難いところです。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集

GitHub CLIでユーザーアカウントを認証する(初回)

初回はアカウントの情報を設定しなければならないので、以下のようにユーザーログイン作業を行います。

            
            $ gh auth login
? What account do you want to log into? GitHub.com
- Logging into github.com
? How would you like to authenticate? Login with a web browser
! First copy your one-time code: ****-****
#👇Enterキーを押すとブラウザから認証作業ができます(下の図参照)。
- Press Enter to open github.com in your browser...
#👇ブラウザでの作業完了後に表示されます。
✓ Authentication complete. Press Enter to continue...
? Choose default git protocol HTTPS
- gh config set -h github.com git_protocol https
✓ Configured git protocol
✓ Logged in as ***********
        
合同会社タコスキングダム|蛸壺の技術ブログ

認証後ログインできるようになっていると、ステータスが正常に跳ね返ってきます。

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

レポジトリの情報をみる

gh repo viewコマンドで、レポジトリのルートにあるReadme.mdを標準出力することができます。例えばプライベート設定のmy_hoge_projectという名前のプロジェクトの見出しを出力したい場合、

            
            $ gh repo view my_hoge_project
***********/my_hoge_project
Private Hoge Project
#...Readme.mdの内容がズラーッと出力
#...中略
View this repository on GitHub: https://github.com/***********/my_hoge_project
        
とするとブラウザでページにアクセスせずとも、Readmeをコマンド一発で参照できます。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集

GitHub CLIで出来る基本操作〜プルリクエストからマージまで

雰囲気だけを味わうためプルリクエストしてそのままマージをやってみます。

通常ではチームで開発業務を行っている方々は、プルリクした後に色々とレビューやissueなどの過程を経ると思います。

今回は趣味程度のお一人さまレポジトリでghコマンドの動作確認程度しか解説していないので、詳しくは
GitHub CLI 公式マニュアルでご希望の機能を開拓してください。

プルリク

まず開発中のブランチ
devからリモートへ変更した分をコミットして・プッシュしてみると、

            
            $ git push origin dev
Enumerating objects: 17, done.
Counting objects: 100% (17/17), done.
#...中略
To https://github.com/********/my_hoge_project.git
   9a10e74..bdf5311  dev -> dev
        
としておいてブラウザでレポジトリを見ると、下のような状態です。

合同会社タコスキングダム|蛸壺の技術ブログ

ここからプルリクエストを作成します。コマンドは
gh pr createですが、試しにオプション指定無しでやってみます。

すると対話的にプルリクエストのオプションが聞かれるので、適当に入力してみます。

            
            $ gh pr create

Creating pull request for dev into main in ********/my_hoge_project

#👇プルリクのタイトルを入力
? Title Remove cupper area from LED pattern
#👇コメントのBodyは省略可
? Body <Received>
#👇Submitを選択
? What's next? Submit
https://github.com/********/my_hoge_project/pull/15
        
すると先程開発ブランチからプッシュした変更点からプルリクエストが作成されています。

合同会社タコスキングダム|蛸壺の技術ブログ

ちなみにプルリクエストを作成するオプションを利用すると、逐一コマンドラインから設定を聞かれなくなるので、シェルスクリプトによる自動化の際にはオプションは付けておきたいところです。
gh pr create --helpでオプションが確認できます。

主なオプションとして、

            
            -B, --base <branch>:
    マージ先のブランチを指定
-b, --body <content>:
    プルリクの内容の指定
-d, --draft:
    ドラフトプルリクエストを作成
-t, --title <title>:
    タイトルを指定
-w, --web:
    ブラウザを開いてプルリクエストを作成
        
毎回対話型でオプションの確認を聞いて来られるのは正直うるさいなぁ...となったら、--fill(-f)オプションが使えます。

このオプションを指定していると、
--title--bodyをスキップできるようになります。

            
            $ gh pr create --fill
#OR
$ gh pr create -f
        
少数人数で開発チームで行っている場合にはこちらの方が使い勝手いいように思います。

プルリクの履歴確認

現在のプルリクエストの履歴を
gh pr listでチェックすることもできます。

            
            $ gh pr list -s all

Showing 15 of 15 pull requests in ********/my_hoge_project that match your search

#15  Remove cupper area from LED pattern  dev
#14  Added cnc file fot pcb-coil          dev
#...中略
#1   Added resources                      dev
        
プルリク中のステータスの確認にはgh pr statusを実行すると、現在のブランチ、オープン中のプルリクエスト、レビューがリクエストされているプルリクエストが確認できます。

            
            $ gh pr status

Relevant pull requests in ********/my_hoge_project

Current branch
  #15  Remove cupper area from LED pattern [dev]

Created by you
  #15  Remove cupper area from LED pattern [dev]

Requesting a code review from you
  You have no pull requests to review
        

マージ

では(個人用のレポジトリなので)いきなりレビューもせずにワイルドに先程のプルリクの内容をマージしてみましょう。ブラウザでは以下のようになっています。

合同会社タコスキングダム|蛸壺の技術ブログ

ではこれを早速マージしてみます。

マージするコマンドは
gh pr mergeです。これにもオプションがありますが、とりあえずオプションなしで対話的に使ってみます。

            
            $ gh pr merge
? What merge method would you like to use?  [Use arrows to move, type to filter]
> Create a merge commit
  Rebase and merge
  Squash and merge
? Delete the branch locally and on GitHub? (y/N)
✔ Merged pull request #15 (Remove cupper area from LED pattern)
        
これでmainブランチにマージできました。

合同会社タコスキングダム|蛸壺の技術ブログ

なお、
gh pr mergeのオプションは以下のようになり、対話型で聞かれたくない場合にはこちらで指定できます。

            
            -d, --delete-branch:
    マージ後のローカルとリモートの現在のブランチを削除
    (デフォルトではTrue)
-m, --merge:
    ベースのブランチにコミットをマージ
-r, --rebase:
    ベースのブランチにコミットをリベース
-s, --squash:
    複数のコミットを一つのコミットにまとめた後で
    ベースのブランチにマージ
        
デフォルトでは、マージした後のリモート&ローカルの開発ブランチは消去されます。

対話型にしないで作業ブランチを残したままマージする利用例を以下に挙げると、

            
            $ gh pr merge --merge --delete-branch=false
#OR
$ gh pr merge -m -d=false
        
という感じに使えます。

なお、プルリクとマージの間には若干の時間を空けないといけませんので、以下のような連続のコマンドは失敗します。

            
            $ gh pr create --fill && gh pr merge -m
#サーバー側からプルリク作業が終わっていないので
#マージまで時間を空けるような警告
        

合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集

まとめ

ghコマンドはこれまでブラウザ上で操作していた煩わしいマウス操作から解放してくれる素晴らしいツールだと思います。

効果的に使うことで、コードの開発効率も飛躍的に高まりますので、気になったらこれを機会に思い切って導入してみましょう。