環境変数でインタラクティブモードをスキップできる非対話型インストールオプションを追加
ONCEのインストーラーに ONCE_INTERACTIVE=false オプションが追加され、TUIの起動をスキップした非対話型インストールが可能になりました。これにより、AnsibleなどのCI/CDパイプラインや構成管理ツールからの自動インストールが容易になります。
背景
これまでONCEのインストーラーはインストール完了後に必ず TUI(ターミナルUI) を起動する run_once ステップが実行されており、非対話型環境での自動インストールを公式にサポートする方法がありませんでした。#15 では、AnsibleによるONCEの自動インストールを試みたユーザーから、インタラクティブなプロンプトが手動介入を要求するため、CI/CDパイプラインや構成管理スクリプトへの組み込みが困難であるという問題が報告されていました。
この変更は、DevOpsワークフローや自動サーバープロビジョニングへの統合を公式にサポートする形で、その問題を解決します。
技術的な変更
installer/templates/install.sh の main() 関数内に、ONCE_INTERACTIVE 環境変数を参照する条件分岐が追加されました。
変更前:
main() {
ensure_docker "$os"
fetch_latest_release
install_once "$arch"
run_once
}
変更後:
main() {
ensure_docker "$os"
fetch_latest_release
install_once "$arch"
if [ "${ONCE_INTERACTIVE:-}" = "false" ]; then
echo "once is installed. Run 'once' to get started."
return
fi
run_once
}
ONCE_INTERACTIVE=false が設定されている場合、インストール完了のメッセージを表示して return し、run_once の呼び出しをスキップします。非対話型インストールは以下のように実行できます:
curl https://get.once.com | ONCE_INTERACTIVE=false sh
${ONCE_INTERACTIVE:-} というシェル展開を使用しているため、変数が未設定の場合は空文字列として扱われ、既存のデフォルト動作(TUIの起動)が維持されます。
設計判断
コマンドライン引数ではなく環境変数 ONCE_INTERACTIVE を使用する方式が採用されました。
curl ... | sh というパイプ経由のインストール形式では、コマンドライン引数をスクリプトに渡すのが難しいため、環境変数による制御は自然な選択です。変数名は ONCE_ というプロジェクト固有のプレフィックスを持ち、他のツールとの衝突を避ける命名になっています。= "false" という文字列比較により、変数未設定・空文字列・"true" のいずれの場合も従来の対話モードにフォールバックする安全な実装です。
まとめ
6行の追加という最小限の変更で、インストーラーにCI/CD対応の非対話型モードが加わりました。シェルの変数展開の慣用的な書き方と環境変数による制御を組み合わせることで、後方互換性を完全に維持しつつDevOpsワークフローへの統合障壁を取り除いた、実用的かつ堅実な実装といえます。