Skip to content

feat(macos): rFirma se actualiza sola en macOS - #2039

Merged
sgomez merged 2 commits into
agent/developer/spec-2000from
agent/developer/issue-2024
Oct 19, 2026
Merged

sgomez merged 2 commits into
agent/developer/spec-2000from
agent/developer/issue-2024

Conversation

@sgomez

@sgomez sgomez commented Oct 19, 2026

Copy link
Copy Markdown
Owner

Closes #2024

What changed

  • Canal propio de macOS (Channel::MacOs, etiqueta macos): antes macOS era Native y preguntaba a GitHub sin poder instalar. Ahora consulta https://rfirma.sgomez.me/macos/latest.json e instala desde la aplicación, como Windows. No mira nada de Homebrew: una instalación por el cask es el mismo canal y el actualizador sigue activo.
  • La comprobación de versión elige la entrada de su plataforma: en Windows y macOS, un latest.json solo anuncia versión si trae platforms["windows-x86_64"] o platforms["darwin-aarch64"] (Channel::updater_target). Para Windows el feed ya la traía, así que no cambia nada.
  • Instalador: tauri-plugin-updater también en macOS. packaging/macos/tauri.macos.json lleva su endpoints y la misma pubkey que Windows. Tras instalar, en macOS se pide reiniciar (request_restart), porque la .app nueva no corre hasta relanzarla. En Windows el NSIS ya cierra rFirma.
  • Entrega: just bundle en macOS deja al lado del .dmg un rfirma_<v>_aarch64.app.tar.gz sin firmar, y build.yml lo sube. packages-manifest.sh lo registra como formato updater y su .sig como minisign; packages no lo lista, porque verifica-contenido.sh no sabe abrirlo. sign-updater.sh firma también los .app.tar.gz y comprueba cada firma contra la pública de su plataforma. build-tree.sh sirve /macos/ con la actualización y la .sig de cada versión estable que la trae, y escribe un latest.json con la entrada darwin-aarch64 de la más alta. El Caddyfile sirve /macos/*.
  • Documentación que el cambio contradecía: la tabla de rutas del ADR-0015 (/macos/) y «La clave de actualizaciones de Windows» de packaging/repo/README.md, porque la pública ya no está en un solo sitio.

Decisiones ante lo ambiguo:

  • Un latest.json propio en /macos/ y no la entrada darwin-aarch64 dentro de /windows/latest.json: las versiones anteriores a macOS no tienen actualización de macOS y cada feed anuncia su última versión. Si ninguna estable trae la de macOS, build-tree.sh no escribe macos/latest.json y no falla.
  • La CA local de macOS sigue con la marca native (mark_of(Channel::MacOs)) para no regenerar la CA que ya está instalada.
  • update_destination_for(MacOs) apunta a releases, como hacía antes macOS con Native.
  • El auto_updates: true del cask queda para El tap de Homebrew instala rFirma y se actualiza solo #2023 (el tap) y la prueba manual N→N+1 para Validar a mano la actualización N→N+1 en macOS #2025.

Para quien construya en paralelo: con este cambio, Channel::detected() devuelve MacOs en macOS, no Native. Al vigilante de lectores (#2009) le toca comprobar Channel::MacOs en watches_the_readers y no Channel::Native. En esta rama, Platform::MacOs => false sigue igual.

Test plan

  • La comprobación de versión elige la entrada darwin-aarch64: on_macos_the_darwin_aarch64_entry_of_latest_json_is_announced_and_installable y a_latest_json_without_the_entry_of_this_platform_announces_nothing. Las vi en rojo primero.
  • Una instalación por Homebrew no desactiva el actualizador: macos_is_its_own_channel_whatever_the_marker_says, a_homebrew_installation_does_not_turn_off_the_updater y windows_and_macos_install_from_the_app_and_linux_does_not. Las vi en rojo primero.
  • macOS pregunta a su feed: each_channel_asks_its_own_feed, vista en rojo primero. the_installer_of_each_platform_asks_the_same_feed_as_the_version_check la vi en rojo rompiendo a propósito el endpoint de tauri.macos.json. windows_and_macos_trust_the_same_update_key vigila que las dos configuraciones lleven la misma pública.
  • La entrega publica el paquete de actualización: los casos de macOS de scripts/tests/packages_manifest_test.sh, vistos en rojo primero. Para que corriera en macOS añadí tr -d ' ' a dos wc -l que ya estaban.
  • La entrega lo firma: en packaging/windows/sign-updater.test.sh, el caso «sin clave pública de macOS», visto en rojo contra el script anterior. El caso de la firma de verdad (con-macos) necesita minisign, que no tengo en local: lo corre el CI.
  • Y lo sirve: packaging/repo/build-tree.test.sh. En local solo pude correr la parte de build-tree.sh que no necesita herramientas, con un find de prueba: «actualización de macOS sin .sig» y «el manifiesto nombra lo que no está» paran la publicación. Los casos de /macos/ y su latest.json necesitan ostree y el resto de herramientas (y gpg, que el arnés necesita para crear la clave): los corre el CI.
  • just bundle en macOS con el .app.tar.gz no lo he corrido en local (necesita la .dylib de GraalVM): lo valida el carril de macOS de la entrega. La sustitución de la .app por el updater se prueba a mano en Validar a mano la actualización N→N+1 en macOS #2025.
  • macos_keeps_marking_its_local_ca_as_native guarda el comportamiento que ya había. Pasó a la primera porque fija una rama de un match, no una conducta nueva.

Sergio Gómez Bachiller added 2 commits October 19, 2026 16:48
Implements #2024: rFirma se actualiza sola en macOS
- Canal propio `Channel::MacOs`: lee /macos/latest.json y exige su entrada darwin-aarch64
- El plugin updater también en macOS, con la misma pública minisign que Windows
- La entrega empaqueta, firma y sirve el .app.tar.gz en /macos/ con su latest.json
@sgomez
sgomez marked this pull request as ready for review October 19, 2026 14:51
@sgomez
sgomez merged commit 7b0b664 into agent/developer/spec-2000 Oct 19, 2026
@sgomez
sgomez deleted the agent/developer/issue-2024 branch October 19, 2026 14:51
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