LoginSignup
3
2

More than 3 years have passed since last update.

GitHub Releasesからインストールしたコマンドを管理するツールを作った

Last updated at Posted at 2020-12-09

GitHub Releasesから取得したコマンドを所定のパスに配置して、
一括アップグレードできるようにするコマンドを作りました。

demo.gif

なぜ作ったかと、仕組みについて書きます。

なぜ作ったか

インストールしたコマンドのアップグレードをするのが面倒だったのを解消したかったからです。

GitHub Releasesから取得するタイプのコマンドをインストールする時、僕は以下のようなコマンドを実行します。

cd /tmp
wget https://github.com/jiro4989/nimjson/releases/download/v1.2.8/nimjson_linux.tar.gz
tar xzf nimjson_linux.tar.gz
mkdir -p ~/bin
install -m 0755 ./nimjson_linux/bin/nimjson ~/bin/

インストールする時は特にこれで不便ありません。
ですが、コマンドをアップグレードしたくなった時に困りました。

主に以下の問題に遭遇しました。

  • このコマンドどこから取得したっけ?
  • どうやってインストールしたっけ?
  • そもそも新しいバージョン出てるんだっけ?

この問題はGitHub Releasesから取得するコマンドが増えるほど大きくなりました

ソースコード

前述の問題を解消するためにrelmaというコマンドを作りました。

Windowsでも動作します(管理者権限が必要ですが)。

使い方

インストール方法

最初に init で初期化して、 install にリリース物のURLを渡してあげるだけです。

これでリリース物の圧縮ファイルを展開して $HOME/relma/bin に実行可能ファイルのシンボリックリンクが配置されます。

relma init
relma install https://github.com/jiro4989/nimjson/releases/download/v1.2.8/nimjson_linux.tar.gz

アップグレード方法

以下の様に update して upgrade するだけです。

update では最新バージョンの有無をチェックし、バージョン情報をローカルに保存します。
upgrade を実行するとアップグレード可能なパッケージをすべてアップグレードします。

relma update
relma upgrade

インストールしたパッケージの確認方法

relma でインストールしたパッケージの一覧を確認する場合は list を実行します。

relma list

仕組み

インストール方法

relma install に渡したURLのファイルをローカルに落し、所定のパスに展開してシンボリックリンクを作ります。

$HOME/
    relma/
        bin/
            command.exe # シンボリックリンク
        releases/
            $OWNER/
                $REPO/
                    $VERSION/
                        $RELEASE_FILE.tar.gz
                        assets/
                            command.exe # 実体

リリースファイルの展開後のディレクトリ構造にはある程度パターンがあります。

大体は以下の 3 パターンのいずれかだろう、と考えました。

これらの展開後のディレクトリ構造を判別して実行可能ファイルのパスを特定し、 $HOME/relma/bin 配下にシンボリックリンクを作成します。

release_v1.0.0.zip/
    command.exe         # コマンドだけ配置されるケース

release_v1.0.0.zip/
    release_v1.0.0/
        command.exe     # 圧縮ファイル名のディレクトリ配下に
                        # コマンドが配置されるケース

release_v1.0.0.zip/
    release_v1.0.0/
        bin/
            command.exe # 圧縮ファイル名のディレクトリ配下に
                        # bin ディレクトリが配置され、
                        # その下にコマンドが配置されるケース

アップグレード時のインストールURLの特定方法

GitHub Releasesで公開されているコマンドの多くは、リリース手順を自動化されています。

ローカルで手動で叩くコマンドか、あるいはCIからか、手段は違えど大なり小なり自動化されている場合が多いです。

また、リリースファイルの命名も、リポジトリごとに違えど、概ね命名が決まっていて、「リリースファイル名に含まれるバージョン番号だけが異なる」という点で共通点があります。

よって、 relma install に指定したURLのバージョン番号をリリースのタグ番号で差し替えれば、次のバージョンのリリースファイルを取得するURLが特定できるのでは、と考えました。

https://github.com/jiro4989/nimjson/releases/download/${VERSION}/nimjson_${VERSION}_linux.tar.gz

しかし、開発者が毎回手動でリリースファイルを作っていて、命名が不規則だったり、タグとバージョン番号が不一致になるケースもあると思います

これはサポート外としました。

あらゆるリポジトリをサポートするつもりはないですし、命名が不規則なのはリポジトリのオーナーの管理の問題と考えます。

まとめ

  • relma コマンドの使い方を説明しました
  • relma コマンドの仕組みを説明しました

コマンド管理に立てば幸いです。

以上

3
2
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
2