Auto-atualização pelo canal oficial (Releases do GitHub) - #12
Merged
Conversation
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>
There was a problem hiding this comment.
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
ServicoAtualizacaocom abstrações testáveis (IAtualizadorLocal/IConsultorReleases) e integrações concretas com Velopack e API de Releases do GitHub. - Exibe um
OmniBannernoLogViewercom 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 on lines
+61
to
+64
| services.AddSingleton<IAtualizadorLocal, AtualizadorVelopack>(); | ||
| services.AddSingleton<IConsultorReleases>( | ||
| _ => new ConsultorReleasesGithub(ConsultorReleasesGithub.CriarCliente())); | ||
| services.AddSingleton<ServicoAtualizacao>(); |
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:
O que muda
Serviço —
ServicoAtualizacaodecide o caminho;AtualizadorVelopackeConsultorReleasesGithubsão as duas pontas concretas, ambas atrás de interface para o serviço ser testável sem instalar nada nem tocar a rede.UI —
OmniBannerno 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ãocontents: writesó nele) comvpk 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
1.3.0.0) e a tag do release, três (v1.3.0) — eVersionconsidera1.3.0 < 1.3.0.0, o que anunciaria "versão nova" a cada abertura, para sempre.Setup.exe(65,7 MB),Portable.zip,.nupkgereleases.win.jsongerados — e ovpkconfirmou o hook (Verified VelopackApp.Run() in ... Program::Main).Notas ao revisor
VelopackApp.Build().Run()é a primeira linha doMain, 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.AbrirUrlaceita apenas http/https. O endereço vem de uma resposta de API, eUseShellExecutecom string arbitrária executaria um caminho local como programa.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