Compartilhar via


Usar o Proxy de Desenvolvimento em cenários de CI/CD

Usar o Proxy de Desenvolvimento em cenários de CI/CD é uma ótima maneira de testar seus aplicativos em um ambiente controlado. Ao combinar o Proxy de Desenvolvimento com testes que geram solicitações de API em seu aplicativo, você pode abranger uma ampla variedade de cenários: desde garantir que seu aplicativo não use APIs de sombra ou não de produção até verificar se ele usa permissões mínimas do Microsoft Graph. Embora as etapas de configuração exatas variem dependendo do sistema de CI/CD, aqui estão alguns princípios gerais que você deve seguir.

Configurar seu executor

Quando você usa o Proxy de Desenvolvimento em seu computador local, ele é executado interativamente, aguardando você controlá-lo pressionando as teclas. Ao executá-lo em um pipeline de CI/CD, você não pode controlá-lo com chaves. Para instruir o Proxy de Desenvolvimento que ele deve ser executado de forma não interativa, defina o CI ambiente como 1 ou true.

Observação

A maioria dos executores de CI/CD já tem a CI variável de ambiente definida. No entanto, se você estiver usando um executor personalizado, talvez seja necessário defini-lo manualmente.

Quando o Proxy de Desenvolvimento detecta a CI variável de ambiente, ele não aguarda pressionamentos de tecla. Em seguida, você pode parar o Proxy de Desenvolvimento normalmente enviando um SIGINT sinal para o processo. Fechar o Proxy de Desenvolvimento normalmente é necessário quando você registra solicitações e deseja que o Proxy de Desenvolvimento as analise usando seus plug-ins de relatório. Sem a variável de ambiente, o CI Proxy de Desenvolvimento esperaria que você pressionasse Ctrl+C. A única maneira de interrompê-lo seria fechar com força seu processo usando kill -9 ou kill -KILL, o que interrompe o Proxy de Desenvolvimento imediatamente e impede que ele analise as solicitações registradas.

Instalar o Proxy de Desenvolvimento

Na maioria dos casos, o executor não tem o Proxy de Desenvolvimento instalado. Portanto, antes de usar o Proxy de Desenvolvimento, você precisa instalá-lo. As etapas de instalação dependem do sistema operacional usado pelo executor.

Dica

Para acelerar o pipeline, considere armazenar em cache a pasta de instalação do Proxy de Desenvolvimento. Dessa forma, você não precisará baixar o Proxy de Desenvolvimento sempre que executar o pipeline. Para obter as etapas exatas, consulte a documentação do sistema de CI/CD.

Ao instalar o Proxy de Desenvolvimento em uma configuração de CI/CD, você provavelmente desejará fixar a versão do Proxy de Desenvolvimento instalada. A fixação da versão garante que o pipeline use a mesma versão do Proxy de Desenvolvimento toda vez que você executá-la. As etapas exatas para fixar uma versão dependem do sistema operacional do executor. Aqui está um exemplo de como você pode fixar a versão do Proxy de Desenvolvimento em um executor baseado em Linux:

# install Dev Proxy v0.18.0
bash -c "$(curl -sL https://aka.ms/devproxy/setup.sh)" -- v0.18.0

Executar o Proxy de Desenvolvimento de um script

Ao executar o Proxy de Desenvolvimento em um pipeline de CI/CD, você precisa iniciá-lo a partir de um script. É necessário iniciar o Proxy de Desenvolvimento de um script, pois para fechar o Proxy de Desenvolvimento normalmente, você precisa enviar um SIGINT sinal para o processo. Fechar um processo usando SIGINT só é possível de um script com o controle de trabalho habilitado. Se você iniciar o Proxy de Desenvolvimento diretamente do sistema de CI/CD, o processo de Proxy de Desenvolvimento ignorará o SIGINT sinal e continuará em execução.

Aqui está um exemplo de um script bash com controle de trabalho habilitado que inicia o Proxy de Desenvolvimento:

# enable job control so that we can send SIGINT to Dev Proxy
set -m

# the rest of the script using Dev Proxy

Executar Proxy de Desenvolvimento

Depois de instalar o Proxy de Desenvolvimento, você precisa iniciá-lo. Ao iniciar o Proxy de Desenvolvimento em um pipeline de CI/CD, é importante iniciá-lo em segundo plano. Caso contrário, o pipeline será bloqueado até que você pare o Proxy de Desenvolvimento.

Se você estiver usando um executor baseado em Linux, poderá iniciar o Proxy de Desenvolvimento em segundo plano adicionando & ao final do comando, por exemplo ./devproxy/devproxy &.

Aguarde o início do Proxy de Desenvolvimento

Quando você inicia o Proxy de Desenvolvimento em segundo plano, o script continua sendo executado imediatamente. No entanto, o Proxy de Desenvolvimento precisa de algum tempo para começar. Para garantir que o Proxy de Desenvolvimento esteja pronto antes de começar a executar seus testes, aguarde até que ele seja iniciado. Para aguardar o início do Proxy de Desenvolvimento, registre sua saída em um arquivo e verifique se o Proxy de Desenvolvimento está escutando solicitações da Web, por exemplo:

# log file path
log_file=devproxy.log

# start Dev Proxy in the background
# log Dev Proxy output to the log file
# log stdout and stderr to the file
./devproxy/devproxy > $log_file 2>&1 &

# store the Dev Proxy process ID
proxy_pid=$!

# wait for init
echo "Waiting for Dev Proxy to start..."
while true; do
  if grep -q "Listening on 127.0.0.1:8000" $log_file; then
    break
  fi
  sleep 1
done

# the rest of your script

Registrar solicitações

Se você quiser analisar as solicitações de API emitidas pelo aplicativo, inicie o Proxy de Desenvolvimento no modo de gravação. Você pode iniciar o Proxy de Desenvolvimento com gravação usando o --record argumento de linha de comando, por exemplo:

./devproxy/devproxy --record

Parar Proxy de Desenvolvimento

Depois de terminar seus testes, interrompa o Proxy de Desenvolvimento enviando um SIGINT sinal para ele. Você pode enviar o SIGINT sinal usando o kill comando , por exemplo:

kill -INT $proxy_pid

Depois de interromper o processo de Proxy de Desenvolvimento, pode levar um momento para que ele seja totalmente fechado. Esse é especialmente o caso, quando você configura o Proxy de Desenvolvimento para analisar solicitações registradas. Para garantir que o Proxy de Desenvolvimento tenha terminado de processar as solicitações registradas, aguarde até que o processo seja fechado, por exemplo:

echo "Waiting for Dev Proxy to complete..."
while true; do
  if grep -q -e "DONE" -e "No requests to process" -e "An error occurred in a plugin" $log_file; then
    break
  fi
  sleep 1
done

Quando todos os plug-ins de gravação terminarem de ser executados, o Proxy de Desenvolvimento imprimirá a DONE mensagem na saída. Se não houver solicitações a serem processadas, o Proxy de Desenvolvimento imprimirá a No requests to process mensagem. Se ocorrer um erro em um plug-in, o Proxy de Desenvolvimento imprimirá a An error occurred in a plugin mensagem. Ao ver qualquer uma dessas mensagens, você pode ter certeza de que o Proxy de Desenvolvimento terminou de processar as solicitações registradas.

Script de exemplo

Aqui está um exemplo de um script bash que inicia o Proxy de Desenvolvimento, aguarda o início, executa testes, registra solicitações e interrompe o Proxy de Desenvolvimento:

# enable job control so that we can send SIGINT to Dev Proxy
set -m

log_file=devproxy.log

echo "Starting Dev Proxy..."

# start Dev Proxy in the background
# log Dev Proxy output to the log file
# log stdout and stderr to the file
./devproxy/devproxy --record > $log_file 2>&1 &

proxy_pid=$!

# wait for init
echo "Waiting for Dev Proxy to start..."
while true; do
  if grep -q "Recording" $log_file; then
    break
  fi
  sleep 1
done

# From: https://www.eliostruyf.com/playwright-microsoft-dev-proxy-github-actions/
# setup certificates
echo "Export the Dev Proxy's Root Certificate"
openssl pkcs12 -in ~/.config/dev-proxy/rootCert.pfx -clcerts -nokeys -out dev-proxy-ca.crt -passin pass:""

echo "Installing certutil..."
sudo apt install libnss3-tools

echo "Adding certificate to the NSS database for Chromium..."
mkdir -p $HOME/.pki/nssdb
certutil --empty-password -d $HOME/.pki/nssdb -N 
certutil -d sql:$HOME/.pki/nssdb -A -t "CT,," -n dev-proxy-ca.crt -i dev-proxy-ca.crt
echo "Certificate trusted." 

echo "Running Playwright tests..."
npm test

# send SIGINT to Dev Proxy to close it gracefully
echo "Stopping Dev Proxy..."
kill -INT $proxy_pid

echo "Waiting for Dev Proxy to complete..."
while true; do
  if grep -q -e "DONE" -e "No requests to process" -e "An error occurred in a plugin" $log_file; then
    break
  fi
  sleep 1
done