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