Quiz
Clique em "Resposta" para revelar a resposta correta e a explicação.
Integração contínua
Q1. Por que o CatalogApiTest usa Testcontainers em vez de um banco em memória como o H2?
- A. O Testcontainers é mais rápido que o H2
- B. O teste roda o PostgreSQL 17 real (e o Redis): as migrações do Flyway, o dialeto SQL, as constraints e o cache se comportam exatamente como em produção, então um teste que passa diz algo sobre produção
- C. O H2 não pode ser usado com o Spring Boot 4
- D. O GitHub Actions proíbe bancos em memória
Resposta
B — teste contra a dependência real.
Um substituto em memória aceita SQL que o PostgreSQL rejeita (e vice-versa), ignora recursos específicos do PostgreSQL como ON CONFLICT ou índices parciais, e nunca roda as migrações reais. O Testcontainers sobe a imagem real no Docker durante o teste; o preço é de alguns segundos por classe de teste.
Q2. O workflow tem permissions: contents: read no topo, e o job image acrescenta packages: write, id-token: write, attestations: write e security-events: write. Por que não dar write-all ao workflow inteiro?
- A.
write-allnão é YAML válido - B. Privilégio mínimo: um step comprometido (por exemplo, uma dependência maliciosa num teste) só pode fazer o que o token do seu job permite; os jobs de teste não conseguem fazer push de imagens nem reescrever o repositório
- C. Isso deixa o workflow mais rápido
- D. O GitHub cobra por permissões de escrita
Resposta
B — limite o raio de impacto de cada job.
O GITHUB_TOKEN é injetado em todo job. Jobs que rodam código de terceiros (plugins do Maven, dependências de teste) recebem acesso só de leitura; só o job que precisa publicar recebe as permissões para isso, e só enquanto dura.
Q3. Por que toda action é fixada num SHA de commit (aquasecurity/trivy-action@ed142fd…, actions/checkout@3d3c42e…) em vez de numa tag?
- A. Tags não são suportadas para actions de terceiros
- B. Uma tag pode ser movida por quem controla o repositório da action; um SHA completo sempre se refere ao mesmo código, então uma tag sequestrada não consegue injetar código no seu pipeline
- C. SHAs fazem o workflow rodar mais rápido
- D. O Dependabot só funciona com SHAs
Resposta
B — referências imutáveis para código que roda com o seu token.
O sequestro de tags já foi usado em ataques reais à cadeia de suprimentos contra sistemas de CI. Fixar num SHA (com a versão num comentário) torna a referência imutável; o Dependabot então propõe atualizações como pull requests revisáveis.
Cadeia de suprimentos
Q4. O job image faz o build com load: true, escaneia e só então faz o push. Qual é a vantagem sobre fazer o push primeiro e escanear a imagem no registry?
- A. Escanear imagens locais é mais preciso
- B. Uma imagem vulnerável nunca é publicada: se o portão falha, nada chega ao registry, de onde um cluster poderia puxá-la
- C. Só economiza custo de armazenamento no registry
- D. O Trivy não consegue escanear imagens no registry
Resposta
B — portão antes de publicar.
Qualquer coisa no registry pode ir para deploy por alguém (ou por algo, como o Argo CD com uma tag móvel). Falhar antes do push mantém o registry limpo; o push em si é barato porque as camadas já estão no cache do build.
Q5. Por que o portão do Trivy só falha em vulnerabilidades CRITICAL com correção (ignore-unfixed), enquanto o relatório completo lista tudo?
- A. O Trivy não consegue detectar vulnerabilidades sem correção
- B. Um portão precisa ser acionável: bloquear toda mudança por vulnerabilidades que ninguém consegue corrigir hoje deixa o portão permanentemente vermelho, e os times aprendem a contorná-lo; o relatório mantém o resto visível para priorização
- C. Vulnerabilidades HIGH nunca são exploráveis
- D. O GitHub limita os envios de SARIF a achados críticos
Resposta
B — portões sempre vermelhos são ignorados.
O portão para o que você pode e deve corrigir agora (existe uma versão corrigida). Todo o resto vai para a aba Security, onde pode ser triado, aceito com prazo de validade, ou corrigido quando sair um patch.
Q6. O que a atestação de proveniência do build permite verificar com gh attestation verify?
- A. Que a imagem não tem vulnerabilidades
- B. Que este digest exato de imagem foi construído pelo workflow do seu repositório, a partir de um commit específico, nos runners do GitHub — e não foi modificado desde então
- C. Que o SBOM está completo
- D. Que a imagem foi escaneada pelo Trivy
Resposta
B — quem a construiu, a partir de quê, e que ela não foi adulterada.
A atestação é uma declaração assinada (Sigstore, sem chaves, usando a identidade OIDC do job) ligada ao digest da imagem. Uma política de admissão do cluster pode recusar imagens sem proveniência válida do seu repositório — o "S" de SLSA.
Portão de desempenho
Q7. O teste de orçamento tem um cenário warmup de 20 s que não é coberto pelos thresholds. Por quê?
- A. Para economizar minutos de CI
- B. Uma JVM recém-iniciada é mais lenta (compilação JIT, pools e cache vazios): medi-la faria o portão falhar por ruído em vez de por regressões
- C. O k6 precisa de tempo para iniciar os seus usuários virtuais
- D. Thresholds não podem se aplicar ao teste inteiro
Resposta
B — meça o regime estável que você prometeu.
A latência de partida a frio é real e importa para o autoscaling (lab 10), mas o orçamento compara versões do código: precisa medir cada uma no mesmo estado aquecido.
Q8. O orçamento é p95 < 300 ms, e a execução normal mede p95 ≈ 7 ms. Um threshold tão folgado não é inútil?
- A. Sim, deveria ser 8 ms
- B. Não: runners compartilhados de CI são ruidosos, então um threshold apertado falharia aleatoriamente; o portão está lá para pegar regressões grandes (o sleep proposital de 400 ms, uma query N+1), enquanto a tendência dos números ao longo de muitas execuções revela as pequenas
- C. Sim, thresholds sempre devem ser iguais ao valor medido
- D. Não, porque o k6 arredonda as latências
Resposta
B — um portão precisa ter uma taxa baixa de falsos positivos.
Um portão que falha ao acaso ensina as pessoas a clicar em "re-run" até ficar verde — e aí ele não pega nada. Mantenha uma margem, acompanhe os números, aperte de forma deliberada.
GitOps e canary
Q9. Neste lab, o CI nunca roda kubectl apply contra o cluster. Como uma nova versão chega ao deploy?
- A. O Argo CD consulta o GHCR em busca de novas imagens
- B. O workflow
Deployfaz commit da nova tag da imagem emk8s/overlays/gitops; o Argo CD, rodando dentro do cluster, vê o commit e aplica o overlay - C. O Kubernetes puxa a tag
maina cada minuto - D. O desenvolvedor roda
kubectl applydepois do CI
Resposta
B — GitOps baseado em pull.
As credenciais do cluster nunca saem do cluster; o Git guarda o histórico completo e auditado do que foi para deploy; o rollback é um git revert; e o drift é detectado e, com selfHeal, desfeito automaticamente.
Q10. Alguém roda kubectl -n boxoffice scale deployment redis --replicas=0. O que acontece com selfHeal: true?
- A. O Redis fica com 0 réplicas até o próximo deploy
- B. O Argo CD detecta que o cluster difere do Git (
OutOfSync) e restaura 1 réplica em segundos - C. O Argo CD apaga o Deployment do Redis
- D. O HPA escala o Redis de volta
Resposta
B — o Git é a fonte da verdade.
Mudanças manuais são revertidas; para mudar o cluster, você muda o Git. É também por isso que o número de réplicas do HPA não pode estar na spec do Rollout: senão o Argo CD e o HPA brigariam por ele.
Q11. A release ruim (30% de erros) foi abortada com as medições [], 0.068, 0.285 e failureLimit: 1. Por que a primeira medição, vazia, não reprovou a análise?
- A. O Argo Rollouts ignora a primeira medição
- B. A condição de sucesso
len(result) == 0 || isNaN(result[0]) || result[0] < 0.01trata "ainda sem tráfego no canary" como sucesso; o abort veio com a segunda falha (0,068 e 0,285 > 1%), ultrapassandofailureLimit: 1 - C. O Prometheus estava fora do ar
- D. O canary não tinha pods
Resposta
B — trate "sem dados" explicitamente.
Logo depois que um canary começa, a consulta não tem amostras. Sem a proteção len/isNaN, a análise falharia (ou daria erro) imediatamente em toda release. O trade-off: sem tráfego, um canary é promovido sem evidência — mantenha carga sobre o serviço, ou alongue as pausas.
Q12. Durante um canary, a versão antiga e a nova do catalog rodam contra o mesmo banco. Qual mudança de schema é segura de entregar na nova versão?
- A. Renomear uma coluna que a versão antiga lê
- B. Remover uma coluna que a nova versão não usa mais
- C. Adicionar uma nova coluna nullable (expand), com o novo código tolerando a sua ausência
- D. Mudar o tipo de uma coluna no lugar
Resposta
C — expand/contract.
As migrações rodam uma vez, para as duas versões, e a versão antiga continua rodando durante o canary — e depois de um abort. Só mudanças compatíveis com a versão anterior são seguras; o "contract" (remover, renomear) acontece numa release posterior, quando nenhuma versão em execução depende do formato antigo.