Skip to content

置き換えた App が起動できなかった場合に自動で巻き戻す #53

Description

@limit7412

何が起きるか

更新の適用は、展開した一式を正規の位置へ入れ替えて App を起動し直すところで終わる。起動し直した App が立ち上がったかどうかは見ていない。

立ち上がらない一式が入ると、利用者は App を開けなくなる。退避した .old は残っているが(後始末はウィンドウを立てられた後に行うため)、戻す経路が無い。手で app.oldapp へ戻す必要がある。

どういう一式で起きるか

配布 ZIP が壊れている場合である。digest が保証するのは「公開されている配布物そのものを取れたこと」までで、中身が起動できることではない。

#48 では、正規の位置へ触る前に下記を確かめるようにした。

  • app / cli のディレクトリ
  • app / cli の実行ファイル (.exe) と本体アセンブリ (.dll)
  • 展開した app の埋め込み版が記録のタグと一致すること

ただし配布は自己完結・複数ファイルであり、起動には他にも hostfxr.dll などのランタイムが要る。必須ファイルを名前で数え上げていく方針だと、この一覧は数百件あり、増えるたびに追随しなければならない。そもそも「起動できるか」を名前の一覧で近似していること自体に無理がある。

起動し直した App を、更新ヘルパが起こした後に数秒見る(#48 で更新ヘルパ自身に対して行っているのと同じ形)。その間に落ちていたら、退避した .old を正規の位置へ戻し、staged を捨てて旧版を起動し直す。

必要なもの。

  • UpdateInstaller に「適用済みの入れ替えを戻す」経路。いまの RollbackSwapped は適用の途中の失敗にしか使えない
  • ヘルパ側で、起動し直した App の生存を見る区間
  • 戻せなかった場合の扱い。UpdateRollbackException と同じく、壊れた一式を起動し直そうとしない

なぜ別立てにするか

適用の後半の流れを変えるうえ、Linux では実機で確かめられない。#48 の検証(テスト版プレリリースでの実機確認)を経て、置き換えそのものが期待どおり動くことを見てから入れたい。

前提

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions