環境変数でインタラクティブモードをスキップできる非対話型インストールオプションを追加

basecamp/once

ONCEのインストーラーに ONCE_INTERACTIVE=false オプションが追加され、TUIの起動をスキップした非対話型インストールが可能になりました。これにより、AnsibleなどのCI/CDパイプラインや構成管理ツールからの自動インストールが容易になります。

背景

これまでONCEのインストーラーはインストール完了後に必ず TUI(ターミナルUI) を起動する run_once ステップが実行されており、非対話型環境での自動インストールを公式にサポートする方法がありませんでした。#15 では、AnsibleによるONCEの自動インストールを試みたユーザーから、インタラクティブなプロンプトが手動介入を要求するため、CI/CDパイプラインや構成管理スクリプトへの組み込みが困難であるという問題が報告されていました。

この変更は、DevOpsワークフローや自動サーバープロビジョニングへの統合を公式にサポートする形で、その問題を解決します。

技術的な変更

installer/templates/install.shmain() 関数内に、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ワークフローへの統合障壁を取り除いた、実用的かつ堅実な実装といえます。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
025e7712

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
4回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)→セクション群(各論)→まとめ(結論)の3部構成が明確で、必須要素(背景、技術的変更)と任意要素(設計判断)がすべて含まれています。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(sh:installer/templates/install.sh)およびGitHubのPR・Issueへのリンク記法は正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

CI/CDやシェルスクリプトに関する知識を持つエンジニアを対象としており、専門用語のレベルや説明の粒度が適切です。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論→各論の構成になっており、各段落はトピックセンテンスで始まり、1段落1トピックの原則が守られています。可読性が非常に高いです。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内のコードブロックは、提供されたDiff情報を正確に反映しており、変更前後のコード比較も適切です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「TUI」「CI/CD」「シェル展開」などの技術用語が文脈に応じて正しく使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

環境変数の動作やシェルパラメータ展開(`${VAR:-}`)に関する技術的な説明は正確かつ論理的です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事の主張はすべてPRのタイトル、Description、Diff内容、および関連するIssueから裏付けられており、ハルシネーションは検出されませんでした。「設計判断」の解説も、PRの実行例から導かれる技術的に自明な内容であり、許容範囲です。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#27)、Issue番号(#15)、環境変数名(ONCE_INTERACTIVE)などの固有名詞はすべて正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトルはPRのタイトル「Add non-interactive option to installer」の内容を忠実に反映しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事には、PR情報に基づかないバージョン情報やリリース予定などの外部知識は含まれていません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「追加され」「これまで」といった時間表現は、PRが既にマージされた変更であることを正しく反映しています。