Skip to content

Atualização automática a partir das releases do GitHub - #7

Merged
blackfoxsoftware merged 1 commit into
devfrom
feat/auto-updater
Sep 2, 2026
Merged

Atualização automática a partir das releases do GitHub#7
blackfoxsoftware merged 1 commit into
devfrom
feat/auto-updater

Conversation

@blackfoxsoftware

Copy link
Copy Markdown
Owner

O que muda

O app instalado passa a se atualizar sozinho a partir das releases deste repositório: checa ao abrir e a cada 6 h, baixa em segundo plano e aplica quando o app fecha. Nada é interrompido no meio do caminho.

O comportamento depende de como o app foi instalado:

Situação O que acontece
Instalado pelo setup Checa, baixa e aplica ao fechar. Dá para aplicar na hora pela aba Sistema.
Portátil Checa, avisa e leva para a release — trocar o .exe é de quem usa.
Rodando do código-fonte Desligado: não há instalação para atualizar por cima.

Só versões estáveis contam. Um 0.4.0-rc.1 continua publicado, mas o updater o ignora.

Como fica testável

O updater virou a quinta fronteira injetável do processo main, com dublê de demonstração: o ciclo inteiro roda em milissegundos, nos três modos, e com falha injetável por canal (WSLC_UI_MOCK_UPDATE, WSLC_UI_MOCK_FAIL=updates:check,updates:download). Sem isso a tela só existiria de verdade numa release já publicada — tarde demais para descobrir que está errada.

  • 15 testes de unidade no núcleo de estados (sem Electron, sem rede)
  • 5 no store da UI (o aviso sai por transição, não por evento — senão o download vira cascata de toasts)
  • 8 E2E cobrindo os três modos e os dois caminhos tristes
  • a fumaça do app empacotado confere que o app-update.yml foi embutido

O detalhe que não é óbvio

Sem o latest.yml anexado à release, a versão fica completa para quem baixa à mão e invisível para quem já tem o app instalado. É uma falha silenciosa que só apareceria uma versão depois, então o job de empacotamento falha se o arquivo não existir.

E instalar não é um quitAndInstall seco: o app encerra a sessão nativa antes de entregar o processo ao instalador. O NSIS fecha quem demora, e um processo morto assim deixa a sessão "WslcUi" órfã no WSL.

Aviso sobre esta versão

A 0.3.0 é a primeira que traz o updater. Quem estiver na 0.2.0 precisa instalá-la à mão — a partir dela, a atualização é automática.

Verificado nesta máquina

  • npm run check — 330 testes de unidade, typecheck, lint e formatação
  • npx playwright test — 163 E2E
  • npm run dist + fumaça no .exe empacotado: latest.yml gerado com o instalador (o portátil fica de fora, como deve), app-update.yml embutido apontando para este repositório
  • modo portátil confirmado num build de verdade, não só no teste da função

O app instalado passa a checar ao abrir e a cada 6 h, baixar em segundo plano e
aplicar a versão nova quando o app fecha. O portátil só avisa e leva para a
release, porque não há instalação para atualizar por cima. Rodando do
código-fonte o updater fica desligado.

O estado mora no processo main e chega à UI por evento: um download leva
minutos, e perguntar de tempos em tempos daria uma tela sempre atrasada. As
transições ficam em services/updater/state.ts, sem Electron e sem rede, com as
três regras que sustentam o resto: sem updater, evento nenhum mexe no estado;
erro DEPOIS de uma versão baixada não apaga a versão baixada, que continua no
disco e vai ser instalada ao fechar; e falha no download preserva a versão
encontrada, que é o que permite oferecer o caminho manual.

O updater virou a quinta fronteira injetável do processo main, com dublê de
demonstração. O ciclo inteiro — achar, baixar, instalar — roda em
milissegundos, nos três modos e com falha injetável por canal. Sem isso a tela
só existiria de verdade numa release já publicada, tarde demais para descobrir
que está errada.

Instalar pela aba Sistema encerra a sessão nativa ANTES de entregar o processo
ao instalador: o NSIS fecha quem demora, e um processo morto assim deixa a
sessão "WslcUi" órfã no WSL. Fechar a janela e instalar uma atualização passam
agora pelo mesmo desligamento ordenado, memoizado para rodar uma vez só.

O empacotamento passou a gerar o latest.yml, que é o índice que o updater lê, e
a embutir o app-update.yml, que é como o app sabe onde procurar. Sem o primeiro
a release fica completa para quem baixa à mão e invisível para quem já tem o
app instalado — falha silenciosa que só apareceria uma versão depois. Por isso
o job de empacotamento falha se ele não existir, e a fumaça confere o segundo.
@blackfoxsoftware
blackfoxsoftware merged commit 2d2cf7a into dev Sep 2, 2026
3 checks passed
@blackfoxsoftware
blackfoxsoftware deleted the feat/auto-updater branch September 2, 2026 02:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant