Distribuir Bancada.app pré-compilado via GitHub Releases
Contexto
Bancada.app (e o binário ./Bancada) são artefatos de build, ignorados no .gitignore do repositório — por isso todo mundo que clona a Bancada tem que rodar ./build.sh antes de ter um app funcionando. Isso já pegou dois colaboradores (Cauê e Júlia) que clonaram o repo e não encontraram o executável.
A correção imediata (documentar o ./build.sh mais cedo no README) resolve o "não sabia que precisava buildar", mas não elimina o passo em si. Esta tarefa vai além: publicar o Bancada.app já compilado como asset de uma GitHub Release, para que novos colaboradores possam baixar o app pronto em vez de compilar localmente.
Trade-off já identificado na conversa: isso troca "5 min de build local" por manutenção de CI/release, e não resolve sozinho o aviso do Gatekeeper (app não assinado por conta de desenvolvedor Apple) — cada download ainda vai pedir o "Abrir" manual na primeira vez.
Feito quando
- ✓Decidido o gatilho da release: tag
v*, comworkflow_dispatchjunto para disparar sem criar tag à mão. Release é decisão deliberada, e runner macOS em repositório privado conta minutos a 10x — push emmaingastaria isso a cada commit. - ✓Workflow criado em
.github/workflows/release.yml:swift test,swift build -c release --arch arm64 --arch x86_64,scripts/empacotar-app.sheditto -c -k --keepParentpara o.zipdo bundle. Não chamabuild.sh— o build local segue arm64 e intocado; o empacotador ganhouBANCADA_BINARIOeBANCADA_VERSAOopcionais, com os padrões de antes. - ✓Release de teste publicada e validada. Publicada:
v0.1.0, run verde em 1m27s. Validado por Fabrício: asset universal (lipo→x86_64 arm64), versão0.1.0noInfo.plist, assinatura ad-hoc íntegra (codesign --verify --deep --strict), e o binário do bundle baixado lê o vault (--verificarsai 0). Com quarentena simulada,spctlresponderejected— o bloqueio que o README manda contornar. Validado por Cauê, em máquina diferente da que compilou: baixado comgh release downloadnuma pasta isolada, quarentena simulada comxattr -w com.apple.quarantine, mesmos cinco resultados reproduzidos (lipo, versão,codesign,spctl rejected,--verificarconsistente contra o vault emRepositórios/doc-harness) — fecha o item. - ✓
README.mdreescrito: "Começando" abre pelo download da Release, o build local virou o caminho de quem contribui, e entrou uma seção de como publicar versão nova. - ✓Decisão registrada, no README e na mensagem do commit: fica sem assinatura de Developer ID por ora. O app circula entre cinco pessoas, e certificado + senha de app no CI custaria mais do que os dois cliques que pouparia uma vez por pessoa. Revê-se se a Bancada sair da equipe.
Notas
- Tarefa compartilhada entre Fabrício e Cauê.
- Depende do estado atual de
build.shescripts/empacotar-app.sh(não alterar o comportamento do build local sem necessidade — só adicionar a distribuição por cima).
O que apareceu no caminho
- A detecção do vault vizinho não funcionava fora do terminal.
EstadoDaBancada.vaultVizinho()partia deFileManager.default.currentDirectoryPath, e um app aberto pelo Finder herda/como diretório de trabalho — então o duplo clique já não achava odoc-harnessantes desta tarefa; só o./Bancadado terminal achava. Agora parte deBundle.main.bundleURLe sobe até três níveis, com o cwd como último candidato. Um app em/Applicationscontinua sem vizinho, e isso é o esperado: cai no seletor de pasta, uma vez, e o caminho fica salvo. - O repositório é privado, então o asset só baixa autenticado —
gh release downloadou navegador logado com acesso àBlendOps. Serve para a equipe; quem está fora continua no site estático, como já era o plano. - O Gatekeeper mudou. O README mandava clicar com o botão direito e escolher "Abrir", atalho que o macOS 15 removeu para apps não assinados. O caminho atual é Ajustes do Sistema → Privacidade e Segurança → "Abrir Mesmo Assim", e é o que está documentado agora.
- O push exigiu o escopo
workflowno token dogh(gh auth refresh -h github.com -s workflow). Quem for mexer no workflow depois vai esbarrar no mesmo bloqueio.