O Que É Idempotência no CI? Explicado
Idempotência significa que executar uma operação várias vezes tem o mesmo efeito que executá-la uma vez, a propriedade que torna retries e re-execuções seguros.
Retries só são seguros quando re-executar uma operação não pode causar danos. Idempotência é exatamente essa garantia. Se um job é idempotente, você pode repeti-lo livremente após uma falha transitória; se não é, um retry pode aplicar um efeito colateral em dobro e deixar uma bagunça.
O que idempotência significa
Uma operação idempotente produz o mesmo estado final independentemente de quantas vezes é executada. Definir um valor como 5 é idempotente; incrementar em 1 não é, porque repetir continua mudando o resultado. O estado final, não o número de execuções, é o que importa.
Por que importa para retries
Quando o CI repete um job que falhou, a primeira tentativa pode ter sido executada parcialmente. Se o trabalho é idempotente, o retry simplesmente converge para o estado final correto e a primeira tentativa parcial é inofensiva. Se não é, o retry pode fazer deploy em dobro, publicar em dobro ou corromper o estado.
Trabalho de CI idempotente vs não idempotente
- Idempotente: fazer build de artifacts, rodar testes, aplicar infraestrutura declarativa.
- Arriscado se não for protegido: fazer deploy, publicar um pacote, enviar notificações.
- Tornado seguro com chaves de idempotência, verificações condicionais ou "create if not exists".
Projetando para isso
Prefira operações declarativas e convergentes (aplicar este estado desejado) a operações imperativas e cumulativas (adicionar mais um). Use chaves de idempotência para chamadas externas de modo que duplicatas sejam deduplicadas. Proteja etapas não idempotentes para que um retry detecte a tentativa anterior em vez de repeti-la.
O ângulo da Latchkey
Retries com autocorreção são mais seguros em trabalho idempotente. Os runners gerenciados com autocorreção da Latchkey repetem automaticamente jobs que falham por problemas transitórios e mecânicos para que um contratempo isolado não quebre o seu build, e um design de job idempotente garante que esses retries convirjam de forma limpa sem duplicar efeitos colaterais.
Principais conclusões
- Idempotência significa que muitas execuções têm o mesmo efeito que uma.
- É o que torna retries e re-execuções seguros.
- Builds e testes são naturalmente idempotentes; deploys muitas vezes não são.
- Use operações declarativas e chaves de idempotência para proteger efeitos colaterais.