confdrift
v0.1.0 · MIT · Linux, macOS, Windows

Em staging funciona. Em produção, não.

Em algum ponto entre os dois, uma chave de configuração sumiu ou um timeout perdeu um zero. O confdrift compara as configurações dos seus ambientes e mostra o que divergiu, antes que o deploy mostre.

go install github.com/eduardofrafre/confdrift@latest

O problema

Todo time com dois ambientes tem duas configurações que discordam em silêncio.

01

O diff compara linhas, não configurações

Chaves em outra ordem, outra indentação, ou um YAML ao lado de um JSON, e o diff mostra ruído em todo lugar e a mudança real em lugar nenhum.

02

O drift perigoso é pequeno

Uma feature flag que só existe em staging. Um timeout de 300 onde deveria ser 3000. Um número que virou string. Ninguém vê isso no code review.

03

Ele aparece como incidente

O drift fica invisível até o código que depende dele chegar em produção. O confdrift traz esse momento para o pull request.

Como funciona

Lê todo arquivo do mesmo jeito e compara chave por chave.

O confdrift nunca compara texto. Ele transforma cada arquivo numa lista plana de caminhos de chave com valores tipados, então formato, ordem e indentação deixam de importar, e só sobram as diferenças reais.

1 · Ler

Achata qualquer formato

.env, YAML, JSON e ConfigMaps do Kubernetes. O formato vem do nome do arquivo; chaves aninhadas viram caminhos.

# app.yaml
db:
  host: db.internal
  pool:
    max: 20
vira
db.host      "db.internal"
db.pool.max  20
2 · Comparar

Alinha todas as chaves

Cada chave é conferida em todos os arquivos de uma vez, sejam dois ambientes ou dez. Uma chave está igual, alterada ou ausente em algum deles.

chavestgprod
RETRY_LIMIT"5""5"igual
TIMEOUT_MS"3000""300"alterada
NEW_CART"true"-ausente
3 · Relatar

Avisa as pessoas e o CI

Um relatório legível para você, JSON para scripts, credenciais ocultadas, e um código de saída que o pipeline entende.

0Os arquivos concordam
1Drift encontrado
2Entrada inválida: arquivo ilegível, erro de parse

Experimente

Edite os arquivos e veja o relatório mudar.

Este é o motor real do confdrift compilado para WebAssembly, rodando no seu navegador. Nada do que você digita sai desta página. Renomeie um arquivo para mudar o formato.

Exemplos

      

As mesmas regras da CLI: o tipo conta, então 5432 e "5432" são diferentes, e chaves que parecem credenciais são comparadas mas impressas como <redacted>.

Uso

Um comando, poucas flags, nenhum arquivo de configuração.

Comandos do dia a dia

# dois ambientes
confdrift .env.staging .env.production
# ou quantos você tiver
confdrift dev.yaml staging.yaml prod.yaml
# só chaves ausentes em algum lugar
confdrift a.env b.env --keys-only
# ignora chaves que devem mesmo diferir
confdrift a.env b.env --ignore 'DATABASE_*'
# para scripts e bots
confdrift a.env b.env --format json

As flags podem vir antes ou depois dos nomes de arquivo. --ignore aceita o curinga * e pode ser repetido.

No CI

# .github/workflows/config-drift.yml
on: pull_request
jobs:
  drift:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - uses: actions/setup-go@v6
      - run: go run github.com/eduardofrafre/confdrift@latest --keys-only deploy/staging.env deploy/production.env

Num pipeline, --keys-only costuma ser o que você quer: valores diferem entre ambientes por natureza, mas uma chave definida num e não no outro é um bug esperando o próximo deploy.

Formatos

  • dotenv: .env, .env.production, prod.env. Entende aspas, export, comentários e valores de várias linhas. ${VARS} não são expandidas: se a referência mudou, isso é drift.
  • YAML e JSON viram os mesmos caminhos, como db.pool.max ou servers[0], então dá para comparar um YAML com um JSON.
  • ConfigMaps do Kubernetes são comparados pelas chaves de data. A saída de helm template ou kustomize build funciona direto: os outros recursos são ignorados.

Segredos

Valores de chaves que parecem credenciais (*PASSWORD*, *TOKEN*, *SECRET*, *API_KEY* e parecidas) saem como <redacted>, assim como senhas dentro de URLs. Eles continuam sendo comparados, então um segredo rotacionado ainda aparece como drift. --show-secrets mostra os valores.

saídasignificado
0Os arquivos concordam
1Drift encontrado
2Entrada inválida: arquivo ilegível, erro de parse, flag desconhecida

Instalação

Um binário estático. Sem runtime, sem dependências.

Cerca de 3 MB, e compara uma configuração real em poucos milissegundos. Escolha sua plataforma:

Exemplo para x86-64; em ARM troque amd64 por arm64.

curl -sL https://github.com/eduardofrafre/confdrift/releases/download/v0.1.0/confdrift_0.1.0_linux_amd64.tar.gz | tar xz
sudo mv confdrift_0.1.0_linux_amd64/confdrift /usr/local/bin/
confdrift --version

Open source

Gratuito, licença MIT, desenvolvido em público.

Achou um drift que o confdrift deixou passar, ou um formato que ele deveria ler? Abra uma issue. Se ele pegou algo antes do deploy, você pode apoiar pelo PayPal.