Do ficheiro declarado ao código chamado
A aula anterior mostrou um relatório com o digest correto, mas testes que não executavam a candidata. Agora o laboratório chama funções de módulos Python reais criados pelo próprio guião. Existem três diretórios: A representa uma implementação anterior, B uma candidata com defeito e C a correção. Todos expõem o mesmo nome de módulo e o rótulo 1.0. No grupo claimed-B-loaded-A, o relatório calcula o digest de B enquanto a pesquisa carrega A. Os quatro testes passam, mas o gate identifica target-mismatch. A conclusão útil é que A foi exercitada com sucesso naquele conjunto, não que B está aprovada. Conserva essa diferença na linguagem do handover e na decisão de promoção.
Pesquisa explícita e ambiente herdado
Num processo novo, o guião coloca A antes de B em sys.path e observa a origem encontrada. Num segundo par de processos, PYTHONPATH aponta para A enquanto o código acrescenta B ao fim da pesquisa. O processo normal encontra A; o processo com -I ignora a variável e encontra B através da localização acrescentada explicitamente. O ensaio não instala pacotes nem altera a configuração do utilizador. Regista a origem com __file__, confere os bytes do ficheiro e relaciona esses dados com os resultados. Para um serviço real, acrescenta dependências, configuração e runtime relevantes. Não confundas um caminho visível com uma prova completa da cadeia de execução.
O que já está carregado
Outra experiência mantém o mesmo processo. Primeiro importa A; depois troca o diretório de pesquisa para B e volta a importar o mesmo nome. O objeto continua igual e o comportamento continua o de A. Chamar importlib.invalidate_caches não altera esse resultado: invalidar caches dos finders não equivale a remover ou substituir a entrada já existente em sys.modules. No laboratório, um interpretador novo com pesquisa explícita simplifica a comparação de B. Isso não significa que seja seguro reiniciar qualquer serviço de produção sem planeamento. Se o produto usar recarregamento suportado, será necessário compreender referências existentes, dependências e estado. Essa estratégia de recarregamento não foi implementada nem validada neste exercício.
Disco atual e memória anterior
No grupo de substituição controlada, o processo importa B e calcula uma primeira observação. O próprio guião substitui depois o ficheiro pelos bytes de C, sem recarregar o módulo. Uma leitura posterior do disco já corresponde a C, mas a chamada à função continua a devolver o valor de B. Isto limita uma alegação comum: calcular o hash do caminho depois dos testes não reconstitui sozinho os bytes que foram carregados antes. O ensaio é sequencial, com ficheiros próprios; não simula um ataque concorrente. Em contexto real, protege a origem e o percurso de execução e conserva contexto temporal. Não declares imutabilidade, assinatura ou atestação que estes controlos locais não fornecem.
Decisão de entrega e limites
Num caso fictício de APS, o fornecedor apresenta resultados verdes com rótulo 1.0. RUN observa a origem A enquanto a ordem de entrega identifica B. O gestor coordena a correção da pesquisa, pede uma nova execução e mantém os resultados anteriores com o âmbito correto. O objetivo é ligar a correção técnica à evidência de que B passou a ser exercitada. Não basta editar um campo do relatório ou apresentar mais testes contra A. O modo -I ajuda a limitar configuração herdada do Python, mas não é uma sandbox do sistema operativo. O laboratório executa apenas código próprio e não demonstra confinamento de código hostil, proteção de credenciais ou isolamento de rede.
Oficina de diagnóstico
Para uma oficina de vinte minutos, distribui três relatórios: B declarado com A carregado, pesquisa alterada com o mesmo objeto e disco C com comportamento B. Desenvolvimento explica a carga; QA delimita o que cada teste demonstrou; RUN pede os dados necessários para decidir. Cada grupo escreve observação, causa provável, próximo ensaio e responsável. A resposta deve evitar afirmar que uma alteração de ficheiro já atualizou um processo. Esta oficina foi preparada, mas não executada por participantes humanos. Como resumo, distingue identidade declarada, origem observada, estado do processo e resultado funcional. Relaciona esta aula com artefactos, gestão de configuração, troubleshooting e gestão de releases, sem tratar um diagnóstico local como aceitação de produção.
python3 content/labs/cicd-target/run.py --output /tmp/dr-cicd-target-first.json
# Choose a new output path; recorded runtime: CPython 3.13.1.
# claimed-B-loaded-A: four tests pass; gateReasons=[target-mismatch]
# module-cache-survives-path-and-finder-change: sameObject=true
# pythonpath-and-isolated-process: normal loads A; isolated loads B
# disk-change-does-not-replace-loaded-module: disk C, behavior B
# Original owned source modules only; no package installation or hosted CI.O relatório declara a candidata B, mas a pesquisa encontra uma instalação A que passa os quatro testes. O rótulo 1.0 existe nas duas.
Armadilhas comuns
Supor que o digest declarado controla o import, confundir invalidate_caches com recarga ou tratar -I como isolamento de segurança do sistema operativo.
Tópicos relacionados: Identidade de artefactos · Evidência de testes · Gestão de releases
O relatório deve descrever o alvo observado. Uma mudança na pesquisa ou no disco não demonstra, por si só, que o processo passou a executar código novo.
Referência: The import system · CI/CD practices 2026-09; scoped GitHub Actions GitLab Jenkins and Azure DevOps Services documentation