bootstrapの変更を適用する前に内容を確認したい

【mise】mise bootstrap filesでシステムファイルを宣言的に配置する のようなmise bootstrap配下のサブコマンドは、ファイルの配置やパッケージのインストールなど、マシンに実際に変更を加える。適用前にどんな変更が行われるかを確認したい場合、mise bootstrap planを使う。実行してもマシンには一切変更を加えない、読み取り専用のコマンドである。

mise bootstrap planの基本

[bootstrap.*]に設定した内容と、マシンの現在の状態を比較し、差分を表示する。

[bootstrap.files."/etc/example.conf"]
content = "hello = true\n"
mode = "0644"
$ mise bootstrap plan
create  file:/etc/example.conf  post-packages  absent  file mode 0644  /work/mise.toml
Plan: 1 create, 0 update, 0 unchanged, 0 remove, 0 unknown

各行にはアクション(create/update/unchanged/remove)・リソースの種類とID・適用フェーズ・現在の状態・目標の状態・設定ファイルのパスが表示される。実際にmise bootstrap files applyで適用した後に再度mise bootstrap planを実行すると、unchangedになる。

$ mise bootstrap files apply -y
$ mise bootstrap plan
unchanged  file:/etc/example.conf  post-packages  file mode 0644 uid 0 gid 0  file mode 0644  /work/mise.toml
Plan: 0 create, 0 update, 1 unchanged, 0 remove, 0 unknown

設定ファイルの内容を変更してからmise bootstrap planを実行すると、updateとして検出される。

[bootstrap.files."/etc/example.conf"]
content = "hello = true\nchanged = true\n"
mode = "0644"
$ mise bootstrap plan
update  file:/etc/example.conf  post-packages  file mode 0644 uid 0 gid 0  file mode 0644  /work/mise.toml
Plan: 0 create, 1 update, 0 unchanged, 0 remove, 0 unknown

設定を削除しただけではremove扱いにならない

[bootstrap.files."/etc/example.conf"]のブロックをmise.tomlからそのまま削除しても、mise bootstrap planは何も検出しない。

$ mise bootstrap plan
mise nothing configured for bootstrap planning

実際に既存のリソースを削除したい場合は、ブロックを消すのではなくstate = "absent"を明示的に指定する。

[bootstrap.files."/etc/example.conf"]
state = "absent"
$ mise bootstrap plan
remove  file:/etc/example.conf  post-packages  file mode 0644 uid 0 gid 0  absent  /work/mise.toml
Plan: 0 create, 0 update, 0 unchanged, 1 remove, 0 unknown

mise bootstrapは宣言的な設定管理であり、実際にマシン上に存在するかどうかではなく、mise.tomlに何が宣言されているかだけを見て差分を計算する。設定からブロックを削除するだけでは、そのリソースの削除は計画されない。

–jsonで機械可読な出力を得る

--jsonを付けると、リソースごとの詳細(current/desired/action/origin/phase)と、全体のサマリーをJSONで取得できる。

$ mise bootstrap plan --json
{
  "resources": [
    {
      "id": { "kind": "file", "name": "/etc/example.conf" },
      "current": "absent",
      "desired": "file mode 0644",
      "action": "create",
      "origin": {
        "config": "/work/mise.toml",
        "config_root": "/work",
        "environment": [],
        "source": null
      },
      "phase": "post-packages"
    }
  ],
  "summary": { "create": 1, "update": 0, "remove": 0, "unchanged": 0, "unknown": 0 }
}

–detailed-exitcodeでCIの差分チェックに使う

--detailed-exitcodeを付けると、差分の有無を終了コードで表現できる。差分が無ければ0、差分があれば2、エラーが発生した場合は1になる。

$ mise bootstrap plan --detailed-exitcode
$ echo $?
2

$ mise bootstrap files apply -y
$ mise bootstrap plan --detailed-exitcode
$ echo $?
0

CIのパイプラインに組み込み、意図しない変更(ドリフト)が発生していないかを確認する用途に使える。