💧

aqua で CLI ツールを YAML でバージョン管理

2021/12/04に公開

CLI ツールを YAML でバージョン管理できるツール aqua を開発しています。

https://github.com/aquaproj/aqua

先日(2021-11-27)、公式サイトを公開しました。

https://aquaproj.github.io/

詳細は公式サイトをご参照ください。

この記事にコマンドやその実行結果、設定ファイルのサンプルなどを書いてもメンテが難しいため、
ここでは時間が経っても変わりにくい内容を書こうかと思います。

この記事の執筆時点で最新バージョンは v0.8.0 (Standard Registry は v0.10.13) です。

aqua は CLI ツールをインストールする CLI ツールです。
Go で書かれたシングルバイナリなので、簡単にインストールできます。
CLI ツールのインストールでいうと、 Homebrew などでインストールすることが多いかと思いますが、
aqua はインストールする CLI とそのバージョンを YAML で宣言的に定義するのが特徴です。

バージョンの固定

aqua では必ずツールのバージョンを厳密に指定する必要があります。
これにより、インストールの実行タイミングによってツールのバージョンが変わるといった問題が起こらないようになっています。

Renovate によるツールの更新の自動化

ツールのバージョンをコードで管理するということは、バージョンを継続的に更新していく必要がありますが、
aqua では Renovate の Preset Config が提供されているため、非常に簡単に更新を自動化出来ます。

ツール実行時に自動インストールされる

ツールが呼び出されるタイミングで設定ファイルで指定したバージョンのツールを自動的にインストールしてくれます。
これによって、設定ファイルと実際に実行されるツールのバージョンに乖離が生じるようなことがなくなります。

バージョンを簡単に切り替えられる

設定ファイルで指定されたバージョンを変更するだけで簡単にバージョンを切り替えられます。
新しいバージョンをちょっと試したり、 update したら問題が起こったので downgrade するといったことが簡単にできます。

設定ファイルごとにツールのバージョンを切り替えられる

また、 aqua は設定ファイルごとにツールとそのバージョンを管理でき、プロジェクトなどによってツールのバージョンを使い分けることが出来ます。
フォークした同じ名前のツールと使い分けることも出来ます。
Homebrew などのパッケージマネージャーだと複数のバージョンを使い分けることは難しいので、これは aqua を使う大きなメリットかなと思います。

dotfiles 的に自分の使うツールを管理する

aqua の設定ファイルを dotfiles 的なリポジトリで管理することで、自分の使うツールをコード管理することが出来ます。
複数の PC でツール及びそのバージョンを揃えることが出来ますし、新しい PC のセットアップなんかも楽になります。

組織・チームで使うツールの管理

aqua は個人だけでなく、チームや組織で使うというユースケースもカバーしています。

組織・チームの dotfiles 的なリポジトリを用意してそこで aqua の設定ファイルを管理することで
組織・チームで使うツールも aqua で管理できます。
新しく参画した人のセットアップも楽になりますし、組織・チームにツールを配布するのにも便利です。

リポジトリの開発に必要なツールの管理

リポジトリに設定ファイルを置くことで、そのリポジトリの開発に必要なツールを aqua で管理できます。
YAML で宣言的に管理されているため、設定ファイルの内容によらず常に同じコマンドでツールをインストールできます。
これはプロジェクトに新しく参画した人のセットアップや、継続的なツールのアップデートを極めて簡単にします。
なんのツールが必要であるかとか、各ツールをどのようにインストールするかだとか、そういったことをドキュメント化したり調べたりする手間が軽減されます。

Private な GitHub リポジトリで管理されているツールのインストール

aqua は Private な GitHub リポジトリで管理されているツールのインストールもサポートしています。
組織で開発している Private なツールを配布したい場合に便利です。

CI での利用

aqua のための GitHub Actions や CircleCI Orb も提供されており、 CI の中でも簡単にツールをインストールできます。
ローカルと CI で同じ設定ファイルを使うことで、ローカルと CI のバージョンの乖離をなくす事ができます。

ところで、ツールのインストールと実行をまとめてやってくれる GitHub Actions も少なくありません。
例えば golangci-lint 公式の GitHub Actions は golangci-lint の実行だけでなく、インストールまでやってくれます。
これらの GitHub Actions は使うのが楽でとても便利ですが、個人的には課題も感じています。

  • バージョンの固定を強制していないものも少なくない: コードを変更していないのにバージョンが更新されて突然 CI が壊れるなんてことが起こりうる
  • バージョンを GitHub Actions の inputs で指定する場合、パラメータを継続的に更新する必要があるが、 Renovate などで更新するにはツールごとにコードを書く必要がある
    • 継続的に更新できてなくて古いままなこともある
  • GitHub Actions を使ってローカルにツールをインストール出来ない(ローカルでの開発と、ツールのインストール手順を統一できない)
  • ローカルと CI でバージョンが同じであることを保証するのが難しい(バージョンの違いによる問題が発生する)

aqua はこれらの課題を解決しています。

  • バージョンの固定を強制している
  • Renovate Preset Config を使うことで簡単に更新できる
  • CI とローカルの両方で使える
  • 同じ設定ファイルを使えばバージョンが同じであることが保証できる

Registry

aqua でインストールできるツール及びそのインストール方法は Registry で管理します。
Registry の実態はただの YAML (テキストファイル) です。
Registry は aqua の設定ファイルに直接書くことも出来ますし、ローカルのファイルや GitHub Repository から読み込むことも出来ます。
組織のプライベートなツールのための Registry を Private Repository で管理することも出来ます。

Standard Registry と呼ばれる言わば公式の Registry があり、そこに登録されているツールであれば自分で Registry を書かなくても簡単にツールをインストールできます。

さいごに

以上、 CLI ツールを YAML でバージョン管理できるツール aqua を紹介しました。
興味を持っていただけた方はまず Quick Start をやってみてください。

https://aquaproj.github.io/

Discussion