Skip to content

Auto-atualização pelo canal oficial (Releases do GitHub) - #12

Merged
afernandes merged 1 commit into
mainfrom
feat/auto-update-github
Aug 4, 2026
Merged

Auto-atualização pelo canal oficial (Releases do GitHub)#12
afernandes merged 1 commit into
mainfrom
feat/auto-update-github

Conversation

@afernandes

Copy link
Copy Markdown
Owner

Por quê

O pacote da Microsoft Store passa por análise e sai dias depois do GitHub. Este PR torna os Releases do GitHub o canal oficial: quem instalou por lá se atualiza sozinho, e quem veio da Store é avisado assim que a versão nova é publicada aqui.

A restrição que define o desenho

Um MSIX da Store é re-assinado pela Microsoft (CN=495F8198-…); um pacote assinado localmente tem outro publisher. Publisher diferente → identidade de pacote diferente → o Windows trata como dois aplicativos distintos, e nenhum atualiza o outro. Não existe, portanto, um binário que se atualize pelos dois canais.

O que existe — e é o que este PR faz — é um aplicativo que detecta como foi instalado e age de acordo:

Origem Comportamento Botão da faixa
Setup do GitHub baixa em segundo plano, aplica ao reiniciar Reiniciar agora
Microsoft Store apenas avisa (quem atualiza é a Store) Ver no GitHub
Executável avulso apenas avisa Ver no GitHub

O que muda

ServiçoServicoAtualizacao decide o caminho; AtualizadorVelopack e ConsultorReleasesGithub são as duas pontas concretas, ambas atrás de interface para o serviço ser testável sem instalar nada nem tocar a rede.

UIOmniBanner no mesmo padrão da faixa de aplicativo padrão (o componente da lib já lista "update-available" como caso de uso). Dispensável, e a verificação roda a cada abertura, então a faixa reaparece na próxima sessão se a versão continuar disponível.

Quando roda — depois do primeiro render, sem await. Nunca no caminho de abertura: é chamada de rede, e o aplicativo tem que abrir igual com ou sem internet. Falha de rede não produz nada além de uma linha no log.

Workflow — job novo github (permissão contents: write só nele) com vpk pack + vpk upload. Nenhum release tinha asset até agora — o artefato do Actions expira em 90 dias e exige login, então não servia como fonte de atualização nem como download público.

Build do canal oficial sai sem PublishSingleFile — o Velopack monta o update comparando arquivo a arquivo; num executável único qualquer mudança reescreve o binário inteiro e todo update baixaria ~150 MB em vez do diff. O single-file continua valendo para o zip avulso.

Validação

  • 541 testes (26 novos). O mais importante cobre a normalização de versão: o assembly tem quatro partes (1.3.0.0) e a tag do release, três (v1.3.0) — e Version considera 1.3.0 < 1.3.0.0, o que anunciaria "versão nova" a cada abertura, para sempre.
  • Empacotamento verificado localmente: Setup.exe (65,7 MB), Portable.zip, .nupkg e releases.win.json gerados — e o vpk confirmou o hook (Verified VelopackApp.Run() in ... Program::Main).

Notas ao revisor

  • VelopackApp.Build().Run() é a primeira linha do Main, antes do mutex de instância única: o instalador reexecuta o próprio executável e espera que ele saia; qualquer código antes disso rodaria durante a instalação.
  • ExploradorArquivos.AbrirUrl aceita apenas http/https. O endereço vem de uma resposta de API, e UseShellExecute com string arbitrária executaria um caminho local como programa.
  • O job da Store não mudou e segue independente — continua falhando no envio enquanto os secrets do Partner Center não existirem, o que é o combinado (upload manual).

Depois do merge

O fluxo passa a valer da próxima tag em diante. A v1.3.0 já publicada continua sem assets; a primeira release com instalador será a próxima.

🤖 Generated with Claude Code

O pacote da Microsoft Store passa por análise e sai dias depois do GitHub, que
agora é o canal oficial. A verificação roda a cada abertura, em segundo plano,
depois que a janela já apareceu — o aplicativo abre na mesma velocidade com ou
sem internet, e uma falha de rede não produz nada além de uma linha no log.

Quem instalou pelo Setup do GitHub baixa a versão nova e a aplica ao reiniciar
(Velopack). Quem veio da Store ou roda o executável avulso apenas recebe o
aviso, com link para o release: um MSIX da Store e um pacote assinado
localmente têm identidades diferentes, então nenhum dos dois pode substituir o
outro — quem atualiza a versão da Store é a própria Store.

A faixa segue o padrão da que avisa sobre o aplicativo padrão de .clef, com
"Reiniciar agora" quando o pacote já está pronto e "Ver no GitHub" quando não.

Também:
- release.yml ganha o job do canal oficial (vpk pack + upload). Nenhum release
  tinha asset até agora: o artefato do Actions expira em 90 dias e exige login,
  então não servia como fonte de atualização.
- O build do canal oficial sai SEM PublishSingleFile: num executável único
  qualquer mudança reescreve o binário inteiro e todo update baixaria ~150 MB
  em vez do diff.
- ExploradorArquivos.AbrirUrl aceita apenas http/https — o endereço vem de uma
  resposta de API e UseShellExecute executaria um caminho local como programa.

Validação: 541 testes (26 novos, incluindo a normalização de versão que evitaria
anunciar 1.3.0 como nova sobre 1.3.0.0) e empacotamento verificado localmente —
Setup.exe, Portable.zip, .nupkg e releases.win.json gerados, com o vpk
confirmando o hook do VelopackApp no Main.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Copilot AI lite review requested due to automatic review settings August 4, 2026 13:50

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Este PR torna os Releases do GitHub o canal “oficial” de atualização, adicionando um serviço de atualização que (a) faz auto-update via Velopack quando a instalação permite e (b) apenas avisa/encaminha para o release quando a instalação é via Microsoft Store ou executável avulso.

Changes:

  • Adiciona o serviço ServicoAtualizacao com abstrações testáveis (IAtualizadorLocal/IConsultorReleases) e integrações concretas com Velopack e API de Releases do GitHub.
  • Exibe um OmniBanner no LogViewer com CTA de Reiniciar agora (quando aplicável) ou Ver no GitHub (Store/portable).
  • Atualiza pipeline de release para anexar assets (Velopack) aos GitHub Releases e documenta o novo fluxo no README.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
test/ClefExplorer.Tests/ServicoAtualizacaoTests.cs Novos testes cobrindo regras de aviso/atualização, parsing/normalização de versão e validação de URL.
src/Services/ServicoAtualizacao.cs Serviço central que decide entre preparar atualização (Velopack) ou apenas avisar (GitHub API).
src/Services/InfoAtualizacao.cs DTOs e interfaces para desacoplar serviço de UI/rede/instalação e habilitar testes.
src/Services/ExploradorArquivos.cs Adiciona abertura segura de URL (somente http/https) para o CTA do banner.
src/Services/ConsultorReleasesGithub.cs Cliente da API do GitHub para ler o último release e interpretar tag_name/html_url.
src/Services/AtualizadorVelopack.cs Implementação Velopack do caminho “instalado pelo canal oficial”.
src/Program.cs Inicializa hooks do Velopack no Main e registra serviços de atualização no DI.
src/Components/LogViewer.razor UI do banner de atualização e disparo da verificação pós-primeiro-render.
src/ClefExplorer.csproj Adiciona dependência do Velopack.
README.md Atualiza instruções de download e explica diferenças entre instalador/portable/Store.
.github/workflows/release.yml Adiciona job de publicação no GitHub Releases com vpk pack/upload.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.


// --- Leitura da resposta do GitHub -------------------------------------------

private static JsonElement Json(string texto) => JsonDocument.Parse(texto).RootElement;
Comment thread src/Program.cs
Comment on lines +61 to +64
services.AddSingleton<IAtualizadorLocal, AtualizadorVelopack>();
services.AddSingleton<IConsultorReleases>(
_ => new ConsultorReleasesGithub(ConsultorReleasesGithub.CriarCliente()));
services.AddSingleton<ServicoAtualizacao>();
@afernandes
afernandes merged commit 76deb11 into main Aug 4, 2026
2 checks passed
afernandes added a commit that referenced this pull request Aug 4, 2026
Primeira versão com auto-atualização pelo canal oficial (PR #12): é a partir
deste release que os Releases do GitHub passam a ter instalador.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.

2 participants