Blog

miseのすゝめ – devcontainerを使わないという選択肢

はじめに

こんにちは。この記事はニフティの坂野とmoriです。この記事は共同執筆したものになります。

チームで開発をしていると、python,node.js等の実行環境やlinter,formatter等周辺ツールのバージョンを揃えたい、という場面は多いと思います。

そこでまず思いつくのがdevcontainerですが、ケースバイケースでオーバーエンジニアリングになりがちだと思っています。

やりたいのは「ツールのバージョンを揃える」だけなのに、コンテナ丸ごと用意するのは重すぎます。

  • Dockerfileやdevcontainer.jsonの構築・メンテナンスコストがかかる
  • CI/CDで同じツールバージョンを使いたいとなると、GitHub Actions側でもコンテナビルドが必要になってさらに複雑化
  • ツール追加のたびにビルドし直し

これらの問題は、miseを使えばもっとシンプルに解決できます。

miseの強み

miseはツールチェイン管理、環境変数管理、タスクランナーなど様々な機能を持つツールです。

以前はRTXという検索性の悪い名前でしたが、いつの間にか改名されていました。

mise.tomlというファイル1つで全部管理できます。

ローカル/CIで同じバージョン

mise.tomlをリポジトリにコミットしておけば、ローカルでもGitHub Actionsでも同じツールバージョンが使えます。

CI側ではjdx/mise-actionを使うだけです。コンテナビルドは要りません。

TerraformのCIは例えばこんな感じで書けます。

mise.tomlにツールもタスクも定義してあるので、CI側はmiseを入れてmise checkするだけです。

devcontainerだとCI用のDockerfileを別途用意したり、コンテナレジストリの管理も必要になりますが、miseならtomlファイル1つで完結します。

コンテナ不要で構築コストが低い

devcontainerは初回ビルドも再ビルドも待ち時間が発生します。

miseはmise installで必要なツールを直接インストールするだけなので、オーバーヘッドが小さいです。

新メンバーが入ってきたときもmise installだけで環境が揃うので、オンボーディングコストも低くなります。

ここからは、miseの各機能を紹介したあと、実際に弊社でどのように活用しているかを説明します。

Renovateでバージョンアップも自動化

Renovateはリポジトリ内の依存関係を自動検知し、バージョンアップのPRを自動で作成してくれるツールです。miseのmise managerにも対応しており、mise.toml内のツールバージョンを自動で検知してPRを作ってくれます。

前述の通り、mise.tomlはローカルとCIの両方で参照されるファイルです。つまり、Renovateがmise.tomlのバージョンを更新するだけで、ローカル環境とCIのツールバージョンが同時に更新されます。

弊社ではTerraformだけインフラへの影響が大きいので個別PRにし、それ以外のツール(tflint, trivy, gh cli等)はまとめて更新する設定にしています。

devcontainerだとDockerfile内のバージョン書き換え→イメージリビルドというフローが必要ですが、miseならtomlのバージョン文字列を書き換えるだけです。シンプルです。

miseの主な機能について

ツール管理

様々なバックエンドに対応しており、一通りのツールがバージョン指定付きでインストールできます。

  • asdf
  • aqua
  • pipx
  • npm
  • cargo

ディレクトリごとのバージョン切り替え

シェルの設定をすると、ディレクトリごとにツールバージョンを切り替えられます。上位ディレクトリの設定は下位にも引き継がれます。

環境変数管理

ツール使用時やタスク実行時に使用される環境変数をmise.tomlに記述しておけます。

ディレクトリ下にいると通常のシェルでも呼び出せます。

.envを読み込むこともできるので、認証情報などはそちらに分離するのがおすすめです。

タスクランナー

mise.tomlに記述したタスクをmise run hogeで呼び出せます。

タスクを指定せずmise runするとTUIで選択できます。絞り込みも可能です。

ツールと同じく、上位ディレクトリのタスクも継承されます。

一例として、私が管理しているのTerraformリポジトリでは、fmt/lint/securityのチェックを全てmiseタスクで管理しています。dirで実行ディレクトリを指定できます。DockerfileのWORKDIRと概ね同じです。

おわりに

今回はmiseを使った開発環境のツール管理について紹介しました。参考になれば幸いです。

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!