fiscal-rsfiscal-rs

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.

WorkflowArquivoGatilho
CIci.ymlPush e PR para master
Security Auditaudit.ymlPush para master, diário (06:00 UTC), manual
Release-plzrelease-plz.ymlPush para master

Pipeline de CI

O workflow principal (ci.yml) executa cinco jobs em paralelo. Todos devem passar para que um PR seja mesclado.

Loading diagram...

Detalhamento dos Jobs

1. Rustfmt

Verifica se todo o código segue a formatação padrão do Rust.

cargo fmt --all --check

Nã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 warnings

O 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-features

Cobre 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-features

5. Cargo Doc

Compila a documentação completa com warnings tratados como erros.

RUSTDOCFLAGS="-D warnings" cargo doc --no-deps --all-features

Garante 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
CategoriaO que verifica
licensesLicenças permitidas (MIT, Apache-2.0, BSD-2-Clause, BSD-3-Clause, ISC, OpenSSL, entre outras)
bansProibição de dependências com versão wildcard (*); aviso para múltiplas versões da mesma crate
advisoriesConsulta ao RustSec Advisory DB para vulnerabilidades conhecidas
sourcesPermite 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.lock ou deny.toml são alterados
  • Agendamento diário: roda às 06:00 UTC para capturar advisories publicados durante a noite
  • Manual: via workflow_dispatch para 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.

Loading diagram...

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-pr

release-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: release

Seguranç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_TOKEN para publicação e GITHUB_TOKEN para 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

Loading diagram...

Instalação

# A partir da raiz do repositório
cp scripts/hooks/pre-push .git/hooks/pre-push
chmod +x .git/hooks/pre-push

Diferenças em relação ao CI

VerificaçãoCIPre-push
cargo fmtSempreSempre
cargo clippySempreSempre
nextestSemprenextest se disponível, senão cargo test
doc testsSempreSempre
cargo docSempreSempre
cargo-denyWorkflow separado (audit.yml)Somente se cargo-deny estiver instalado
cargo-auditWorkflow 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.


Resumo da Pipeline Completa

Loading diagram...

On this page