Skip to content

ci(macos): El CI de macOS instala y desinstala el cask con el paquete recién construido - #2062

Merged
sgomez merged 3 commits into
mainfrom
agent/issue-2060-ci-macos-cask-install
Oct 20, 2026
Merged

sgomez merged 3 commits into
mainfrom
agent/issue-2060-ci-macos-cask-install

Conversation

@sgomez

@sgomez sgomez commented Oct 20, 2026 •

Copy link
Copy Markdown
Owner

Closes #2060

What changed

  • Job verify-cask en build.yml (macos-15, tras el job macos) que ejecuta packaging/macos/verify-cask.sh con el .dmg de just bundle. El script crea un tap local de usar y tirar (brew tap-new --no-git), copia el cask del tap público con version, sha256 y url (file://) reescritos, instala, comprueba /Applications/rfirma.app y --version, desinstala y comprueba que desaparece. collect-packages depende de él.
  • build-tree.sh copia a /macos/ el .dmg de cada versión estable que lo trae, para que la web lo descargue del servidor propio (docs(web): la web y el manual explican cómo instalar rFirma en macOS #2061). Va aquí y no en docs(web): la web y el manual explican cómo instalar rFirma en macOS #2061 porque publish.yml construye el árbol con el build-tree.sh de main.

Test plan

  • Instala con el .dmg local, arranca y desinstala; no toca el tap — packaging/macos/verify-cask.test.sh (brew simulado); añadido a just test-scripts.
  • Ejecución real con brew 7: build.yml en esta rama (run 39400730001), todos los jobs en verde.
  • build-tree.test.sh: /macos/ trae el .dmg de cada versión que lo tiene, y no uno fuera del manifiesto — lo corre el CI de Linux.

Implements #2060: El CI de macOS instala y desinstala el cask con el paquete recién construido
- tap local de usar y tirar con el cask del tap reescrito a file://, sin escribir en el tap real

@sgomez sgomez left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

NEEDS_FIXES

Alcance: completo (primera revisión), contra origin/main, head 38cc4327. Especificación: #2060 (TD-139, ID-553). Checks todavía en curso en 38cc4327: Plataformas / macOS, Plataformas / Windows, Cadena TypeScript, Cadena Java, Cadena Rust, Imagen nativa, Analyze (python), Analyze (java-kotlin). Ninguno de ellos ejecuta build.yml: el paso nuevo solo corre con la etiqueta preview o en release.yml, así que el CI de esta PR no lo prueba.

[blocking]

  • .github/workflows/build.yml:269: el job macos corre en macos-14 (Sonoma) y el cask del tap declara depends_on macos: :sequoia. Con eso, brew install --cask se niega en ese runner («This software does not run on macOS versions older than Sequoia») antes de llegar a /Applications, y aunque se saltara esa comprobación, la .app exige minimumSystemVersion 15.4 (ADR-0040) y no arrancaría. El paso falla siempre, y como solo corre en build.yml, lo primero que rompería es la Release (el job macos cae y collect-packages no corre). Arreglo: ejecutar la verificación en macos-15 (arm64). La forma menos invasiva es un job aparte en macos-15 que descargue el artefacto bundle-macos y ejecute verify-cask.sh, del que dependa collect-packages; así el runner de compilación y la caché que calienta warm-release-cache.yml no cambian. Antes del merge, una pasada con la etiqueta preview para ver el paso en verde con brew real.

[fix]

  • packaging/macos/verify-cask.sh:37: Homebrew 7 pone siempre la cuarentena (ID-553), y la app no va firmada por Apple. Lanzar el binario en cuarentena depende de cómo tenga Gatekeeper el runner: con la evaluación activa, se mata el proceso o se queda esperando un diálogo que nadie va a ver. Antes de --version, ejecutar xattr -c "$app", que es justo lo que los caveats del cask piden a la persona usuaria; así la prueba sigue su mismo camino.
  • packaging/macos/verify-cask.test.sh:33: no se comprueba que el script lance --version. Si quitas la línea 37 de verify-cask.sh, la prueba sigue pasando, aunque el plan de pruebas dice que cubre «arranca». Haz que el rfirma de mentira deje constancia de sus argumentos (p. ej. echo "$*" > "$FAKE_LAUNCH_LOG") y comprueba que han sido --version.

[note]

  • El tap nunca se escribe: el cask se lee por curl de raw.githubusercontent.com y se copia a un tap --no-git de usar y tirar, que se retira con el trap. Cumple el tercer criterio.
  • file:// y sha256 reescritos: el sed solo toca url "…" (no la url :url del livecheck), y Homebrew acepta file:// en brew install --cask. Las demás piezas (glob del .dmg, igual que la subida del artefacto; /Applications escribible por el usuario administrador del runner) están bien.
  • Reescribir version a "0.0.0" sobra ahora que el url es fijo; cuando el tap tenga una versión de verdad, el cask instalado mostrará 0.0.0. No hace daño.
  • El cuerpo de la PR dice que la prueba se añade a just test-scripts; en realidad va en check-repo.

Comment thread .github/workflows/build.yml Outdated
run: just bundle

- name: Instala y desinstala el cask con ese .dmg
run: packaging/macos/verify-cask.sh rfirma-app/src-tauri/target/aarch64-apple-darwin/release/bundle/dmg/*.dmg

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

[blocking] Este job corre en macos-14 (Sonoma) y el cask del tap declara depends_on macos: :sequoia: brew install --cask se niega aquí, y la .app pide además minimumSystemVersion 15.4 (ADR-0040). El paso falla siempre, y como build.yml solo corre con preview o en la Release, lo primero que rompería es la Release. Lleva la verificación a macos-15: un job aparte que descargue bundle-macos y ejecute verify-cask.sh, del que dependa collect-packages. Así no cambian el runner de compilación ni la caché de warm-release-cache.yml. Antes del merge, pásala con la etiqueta preview.

brew install --cask "$tap/rfirma"
app="$applications/rfirma.app"
[ -d "$app" ] || { echo "$app no existe tras instalar" >&2; exit 1; }
"$app/Contents/MacOS/rfirma" --version

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

[fix] Homebrew 7 pone siempre la cuarentena (ID-553) y la app no va firmada por Apple, así que lanzar este binario depende de cómo tenga Gatekeeper el runner. Ejecuta antes xattr -c "$app", lo mismo que los caveats del cask piden a la persona usuaria.

Comment thread packaging/macos/verify-cask.test.sh Outdated
install)
cp "$FAKE_REPO/Casks/rfirma.rb" "$FAKE_INSTALLED_CASK"
mkdir -p "$APPLICATIONS_DIR/rfirma.app/Contents/MacOS"
printf '#!/bin/sh\necho "rfirma 1.0.0"\n' > "$APPLICATIONS_DIR/rfirma.app/Contents/MacOS/rfirma"

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

[fix] Si quitas el --version de verify-cask.sh, la prueba sigue pasando. Haz que este rfirma de mentira guarde sus argumentos (p. ej. echo "$*" > "$FAKE_LAUNCH_LOG") y comprueba que han sido --version.

@sgomez
sgomez marked this pull request as ready for review October 20, 2026 10:08
@sgomez
sgomez merged commit 09a04f1 into main Oct 20, 2026
15 checks passed
@sgomez
sgomez deleted the agent/issue-2060-ci-macos-cask-install branch October 20, 2026 10:08
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.

El CI de macOS instala y desinstala el cask con el paquete recién construido

1 participant