3
0

More than 3 years have passed since last update.

gh コマンドを使って簡単にツールをインストールするスクリプトを書く

Last updated at Posted at 2021-03-16

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 で記述できるので曖昧な指定が可能になる
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0