Pipeline de CI/CD
Integração contínua, auditoria de segurança e publicação automatizada
Visão Geral
O fiscal-rs utiliza três workflows GitHub Actions que, juntos, garantem qualidade de código, segurança de dependências e publicação automatizada no crates.io.
| Workflow | Arquivo | Gatilho |
|---|---|---|
| CI | ci.yml | Push e PR para master |
| Security Audit | audit.yml | Push para master, diário (06:00 UTC), manual |
| Release-plz | release-plz.yml | Push para master |
Pipeline de CI
O workflow principal (ci.yml) executa cinco jobs em paralelo. Todos devem passar para que um PR seja mesclado.
Detalhamento dos Jobs
1. Rustfmt
Verifica se todo o código segue a formatação padrão do Rust.
cargo fmt --all --checkNão corrige automaticamente -- apenas rejeita código mal formatado. Use cargo fmt localmente antes de enviar.
2. Clippy
Análise estática com todos os lints tratados como erros.
cargo clippy --all-targets --all-features -- -D warningsO flag --all-targets inclui benchmarks, exemplos e testes. O -D warnings garante tolerância zero a avisos.
3. Nextest (Testes)
Executa a suíte completa de testes usando cargo-nextest, que oferece execução paralela e saída mais clara que o cargo test padrão.
cargo nextest run --all-featuresCobre 692+ testes de integração incluindo testes portados de PHP e TypeScript, testes de propriedade (proptest) e testes de snapshot (insta).
4. Doc Tests
Executa os exemplos de código embutidos na documentação (rustdoc), garantindo que todos compilam e produzem os resultados esperados.
cargo test --doc --all-features5. Cargo Doc
Compila a documentação completa com warnings tratados como erros.
RUSTDOCFLAGS="-D warnings" cargo doc --no-deps --all-featuresGarante que não existem links quebrados, itens sem documentação (quando exigido) ou referências inválidas.
Cache
Todos os jobs utilizam actions/cache@v5 para cachear o registry do Cargo e o diretório target/. As chaves de cache são segmentadas por job (cargo-clippy-, cargo-test-, cargo-docs-, etc.) com fallback para $runner.os-cargo-.
Dependência de Sistema
Todos os jobs instalam libssl-dev e pkg-config via apt, necessários para a compilação do crate openssl-sys (utilizado para assinatura digital de XML).
Auditoria de Segurança
O workflow audit.yml executa duas verificações de segurança complementares.
cargo-deny
Utiliza a cargo-deny-action para verificar quatro categorias em uma única execução:
cargo deny check licenses bans advisories sources| Categoria | O que verifica |
|---|---|
| licenses | Licenças permitidas (MIT, Apache-2.0, BSD-2-Clause, BSD-3-Clause, ISC, OpenSSL, entre outras) |
| bans | Proibição de dependências com versão wildcard (*); aviso para múltiplas versões da mesma crate |
| advisories | Consulta ao RustSec Advisory DB para vulnerabilidades conhecidas |
| sources | Permite apenas crates.io e membros locais do workspace |
A configuração completa está em deny.toml na raiz do workspace.
cargo-audit
Verificação redundante usando a audit-check action, que cria issues automaticamente no repositório quando encontra advisories.
Gatilhos
- Push para master: apenas quando
Cargo.toml,Cargo.lockoudeny.tomlsão alterados - Agendamento diário: roda às 06:00 UTC para capturar advisories publicados durante a noite
- Manual: via
workflow_dispatchpara verificação sob demanda
Release-plz (Publicação Automatizada)
O workflow release-plz.yml automatiza o versionamento semântico e a publicação no crates.io usando release-plz.
Jobs
O workflow contém dois jobs que rodam em todo push para master:
release-plz-pr
Analisa os commits desde a última release, calcula a próxima versão semântica baseada nos Conventional Commits, e cria (ou atualiza) um Pull Request com:
- Bump de versão no
Cargo.toml - Atualização do
CHANGELOG.md
command: release-prrelease-plz-release
Detecta se a versão no Cargo.toml da branch master é mais nova que a última publicada no crates.io. Se for, executa cargo publish e cria uma tag Git + GitHub Release.
command: releaseSegurança
- Condição:
github.repository_owner == 'JoaoHenriqueBarbosa'-- só executa no repositório original - Concurrency group:
release-plz-${{ github.ref }}-- evita execuções paralelas do job de PR - Secrets:
CARGO_REGISTRY_TOKENpara publicação eGITHUB_TOKENpara criação de PRs/releases
Hook de Pre-push
O repositório inclui um hook pre-push em scripts/hooks/pre-push que espelha a pipeline de CI localmente, bloqueando o push se qualquer verificação falhar.
Etapas do Hook
Instalação
# A partir da raiz do repositório
cp scripts/hooks/pre-push .git/hooks/pre-push
chmod +x .git/hooks/pre-pushDiferenças em relação ao CI
| Verificação | CI | Pre-push |
|---|---|---|
| cargo fmt | Sempre | Sempre |
| cargo clippy | Sempre | Sempre |
| nextest | Sempre | nextest se disponível, senão cargo test |
| doc tests | Sempre | Sempre |
| cargo doc | Sempre | Sempre |
| cargo-deny | Workflow separado (audit.yml) | Somente se cargo-deny estiver instalado |
| cargo-audit | Workflow separado (audit.yml) | Não executado |
O hook usa set -euo pipefail para abortar na primeira falha e inclui saída colorida para facilitar a leitura do resultado.