Guia de Lançamento e Distribuição do SDK
Este guia explica como os SDKs do PAEBIRU são construídos, publicados e distribuídos em Python (PyPI), TypeScript/JavaScript (npm) e Swift (SPM).
Fluxo de Trabalho de Lançamento (Release)
O lançamento de produção é acionado ao enviar uma tag git que corresponda a v* (por exemplo, v0.1.0).
git tag v0.1.0
git push origin v0.1.0
Isso aciona automaticamente o .github/workflows/release.yml, que:
- Constrói binários nativos (paebiru-node, paebiru-cli) para 6 alvos
- Constrói pacotes SDK (wheels Python, WASM TypeScript, bibliotecas Swift)
- Cria o lançamento no GitHub com todos os artefatos
- Publica nos gerenciadores de pacotes:
- crates.io (crates Rust)
- PyPI (wheels Python)
- npm (TypeScript/JavaScript)
- SPM (Swift Package Manager)
Estágios
Estágio 1: Construir Binários
Trabalho (Job): build (6 em paralelo)
Compila paebiru-node e paebiru-cli para:
- Linux x86_64, ARM64, RISC-V
- macOS x86_64, ARM64 (Apple Silicon)
- Windows x86_64
Saída: Binários executáveis preparados como:
paebiru-node-x86_64-unknown-linux-gnu
paebiru-node-aarch64-apple-darwin
...
Duração: ~15-20 minutos
Estágio 2: Construir SDKs
Trabalho (Job): build-sdks (5 em paralelo)
SDK Python
- Plataformas: Linux (x86_64, ARM64), macOS (x86_64, ARM64), Windows (x86_64)
- Ferramenta: maturin (sistema de construção PyO3)
- Saída: Wheels (arquivos .whl)
- Duração: ~5-10 minutos por plataforma
SDK TypeScript
- Plataforma: Linux (constrói uma vez, alvo wasm32)
- Ferramenta: wasm-pack
- Saída: pacote npm (bundle)
- Duração: ~3-5 minutos
SDK Swift
- Plataformas: dispositivo iOS (arm64), simulador iOS (x86_64), macOS (Intel/Apple Silicon)
- Ferramenta: cargo com alvos iOS
- Saída: Bibliotecas nativas (arquivos .a, futuro .xcframework)
- Duração: ~8-10 minutos por alvo
Estágio 3: Criar o Lançamento (Release)
Trabalho (Job): create-release
- Verifica se a tag está na branch principal
- Baixa todos os artefatos dos estágios 1 e 2
- Cria o lançamento no GitHub com:
- Notas de lançamento (geradas automaticamente a partir de commits)
- Todos os artefatos binários
- Wheels Python
- Bundle do pacote TypeScript
- Bibliotecas Swift
Duração: ~2 minutos
Estágio 4: Publicar nos Gerenciadores de Pacotes
Trabalhos (Jobs): publish-crates, publish-pypi, publish-npm, publish-spm
Crates Rust (crates.io)
- Crates: paebiru-sdk, paebiru-zk, paebiru-learn, paebiru-hal, paebiru-node, paebiru-cli
- Gatilho: Após a criação do lançamento
- Duração: ~2-3 minutos
Wheels Python (PyPI)
- Token:
PYPI_TOKEN(requer configuração nos segredos do GitHub) - Ferramenta: twine
- Versões: Todas as wheels da construção multiplataforma
- Comando:
twine upload wheels/**/*.whl --skip-existing - Duração: ~1-2 minutos
Pacote TypeScript (npm)
- Token:
NPM_TOKEN(requer configuração nos segredos do GitHub) - Escopo: @paebiru/sdk (opcional)
- Ferramenta: npm publish
- Duração: ~1 minuto
Pacote Swift (SPM)
- Distribuição: Lançamentos do GitHub (automático)
- Descoberta: Via
Package.swiftno git - Instalação:
.package(url: "https://github.com/silvanoneto/paebiru.git", from: "0.1.0") - Duração: Instantânea (já lançado no Estágio 3)
Requisitos de Configuração
Segredos do Repositório GitHub
Segredos necessários (adicione via GitHub Settings → Secrets and variables → Actions):
-
CARGO_REGISTRY_TOKEN
- Fonte: crates.io/me → “API Tokens”
- Escopo: Acesso total para publicar crates
- Tipo: Token de escrita
-
PYPI_TOKEN
- Fonte: pypi.org/account/api-tokens
- Escopo: Conta inteira ou projeto específico
- Tipo: Token com prefixo pypi- (ex:
pypi-AgEIc...)
-
NPM_TOKEN
- Fonte: npmjs.com/settings/tokens
- Escopo: Automação / Ler e Publicar
- Tipo: Token de automação
-
GITHUB_TOKEN (automático, fornecido pelo GitHub Actions)
- Usado para criar lançamentos
- Permissões:
contents: write
Configuração Local para Testes
Para testar os lançamentos localmente antes de enviar (push):
# Wheels Python
cd crates/bindings/py
pip install maturin
maturin build --release
# TypeScript
cd crates/bindings/ts
npm install -g wasm-pack
wasm-pack build --release --target bundler
# Swift (dispositivo iOS)
cd crates/bindings/swift
cargo build --release --target aarch64-apple-ios
# Binários Rust
cargo auditable build --release -p paebiru-node -p paebiru-cli
Estratégia de Versionamento
Formato de Versão
Siga o Versionamento Semântico:
- MAJOR.MINOR.PATCH (ex: 1.2.3)
- Pré-lançamento: MAJOR.MINOR.PATCH-alpha.N, -beta.N, -rc.N
- Metadados de construção: MAJOR.MINOR.PATCH+build.123 (raramente usado)
Regras
- Incremente MAJOR para quebras de API
- Incremente MINOR para novos recursos (compatíveis com versões anteriores)
- Incremente PATCH para correções de bugs
- Todos os SDKs são lançados na mesma versão (sincronizados)
Exemplos
v0.1.0 # Primeiro lançamento
v0.2.0 # Nova API de streaming
v1.0.0 # Integração ZK concluída
v1.0.1 # Correções de bugs
v1.1.0-rc1 # Candidato a lançamento para 1.1.0
Solução de Problemas
Construção da Wheel Python Falha
- Problema: Erro de vinculação (linking) no macOS ARM64
- Solução: Certifique-se de que o maturin está atualizado:
pip install --upgrade maturin
Publicação no npm Rejeitada
- Problema: Versão já existe
- Solução: Verifique o registro npm ou incremente a versão de patch
- Problema: Incompatibilidade de escopo
- Solução: Atualize o escopo no
package.jsonpara@paebiru/sdk
Publicação no Crates.io Falha
- Problema: Ordem de dependência
- Solução: Certifique-se de que o paebiru-sdk seja publicado antes de crates/bindings/py/ts/swift na ordem
- Problema: Dependência de crate removida (yanked)
- Solução: Atualize o Cargo.lock e tente novamente
Integração do Swift SPM
- Problema:
Package.swiftnão encontrado - Solução: Certifique-se de que o Package.swift esteja no diretório crates/bindings/swift/
- Problema: Falha no download do alvo binário
- Solução: Verifique se os artefatos de lançamento do GitHub foram carregados e se a URL está correta
Processo de Lançamento Manual
Se o fluxo de trabalho automatizado falhar, lance manualmente:
# 1. Verifique se todos os testes passam
make test
# Ou manualmente excluindo bindings sensíveis:
# cargo test --workspace --exclude paebiru-r --exclude paebiru-php ...
# 2. Construa binários localmente
cargo auditable build --release -p paebiru-node -p paebiru-cli
# 3. Construa wheels Python (todas as plataformas)
cd crates/bindings/py && maturin build --release
# 4. Construa TypeScript
cd crates/bindings/ts && wasm-pack build --release --target bundler
# 5. Construa Swift
cd crates/bindings/swift && cargo build --release --target aarch64-apple-ios
# 6. Crie a tag git
git tag v0.X.Y
git push origin v0.X.Y
# 7. Publique no crates.io
cargo publish -p paebiru-sdk
cargo publish -p paebiru-zk
# ... etc
# 8. Publique wheels Python
cd crates/bindings/py/target/wheels
twine upload *.whl --repository pypi --token $PYPI_TOKEN
# 9. Publique TypeScript
cd crates/bindings/ts/pkg
npm publish --access public
# 10. Crie o lançamento no GitHub manualmente
# Visite https://github.com/silvanoneto/paebiru/releases/new
# Carregue arquivos de wheel, bundle WASM, bibliotecas Swift
Canais de Distribuição
PyPI (Python)
pip install paebiru
Plataformas suportadas:
- Linux: x86_64, aarch64 (manylinux)
- macOS: x86_64, arm64 (universal)
- Windows: x86_64
Versões de Python: 3.8, 3.9, 3.10, 3.11, 3.12 (via compilação de wheel de recurso maturin)
npm (TypeScript)
npm install @paebiru/sdk
# ou
yarn add @paebiru/sdk
Alvos:
- Bundlers (webpack, vite, rollup)
- Navegador (tag script direta via CDN)
- Node.js (CommonJS + ESM)
SPM (Swift)
// Package.swift
.package(url: "https://github.com/silvanoneto/paebiru.git", from: "0.1.0")
// Dependências
targets: [
.target(name: "MyApp", dependencies: [.product(name: "Paebiru", package: "paebiru")])
]
Plataformas suportadas:
- iOS 13+
- macOS 10.15+
crates.io (Rust)
[dependencies]
paebiru-sdk = "0.1"
paebiru-node = "0.1"
paebiru-cli = "0.1"
Checklist Pós-Lançamento
- Todos os gerenciadores de pacotes mostram a versão correta
- O lançamento no GitHub tem todos os binários e arquivos wheel
- A página do PyPI lista todas as variantes de wheel
- O registro npm mostra o módulo correto com tipos TypeScript
- O
Package.swiftdo SPM resolve corretamente - Site de documentação atualizado para a nova versão
- Notas de lançamento publicadas (post no blog opcional)
- Anuncie nos canais da comunidade (Discord, Twitter, etc.)
Melhorias Futuras
- Geração automática de changelog a partir de commits convencionais
- Imagens Docker com binários pré-construídos
- Fórmula Homebrew para macOS/Linux
- Pacote Conan para integração C++
- Otimização da matriz do GitHub Actions para construções paralelas mais rápidas
- Lançamentos noturnos (canal alfa) para versões de desenvolvimento