Contrato e implementação
oren init worker minha-task --template shellGera contrato, implementação, worker e um pipeline para exercitá-la. Se você só quer usar tasks existentes, o caminho é outro — veja Primeiro pipeline.
A linha
Seção intitulada “A linha”É a decisão central do Oren, e a mais fácil de errar.
| Pertence à Task | Pertence à Implementation |
|---|---|
| “preciso de um repositório git” | “monto em /source” |
| “vou escrever nele” | — |
| “preciso de uma credencial GCP” | “ela vai em /keys/gcp-credential.json” |
“recebo defaultChange, devolvo change” |
“leio de /oren/input.json” |
| — | “uso a imagem ghcr.io/...” |
| — | “e preciso do socket do Docker” |
Repare na última linha. O contrato de build-docker-image não exige daemon
Docker: construir imagem sem ele é possível (kaniko, buildah). Exigir é decisão
de quem implementou — e uma que custa privilégio crítico.
Piso e delta
Seção intitulada “Piso e delta”A Task declara o piso: o que qualquer implementação vai precisar. A Implementation declara o que ela adiciona.
Duas implementações do mesmo contrato só são comparáveis porque o piso é idêntico — o que sobra é escolha de engenharia. É isso que o catálogo ranqueia.
Versionam independente
Seção intitulada “Versionam independente”- Versão da Task descreve o contrato. Remover um output ou tornar um input obrigatório é major. Adicionar input opcional é minor.
- Versão da Implementation descreve o worker, e evolui sozinha. Ela declara
o range de contrato que satisfaz (
^1.0.0).
O teste, quando estiver em dúvida
Seção intitulada “O teste, quando estiver em dúvida”Se eu trocar de implementação e esse valor sumir, o output muda?
Se muda, é contrato. Se não muda — um cacheKey, um nível de verbosidade — é
configuração de implementação.