Ir para o conteúdo

Projeto independente de P&D · Colônia

Fences executáveis

Um estado proibido impede o merge, a liberação, o deploy ou a publicação em questão.

Não normativo

Versão do Companion
1.0
Corresponde ao COADF Core
2.2
Status
Atual
Última revisão
Princípios do COADF
P-6

Propriedade de arquitetura

COADF P-6: uma barreira que vive em um documento é um conselho; uma barreira que roda na pipeline e bloqueia uma liberação é um fence. Os fences caem em quatro categorias (dados, arquitetura, texto e processo), cada um com um identificador, uma regra e um método de aplicação, e um fence só ganha seu lugar por uma prova de dentes. O COADF não publica o vocabulário sobre o qual seu próprio fence de publicação dispara, porque uma lista do que se vigia é um mapa do que se protege.

A propriedade não é “existe uma verificação”. É que o estado proibido não consegue passar de um determinado ponto, e que alguém o viu ser detido ali.

Por que importa

Todas as outras propriedades deste Companion podem ser implementadas corretamente uma vez e perdidas na mudança seguinte. Um fence é o que mantém uma propriedade verdadeira ao longo de mudanças que ninguém revisou com essa propriedade em mente. A parte difícil raramente é escrever a verificação. É colocá-la no caminho que o estado proibido precisa percorrer, e provar que ela dispara ali, no caminho real, e não num teste unitário da função que verifica.

Estratégias de implementação válidas

Superfícies de aplicação

Cada superfície vê algo diferente, e cada uma tem um desvio característico. Um fence pertence à superfície que vê o estado proibido, e só é tão forte quanto o desvio dessa superfície permite.

Onde um fence pode ficar, o que ele vê ali e como costuma ser contornado
SuperfícieDesvio típico
Compilador e verificador de tiposEstrutura do código e tipos declaradosCasts, tipagem dinâmica, reflexão, código gerado
Validação na aplicaçãoValores numa fronteira, em tempo de execuçãoUm segundo ponto de entrada: um job em lote, um script, uma migração
Teste de arquiteturaO grafo de dependênciasCarregamento por nome em tempo de execução; um pacote novo que a regra não nomeia
Teste de contrato e de esquemaCompatibilidade de interfacesUm consumidor que ninguém registrou
Integração contínuaO repositório num commitUma verificação obrigatória que é pulada e informada como sucesso
Gate de mergeQuais verificações precisam passar antes de um mergeAdministradores, pushes diretos, proteção que o plano de hospedagem não aplica
Pipeline de liberaçãoO artefato que está sendo promovidoUm upload manual
Admissão no deployObjetos de API submetidos ao clusterUma política de falha que ignora erros; objetos que existiam antes da política
Build de publicaçãoA saída pública renderizadaConteúdo servido de fora do build

Três cadeias, cada uma terminando numa transição detida, estão implementadas nos perfis:

  • Uma violação de arquitetura faz um teste de arquitetura falhar, e o merge não acontece (Python e FastAPI).
  • Uma incompatibilidade de contrato faz uma verificação de contrato falhar, e a liberação não acontece.
  • Uma sentinela proibida sintética no site gerado faz o fence de publicação falhar, e a publicação não acontece (Python e FastAPI, Cloud-native).

A integração contínua é uma superfície entre nove, não a definição de um fence. GitHub Actions, GitLab CI e Jenkins podem hospedar um; também podem um verificador de tipos, uma política de admissão ou o build que renderiza um site.

Prova de dentes

  • Introduzir um defeito controlado e sintético.
  • Exercitar o caminho real de aplicação, não um teste unitário da função que verifica.
  • Verificar que falha, e que falha pelo motivo plantado.
  • Restaurar exatamente o fixture, e provar isso comparando um digest antes e depois.
  • Verificar que volta a passar.

Fazer commit antes de plantar. Restaurar descartando mudanças restaura o último commit, que numa branch de trabalho pode não ser o ponto de partida, e a prova então destrói o trabalho que deveria proteger.

Modos de falha

  1. O fence está no caminho errado

    Ele verifica o repositório, enquanto o conteúdo proibido é injetado no build, no deploy ou em tempo de execução.

  2. Uma verificação obrigatória pulada é lida como sucesso

    O GitHub informa um job pulado como bem-sucedido, e um job pulado não impede um merge mesmo quando é uma verificação obrigatória. Um job obrigatório que depende de um fence que falhou é pulado, e o merge passa. A exigência deve recair sobre o próprio fence, ou sobre um job de resumo que sempre roda e falha a menos que todos os fences tenham passado (a própria orientação do GitHub para verificações que dependem de outros jobs).

  3. Consultivo por configuração

    continue-on-error, allow_failure: true no GitLab CI, um webhook de admissão cuja política de falha ignora erros, uma constraint do Gatekeeper em dryrun ou warn: cada um transforma um fence em conselho sem que ninguém escreva essa palavra.

  4. Nada verificado, informado como limpo

    Uma lista de padrões vazia, uma seleção de testes que não corresponde a nada, a varredura de um diretório vazio. O número de verificações de fato executadas pertence ao resultado, e zero é uma falha.

  5. O fence dispara em trabalho legítimo e é desligado

    A precisão mantém um fence vivo. Uma regra que dispara em texto comum vai ser desativada em vez de obedecida, e um fence desativado é pior do que nenhum, porque todos continuam acreditando que ele está lá.

  6. A própria lista do fence é publicada

    Uma lista pública de termos vigiados diz a quem lê exatamente o que está sendo protegido.

  7. O estado existente nunca é verificado

    Verificações de admissão e de pré-merge agem sobre requisições no momento em que são feitas, não sobre o que já existe. O Kubernetes documenta isso com todas as letras para um plugin de admissão: quando um LimitRange é adicionado, os pods que já existem continuam inalterados. O Gatekeeper tem uma auditoria de recursos existentes exatamente para essa lacuna.

  8. Verde é lido como suficiente

    Uma verificação que passa prova que a verificação passou. Se é a verificação certa é uma questão de arquitetura que nenhuma pipeline consegue responder; ver a nota técnica.

Verificação

  • Teste de arquitetura

    Passa quando: A regra de dependência passa na árvore atual.

    Prova de dentes: Plantar a importação proibida: falha, e o gate de merge recusa.

  • Teste de contrato

    Passa quando: Os esquemas de produtor e consumidor são compatíveis.

    Prova de dentes: Remover um campo obrigatório do produtor: a verificação falha e o job de liberação não roda.

  • Teste de ponta a ponta

    Passa quando: O fence de publicação varre a saída gerada e passa.

    Prova de dentes: Plantar uma sentinela sintética na saída: o build falha. Removê-la, comparar o digest, e o build passa.

  • Teste de implantação ou de admissão

    Passa quando: Um objeto que segue a regra é admitido.

    Prova de dentes: Submeter um que a quebra: recusado, com a mensagem da regra.

  • Evidência manual

    Passa quando: No merge, uma pessoa nomeada confirma que cada fence rodou nesta execução: o identificador da execução e o número de verificações executadas ficam registrados, não lembrados.

Realizações alternativas

  • Hooks de pre-commit. Retorno rápido, e contornáveis na própria máquina de quem desenvolve: conselho, não fence.
  • Guardas em tempo de execução. Detêm um estado proibido em produção em vez de antes dela. Necessários onde o estado só existe em tempo de execução.
  • Gates manuais. Uma pessoa nomeada executa um procedimento escrito. O COADF informa esse controle honestamente como manual, nunca como imposto.
  • Motores de políticas para regras de infraestrutura. ValidatingAdmissionPolicy do Kubernetes dentro do processo, ou Open Policy Agent com Gatekeeper, onde o estado proibido é um objeto de API.

Limitações

  • Um fence de texto não consegue ver um mecanismo expresso por fluxo de controle, identificadores renomeados, fluxo de dados ou a geometria de um diagrama. Guardas automatizados são necessários e não suficientes; a revisão humana continua.
  • Um fence detecta o que foi escrito para detectar, e nada mais.
  • Fences que passam estabelecem que os fences passaram. Não estabelecem nenhum status regulatório.

Fontes

COADF Engineering Companion 1.0 · não normativo · corresponde ao COADF Core 2.2

Direitos de publicação reservados. Nenhuma licença pública é concedida, no momento, para o COADF Engineering Companion 1.0 nem para seus exemplos de referência.

Status de propriedade intelectual e de publicação