gh コマンド は GitHub release からダウンロードする機能があります。これを使って、自動で特定のバージョンのツールの binary をダウンロードするような、簡易的なツールのインストーラーを簡単に書くことが出来ます。
gh release download の使い方
https://cli.github.com/manual/gh_release_download を見れば大体わかります。
コマンドラインオプションで、リポジトリやダウンロード先を指定できるので、以下のような渡し方をすることで GitHub からのダウンロードツールとして使うことが出来ます。
# https://github.com/kubernetes/kops/releases/tag/v1.19.1 から kops-darwin-amd64 を tmp にダウンロードする
gh release download -R kubernetes/kops v1.19.1 --pattern 'kops-darwin-amd64' -D "./kops"
どう使うと便利か
自分は、以下のような、「開発で利用するツールをその場でダウンロードして実行する」スクリプトを書いて使っています。
#!/bin/bash
set -eu
KOPS_VERSION=v1.19.1
cpuarch() {
case `uname -m` in
"x86_64" )
echo "amd64"
;;
"aarch64" )
echo "arm64"
;;
esac
}
download-kops() {
local tempdir=$(mktemp -d)
local OS=$(uname -s | tr '[:upper:]' '[:lower:]')
local ARCH=$(cpuarch)
echo "Downloading kops $KOPS_VERSION ..."
gh release download -R kubernetes/kops $KOPS_VERSION --pattern "kops-$OS-$ARCH" -D $tempdir
test -d ./kops/$KOPS_VERSION || mkdir -p ./kops/$KOPS_VERSION
mv $tempdir/kops-$OS-$ARCH ./kops/$KOPS_VERSION/kops
chmod +x ./kops/$KOPS_VERSION/kops
echo "Downloaded kops $KOPS_VERSION"
}
# kops がダウンロード済みでなければ https://github.com/kubernetes/kops からダウンロードする
test -x ./kops/$KOPS_VERSION/kops || download-kops
# ダウンロードした kops を実行
./kops/$KOPS_VERSION/kops $@
こういうスクリプトを Git リポジトリのディレクトリ (bin/
など) に置いておく、ということは自分はよくやっています。これにより、
- 複数人の開発で、個々人のセットアップの手間が小さくなる
- version が固定されているので、version のブレによる違いが起きにくい
- 元のツールのラッパーのように使うので、version の指定を変更した場合も更新漏れが起きにくい
- CI でのセットアップも行いやすい
- GitHub Actions では gh コマンドがインストール済みなので、基本的にそのまま使える
-
bin/
のツールを使う習慣を作っておくと、チーム固有の環境設定などをここに投げ込みやすい
というメリットがあります。
自分は現職ではインフラチームに所属しているのですが、日々の開発では様々な CLI ツール (terraform, terraform-docs, kops, velero, etc) を利用しているのですが、いわゆる *env 系のツールがないツールも多く、個々のツールをチームに導入する際に環境構築がハードルになることもあるので、最近ではこういうスクリプトを用意するようにしていて、重宝しています。
※ curl を直接使う場合との違い
一応似たような事は curl を使って書くことが出来ます。(Ref: https://qiita.com/wf9a5m75/items/39528ae6dda687190a3d)
ただし、gh を使う方が、スクリプトとして記述がシンプル、分かりやすくなるメリットがあります。
- curl よりもコマンドラインの見た目が直感的になる
- エラー処理、認証用の token を渡す部分等を記述しなくて良くなる
- download するファイルを pattern で記述できるので曖昧な指定が可能になる