Documentação
Compilações e lançamentos
Sidecars específicos de destino, ativos atualizadores assinados e um índice de lançamento publicado após os instaladores da plataforma.
Traduzido automaticamente do inglês. Ver o original em inglês
Modelo de distribuição
A compilação do desktop empacota um frontend Vite, um sidecar compilado em Bun e gerou migrações SQLite em um aplicativo Tauri. O repositório define compilações macOS Apple Silicon e Intel, Windows x64 e ARM64 e Linux x64 e ARM64. A automação de liberação é configurada em .github/workflows/release.yml; verificações de construção de plataforma também são executadas de forma independente por meio build-platforms.yml.
Uma definição de fluxo de trabalho descreve o processo de publicação. A disponibilidade e a validade de um instalador devem ser estabelecidas a partir de seus ativos específicos de execução e liberação. O código-fonte por si só não prova credenciais de assinatura, resultados de reconhecimento de firma ou instalação bem-sucedida em uma máquina de destino.
Construir pipeline
scripts/build.ts executa seis estágios ordenados e aborta quando um estágio falha:
- Instalar: instalação de frozen-lockfile, incluindo dependências opcionais para todos os sistemas operacionais e arquiteturas de CPU.
- Verificar: verificação de tipo do espaço de trabalho. Os testes de unidade são um comando CI separado.
- Compilar: construir o sidecar com
scripts/compile-sidecar.tspara o alvo Rust triplo. - Recursos: estágio
packages/db/drizzlecomo migrações agrupadas. - Pacote: construa o front-end e, em seguida, invoque o Tauri com configurações de destino, pacote, assinatura e atualizador.
- Artefatos: indexe ativos do instalador, escreva somas de verificação SHA-256 e gere notas de versão a partir do histórico do Git.
bun scripts/build.ts --help
bun scripts/build.ts --dry-run
bun run build:sidecar
bun scripts/build.ts --only=resources
bun scripts/build.ts --no-updater --only e --skip aceitar nomes artísticos; --target, --bundles, e --out-dir selecione saídas. O alvo padrão é o host relatado por rustc -vV. Binários sidecar são gravados em apps/desktop/src-tauri/binaries/sidecar-<triple>, com .exe no Windows. Binários idênticos e árvores de migração são mantidos inalterados para evitar reinicializações desnecessárias do desenvolvimento.
Usar compile-sidecar.ts através do pipeline: aplica as adaptações do pacote de host incorporado. Um comando de compilação genérico direto não representa o mesmo procedimento de construção. O diretório de artefato padrão é apps/desktop/src-tauri/target/release-artifacts.
O resources cópias passo packages/db/drizzle/ em apps/desktop/src-tauri/resources/migrations/ e é seguro repetir. O artifacts gravação de etapas SHA256SUMS e RELEASE_NOTES.md, construído a partir dos commits desde a última tag. Aliases de etapa são aceitos por --only e --skip: deps, checks/test, sidecar, migrations, e notes/checksums/release. O roteiro nunca lê .env* arquivos ou imprime valores secretos.
IC e publicação
| Fluxo de trabalho | Responsabilidades configuradas |
|---|---|
ci.yml | Instalação congelada, verificação/testes de espaço de trabalho, preparação de sidecar/recurso, clippy/testes de Rust e verificações de JavaScript complementares. |
build-platforms.yml | Manual ou build/** compilações de ramificação para seis arquiteturas de destino. Uso de pacotes --no-updater e fazer upload de artefatos indexados sem publicar uma versão. |
release.yml | Validação de tag de versão, construções de plataforma assinadas, manifestos por plataforma, mesclagem de manifesto de seis plataformas, publicação do instalador e publicação do índice final. |
ios.yml | Construção de simulador não assinado e emparelhamento de ida e volta; nenhuma publicação na App Store ou TestFlight. |
O fluxo de trabalho de liberação é executado para v* tags ou uma tag de versão existente selecionada manualmente no repositório não-fork. release-ref.ts verifica a tag e a versão do aplicativo e resolve o commit. Cada build cria uma versão da plataforma, como uma tag de versão com o sufixo macos-arm64 ou linux-x64. Somente após a publicação de todos os lançamentos da plataforma o índice de versão publica o arquivo mesclado latest.json.
stage-release.ts verifica os artefatos selecionados, relacionamentos de soma de verificação/assinatura e links de manifesto antes da publicação. Releases já publicados não são substituídos. A versão do índice é elegível para se tornar a mais recente para versões estáveis; os pré-lançamentos permanecem marcados como pré-lançamentos.
As compilações do atualizador exigem a chave privada de assinatura Tauri e a configuração de senha correspondente à chave pública em tauri.conf.json. a assinatura/autenticação de versão do macOS usa certificado Apple e configurações de conta; O Windows importa um certificado de assinatura e passa sua impressão digital para o empacotador. As entradas de assinatura de versão necessárias ausentes falham na compilação da versão. Configure-os por meio do armazenamento secreto de CI.
Um trabalho de lançamento separado publica o pacote do plugin nikcli quando um token npm está disponível. Ele ignora uma versão já publicada e pode usar o nome do pacote substituto configurado quando o escopo primário não puder ser publicado. Este trabalho de pacote não estabelece a disponibilidade do instalador de desktop.
Comportamento do atualizador
O endpoint do atualizador configurado é o download da versão GitHub mais recente do repositório em latest.json. O atualizador Rust verifica no lançamento e a cada quatro horas, com verificações manuais enfileiradas em seu serviço. Cada solicitação usa um tempo limite de 30 segundos. O manifesto identifica ativos e assinaturas específicas da plataforma; a chave pública faz parte da configuração do aplicativo.
update://status carrega estados de verificação, atualizado, disponível, download, pronto e com falha. Notas de lançamento contendo [critical] marque a atualização disponível como não dispensável. Um estado pronto para reiniciar também não é dispensável. Isso afeta o prompt; a instalação ainda respeita a proteção de trabalho não salvo.
install_update registra e verifica novamente a versão anunciada e, em seguida, baixa um pacote com assinatura verificada. O editor salva antes do download e novamente antes apply_update, protegendo as edições feitas durante o download. O trabalho não salvo bloqueia ambas as operações; salvamentos com falha retêm bytes verificados para nova tentativa. O status nativo é recuperado após a assinatura e as verificações não podem substituir o progresso ativo ou uma reinicialização pendente. O Windows drena o sidecar antes que seu instalador assuma o controle; outras plataformas oferecem reinicialização após a instalação.
Mantenha as chaves de liberação estáveis
O aplicativo verifica assinaturas de atualização usando sua chave pública incorporada. Uma liberação assinada com uma chave privada diferente não é intercambiável. Verifique o instalador e o ativo atualizador produzidos na plataforma de destino antes de declarar uma versão pronta para os usuários.
Compatibilidade de banco de dados
Aplicativos empacotados abertos cadcamfun.db no diretório de dados do aplicativo. As migrações pendentes são aplicadas pela camada de banco de dados na inicialização usando as migrações incluídas no pacote. As atualizações de esquema e as atualizações binárias estão, portanto, relacionadas, embora sejam artefatos separados.
As notas de versão geradas comparam as árvores de migração rastreadas com a tag de versão anterior. Uma árvore alterada é relatada como insegura para downgrade; uma árvore inalterada é relatada como compatível com migração; o histórico indisponível é relatado como desconhecido. Esta comparação automatizada não valida todos os possíveis problemas de compatibilidade no nível do aplicativo.
Antes de substituir um binário por uma versão mais antiga, preserve os dados atuais e inspecione as notas de compatibilidade da versão. O código de migração direta não implica migrações reversas. Siga os procedimentos de backup e recuperação do banco de dados para o diretório de dados real.
Verificação de liberação
bun test scripts
bun scripts/build.ts --only=artifacts --dry-run Os testes auxiliares validam o mapeamento de destino, requisitos de assinatura, nomenclatura de artefatos, manipulação de manifesto e regras de preparação. Uma simulação imprime operações planejadas sem compilar ou assinar. Não substitui um pacote nativo real, teste de download/instalação do atualizador, nem aceitação de dispositivo físico para o complemento.
Para uma versão operacional, retenha a tag/confirmação exata, o resultado do fluxo de trabalho, o instalador específico do destino e o ativo de atualização, os arquivos de soma de verificação/assinatura e o manifesto publicado. Valide se o aplicativo instalado inicia seu sidecar e migrações agrupadas e se o atualizador seleciona o ativo de plataforma pretendido.
Referência de alvo e ativo
| Plataforma | Alvo de Rust | Chave de manifesto | Recurso atualizador |
|---|---|---|---|
| macOS Apple Silício | aarch64-apple-darwin | darwin-aarch64 | .app.tar.gz |
| macOS Intel | x86_64-apple-darwin | darwin-x86_64 | .app.tar.gz |
| ARM do Windows64 | aarch64-pc-windows-msvc | windows-aarch64, windows-aarch64-msi | .exe, .msi |
| Janelas x64 | x86_64-pc-windows-msvc | windows-x86_64, windows-x86_64-msi | .exe, .msi |
| ARM Linux64 | aarch64-unknown-linux-gnu | linux-aarch64-deb, linux-aarch64-rpm | .deb, .rpm |
| Linuxx64 | x86_64-unknown-linux-gnu | linux-x86_64-deb, linux-x86_64-rpm | .deb, .rpm |
O gerador requer exatamente um ativo por formato acima, seu adjacente .sig arquivo e notas de lançamento. Os nomes dos ativos usam um <triple>-- prefixo; nomes duplicados e assinaturas órfãs são recusados. O atualizador Tauri 2.13.1 seleciona o tipo de pacote instalado automaticamente; Linux usa pacotes Debian/RPM assinados sem AppImage.
Os manifestos mesclados devem concordar com a versão, data de publicação e notas. A publicação requer todas as dez chaves acima. As chaves básicas do Windows mantêm a compatibilidade do NSIS para clientes mais antigos; As chaves MSI preservam as instalações MSI. URLs devem usar HTTPS sem credenciais, consulta ou fragmento. O teste verifica cada prefixo de destino, sufixo de pacote, assinatura e URL de lançamento.
Opções de construção local e entradas de assinatura
bun --no-env-file scripts/build.ts --only=compile,resources --target=aarch64-apple-darwin --dry-run
bun --no-env-file scripts/build.ts --skip=install,check --target=x86_64-unknown-linux-gnu --bundles=deb,rpm --no-updater --dry-run Remover --dry-run somente quando a cadeia de ferramentas de destino selecionada e os pré-requisitos nativos estiverem instalados. A compilação cruzada do executável Bun não fornece, por si só, um vinculador e empacotador Tauri de plataforma cruzada. --only e --skip são mutuamente exclusivos; --skip-install é um apelido de conveniência. --no-updater omite a criação de arquivo/assinatura do atualizador e seu portão de assinatura.
| Entrada | Usado para |
|---|---|
TAURI_SIGNING_PRIVATE_KEY, TAURI_SIGNING_PRIVATE_KEY_PASSWORD | Assinaturas do atualizador. As chaves fornecidas pelo ambiente têm precedência sobre a configuração de assinatura local. |
Local ignorado tauri-signing.json | Fallback da chave do atualizador local quando nenhuma chave de ambiente é fornecida. Sua chave pública declarada deve ser igual à chave pública do atualizador configurada. |
CADCAM_RELEASE=1 | Habilita requisitos de assinatura de versão da plataforma na validação de build. |
APPLE_CERTIFICATE, APPLE_CERTIFICATE_PASSWORD, APPLE_ID, APPLE_PASSWORD, APPLE_TEAM_ID | certificado de versão do macOS e configuração de reconhecimento de firma. |
WINDOWS_CERTIFICATE, WINDOWS_CERTIFICATE_PASSWORD, impressão digital do certificado importado | Assinatura de versão do Windows; O CI importa e posteriormente remove o certificado. |
A compilação carrega credenciais do atualizador local apenas para a etapa de empacotamento e passa valores de assinatura por meio do ambiente para esse processo filho. Não imprima arquivos de assinatura local nem coloque material chave real em um exemplo de documentação. Uma chave privada que não corresponda à chave pública de um aplicativo instalado não pode produzir uma atualização aceita para esse aplicativo.
Diagnóstico de falha de liberação
| Falha | Interpretação e próxima verificação |
|---|---|
| Versão da tag/aplicativo discorda | O selecionado vA tag -prefixed não corresponde à versão na configuração do Tauri. A validação da versão é interrompida antes da construção da plataforma. |
| Alvo não compatível | Use um mapeamento de arquitetura/plataforma compatível e um destino Rust instalado; a publicação do manifesto suporta as seis chaves acima. |
| Chave de assinatura do atualizador ausente | Forneça a entrada de assinatura por meio do armazenamento secreto/configuração local ou selecione uma opção deliberada --no-updater construção de desenvolvimento. |
| Nenhum ou vários ativos do atualizador | Inspecione o diretório de destino indexado; arquivos obsoletos ou incompatíveis tornam a seleção ambígua. |
| Os metadados do manifesto discordam | Todos os trabalhos da plataforma devem usar a mesma versão/data/notas resolvidas e commit. |
| Lançamento já publicado | O fluxo de trabalho se recusa a modificá-lo. A nova execução não é um mecanismo de substituição. |
| A verificação do atualizador falha no aplicativo instalado | Inspecione a acessibilidade do endpoint, a chave de destino do manifesto, o URL de download, a assinatura do ativo e a chave pública incorporada. |
| Instalação recusada com trabalho não salvo | Salve ou descarte o trabalho ativo por meio do editor e tente novamente a atualização pendente. |
Um relatório de lançamento útil registra qual estágio falhou e qual alvo ele estava construindo. Inclua nomes de artefatos não secretos, erros de validação e identificadores de fluxo de trabalho. Mantenha a versão anterior instalada e um backup de dados verificado disponível durante um exercício de atualização; a compatibilidade da migração é verificada separadamente da validade da assinatura.
Âncoras de implementação: scripts/release-helpers.ts, signing-config.ts, updater-manifest.ts, stage-release.ts, e apps/desktop/src-tauri/src/updater.rs.
As seis etapas de construção
| # | Etapa | Aliases | O que isso faz |
|---|---|---|---|
| 1 | install | dependências | bun install --frozen-lockfile |
| 2 | check | verificações, teste, testes | bun run typecheck |
| 3 | compile | sidecar | Compilar apps/sidecar/src/main.ts a src-tauri/binaries/sidecar-<triple> |
| 4 | resources | recurso, migrações | Cópia packages/db/drizzle/ a src-tauri/resources/migrations/ |
| 5 | bundle | agrupar | Aplicativo desktop vite build, então bunx tauri build |
| 6 | artifacts | artefatos, notas, somas de verificação, liberação | SHA256SUMS e RELEASE_NOTES.md de commits desde a última tag |
As etapas sempre são executadas nesta ordem e uma etapa com falha interrompe a execução. O roteiro nunca lê .env arquivos e nunca imprime valores secretos.
| Opção | Effect |
|---|---|
--only=a,b / --skip=a,b | Execute ou pule etapas (nomes ou apelidos) |
--skip-install | O mesmo que --skip=install |
--target=<triple> | Alvo de Rust; o padrão é o host triplo de rustc -vV |
--bundles=<list> | Encaminhado para tauri build --bundles |
--no-updater | Instaladores sem arquivos e assinaturas do atualizador |
--out-dir=<path> | Onde a etapa 6 escreve; padrão apps/desktop/src-tauri/target/release-artifacts |
--dry-run | Imprima o plano; escreva e não mude nada |
bun scripts/build.ts --dry-run # whole plan, no side effects
bun scripts/build.ts --only=resources # restage migrations (idempotent)
bun scripts/build.ts --only=compile,resources # rebuild the sidecar and migrations
bun scripts/build.ts --only=notes --dry-run # preview release notes
bun scripts/build.ts --target=aarch64-apple-darwin A assinatura do atualizador local usa um ignorado tauri-signing.json quando nenhuma chave de assinatura está definida no ambiente. Os certificados de plataforma ainda são necessários quando CADCAM_RELEASE=1.
Matriz de lançamento
| Alvo | Corredor | Pacotes | Liberar lesma |
|---|---|---|---|
aarch64-apple-darwin | macos-14 | aplicativo, dmg | braço macos64 |
x86_64-apple-darwin | macos-14 | aplicativo, dmg | macos-x64 |
x86_64-pc-windows-msvc | windows-mais recente | msi, nsis | janelas-x64 |
aarch64-pc-windows-msvc | windows-11-arm | msi, nsis | braço do Windows64 |
x86_64-unknown-linux-gnu | ubuntu-22.04 | deb, rpm | linux-x64 |
aarch64-unknown-linux-gnu | ubuntu-22.04-braço | deb, rpm | braço linux64 |
- Um trabalho confiável valida a tag de lançamento em relação à versão do aplicativo.
- Cada trabalho de matriz é executado
bun --no-env-file scripts/build.ts --target=… --bundles=… --out-dir=release, assina e cria um manifesto para seus formatos de pacote. O Windows importa e depois remove seu certificado de assinatura opcional. - Uma tarefa de mesclagem valida todos os seis manifestos de arquitetura e suas dez entradas de pacote em um
latest.json. - Um trabalho de conclusão verifica todos os artefatos, assinaturas, somas de verificação e notas do instalador antes de criar ou retomar o lançamento da versão única e publicá-la.
CI em cada push executa dois trabalhos: instalação, verificação de tipo e teste (e prepara o binário sidecar e as migrações) e um trabalho Rust com clippy e o src-tauri testes.