Atualização pelo próprio app (Tauri updater) com cartão de aviso

Ao abrir, o app consulta o latest.json da release no GitHub; havendo versão nova, um cartão
oferece Atualizar agora: baixa, confere a assinatura com a chave pública embutida, instala e
reabre (AppImage substituído no lugar; Windows e macOS pelo instalador). Instalação por .deb ou
.rpm só avisa. Configurações ganha a opção de desligar a consulta e o botão Verificar agora.

A release assina os pacotes com a chave guardada no ambiente 'release' do GitHub (só tags v*) e
o latest.json é montado de uma vez por scripts/make-latest-json.py, depois que todos os jobs
de empacotamento terminam.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Lucas RayanandClaude Sonnet 5.5 committed 2026-10-23 10:51:30 -03:00
1 parent 17b0e89e03
commit daa12ba117
20 files changed
+341 -7

No files matched your search

+46
View File
@@ -0,0 +1,46 @@
#!/usr/bin/env python3
"""Teste de scripts/make-latest-json.py: python3 scripts/test_make_latest_json.py"""
import importlib.util
import os
import unittest
spec = importlib.util.spec_from_file_location("m", os.path.join(os.path.dirname(__file__), "make-latest-json.py"))
m = importlib.util.module_from_spec(spec)
spec.loader.exec_module(m)
BASE = "https://github.com/x/y/releases/download/v1.3.0/"
def assets(version="1.3.0"):
names = [p.format(v=version) for _, p in m.PLATFORMS]
return {n: (BASE + n, f"assinatura-de-{n}\n") for n in names}
class LatestJson(unittest.TestCase):
def test_all_platforms_and_variants(self):
d = m.build("1.3.0", "### Novidades\n", assets(), "2026-10-23T12:00:00Z")
self.assertEqual(d["version"], "1.3.0")
self.assertEqual(d["notes"], "### Novidades")
p = d["platforms"]
for k in ("linux-x86_64", "linux-x86_64-appimage", "windows-x86_64", "windows-x86_64-nsis",
"windows-x86_64-msi", "darwin-aarch64", "darwin-x86_64"):
self.assertIn(k, p)
# a chave genérica do Windows aponta para o instalador NSIS, não para o MSI
self.assertTrue(p["windows-x86_64"]["url"].endswith("x64-setup.exe"))
self.assertTrue(p["windows-x86_64-msi"]["url"].endswith(".msi"))
self.assertEqual(p["linux-x86_64"]["signature"], "assinatura-de-Guara_1.3.0_amd64.AppImage")
def test_missing_package_is_left_out(self):
a = assets()
del a["Guara_1.3.0_x64.app.tar.gz"]
d = m.build("1.3.0", "", a, "2026-10-23T12:00:00Z")
self.assertNotIn("darwin-x86_64", d["platforms"])
self.assertIn("darwin-aarch64", d["platforms"])
def test_other_versions_do_not_leak(self):
d = m.build("1.3.0", "", assets("1.2.0"), "2026-10-23T12:00:00Z")
self.assertEqual(d["platforms"], {})
if __name__ == "__main__":
unittest.main()