環境変数でONCEの自動セルフアップデートを無効化できるようになった

basecamp/once

環境変数 ONCE_NO_SELF_UPDATE を設定することで、ONCEの自動セルフアップデート機能を無効化できるようになりました。

背景

ONCEはバックグラウンドで自身のアップデートを定期的にチェックし、自動適用する仕組みを持っています。しかしCI環境や特定の運用シナリオでは、この自動更新を抑制したいケースがあります。これまでは自動セルフアップデートを止める手段が提供されておらず、環境変数による制御が本PRで追加されました。

技術的な変更

internal/background/runner.gocheckSelfUpdate 関数の先頭に、環境変数チェックが追加されました。

変更前:

func (r *Runner) checkSelfUpdate(ctx context.Context, ns *docker.Namespace, state *docker.State) bool {
    if !state.SelfUpdateDue() {
        return false
    }

変更後:

func (r *Runner) checkSelfUpdate(ctx context.Context, ns *docker.Namespace, state *docker.State) bool {
    if os.Getenv("ONCE_NO_SELF_UPDATE") != "" {
        return false
    }

    if !state.SelfUpdateDue() {
        return false
    }

ONCE_NO_SELF_UPDATE に空文字列以外の任意の値がセットされていれば、state.SelfUpdateDue() の評価より先に false を返します。これにより、アップデート期日の判定やその後の処理がすべてスキップされます。

設計判断

環境変数の存在チェック(空文字列以外) という慣用的なUnixスタイルが採用されています。

値の内容を問わず「セットされているか否か」だけを判定するため、ONCE_NO_SELF_UPDATE=1ONCE_NO_SELF_UPDATE=true など任意の文字列で無効化できます。チェックは checkSelfUpdate の最上位に置かれており、アップデート期日の評価やDocker操作といった後続処理への到達を完全に遮断します。このアーリーリターンのパターンは、既存の !state.SelfUpdateDue() チェックと構造的に一貫しています。

まとめ

5行の追加という最小限の変更で、自動セルフアップデートの制御手段が追加されました。既存のアップデートロジックには一切手を加えず、環境変数による早期脱出を先頭に差し込む構造は、機能の無効化を安全かつ明快に実現するシンプルな設計判断です。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
542e602b

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

「リード文→背景→技術的な変更→設計判断→まとめ」という総論→各論→結論の構成が明確に守られています。各セクションの役割が果たされており、非常に分かりやすいです。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライト(```go:internal/background/runner.go)およびPR番号のリンク記法([PR #31](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

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

環境変数、Goのコード、CI環境といったトピックは専門知識を持つエンジニアを対象としており、内容や表現のレベルが適切です。

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

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

各セクション、各パラグラフが「総論→各論」の構造で書かれており、トピックセンテンスが明確です。1段落1トピックの原則も守られており、可読性が高いです。

Diff内容との照合 ✓ PASS

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

記事内のコードブロック(変更前・変更後)は、提供されたDiffの内容を正確に反映しています。ファイル名も一致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「環境変数」「CI環境」「アーリーリターン」などの技術用語が文脈に応じて正確に使用されています。

説明の技術的正確性 ✓ PASS

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

環境変数の有無をチェックして早期リターンするというコードの挙動について、技術的に正確かつ論理的に説明されています。

事実の突合 ⚠ WARNING

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

背景セクションで言及されている「CI環境」という具体的なユースケースは、PR Descriptionが空であるため、PR情報からは直接裏付けが取れない推測です。ただし、この種の機能の典型的なユースケースであり、悪意のある創作ではありません。

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

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

PR番号「#31」が正確に記載・リンクされています。

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

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

記事のタイトルは、PRのタイトル「Allow disabling automatic self-update with env」の内容を忠実に反映しています。

外部知識の正確性 ✓ PASS

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

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

時間表現の正確性 ✓ PASS

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

「〜できるようになった」という表現は、このPRによって機能が追加された事実を正確に反映しており、時間表現に問題はありません。