Использование прокси-сервера разработки в сценариях CI/CD

Использование Dev Proxy в сценариях CI/CD — отличный способ тестирования приложений в управляемой среде. При объединении прокси-сервера разработчика с тестами, которые создают запросы API в приложении, можно охватить широкий спектр сценариев: от проверки того, что приложение не использует теневые или непроизводственные API, до проверки того, использует ли оно минимальные разрешения Microsoft Graph. Хотя точные шаги настройки зависят от системы CI/CD, ниже приведены некоторые общие принципы, которым следует следовать.

Настройка средства выполнения

Когда вы используете Dev Proxy на локальном компьютере, он запускается в интерактивном режиме, ожидая, когда вы будете управлять им, нажимая клавиши. При запуске в конвейере CI/CD вы не можете управлять им с помощью ключей. Чтобы указать, что прокси-сервер разработчика должен выполняться неинтерактивно, задайте для CI среды 1 значение или true.

Примечание

Для большинства средств выполнения CI/CD уже задана CI переменная среды. Однако если вы используете пользовательское средство выполнения, может потребоваться настроить его вручную.

Когда dev Proxy обнаруживает CI переменную среды, он не ожидает нажатия клавиши. Затем вы можете корректно остановить Dev Proxy, отправив SIGINT сигнал в процесс. Корректное закрытие прокси-сервера разработчика необходимо, когда вы записываете запросы и хотите, чтобы прокси-сервер разработчика анализировал их с помощью подключаемых модулей отчетов. Без переменной CI среды прокси-сервер разработчика будет ожидать нажатия клавиш CTRL+C. Единственный способ остановить его — принудительно закрыть процесс с помощью kill -9 или kill -KILL, который немедленно останавливает прокси-сервер разработки и не позволяет анализировать записанные запросы.

Установка прокси-сервера разработки

В большинстве случаев в средстве выполнения не установлен прокси-сервер разработки. Поэтому, прежде чем использовать прокси-сервер разработки, необходимо установить его. Действия по установке зависят от операционной системы, используемой в средстве выполнения тестов.

Совет

Чтобы ускорить работу конвейера, рассмотрите возможность кэширования папки установки Dev Proxy. Таким образом, вам не нужно будет скачивать прокси-сервер разработки каждый раз при запуске конвейера. Подробные инструкции см. в документации по системе CI/CD.

При установке прокси-сервера разработчика в конфигурации CI/CD, скорее всего, потребуется закрепить установленную версию прокси-сервера разработки. Закрепление версии гарантирует, что при каждом запуске конвейер будет использовать одну и ту же версию прокси-сервера разработки. Точные действия по закреплению версии зависят от операционной системы средства выполнения. Ниже приведен пример того, как можно закрепить версию Dev Proxy в средстве выполнения на основе Linux:

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

Запуск прокси-сервера разработки из скрипта

При запуске прокси-сервера разработки в конвейере CI/CD необходимо запустить его из скрипта. Запуск Dev Proxy из скрипта необходим, так как для корректного закрытия прокси-сервера разработчика необходимо отправить SIGINT сигнал в его процесс. Закрытие процесса с помощью SIGINT возможно только из скрипта с включенным элементом управления заданиями. Если вы запускаете dev Proxy непосредственно из системы CI/CD, процесс прокси-сервера разработки SIGINT игнорирует сигнал и продолжает работать.

Ниже приведен пример скрипта Bash с включенным элементом управления заданиями, который запускает Dev Proxy:

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

# the rest of the script using Dev Proxy

Запуск прокси-сервера разработки

После установки Dev Proxy необходимо запустить его. При запуске прокси-сервера разработки в конвейере CI/CD важно запустить его в фоновом режиме. В противном случае конвейер блокируется, пока вы не остановите прокси-сервер разработки.

Если вы используете средство выполнения на основе Linux, вы можете запустить прокси-сервер разработки в фоновом режиме, добавив & в конце команды, например ./devproxy/devproxy &.

Ожидание запуска прокси-сервера разработки

Когда вы запускаете Dev Proxy в фоновом режиме, скрипт продолжает выполняться немедленно. Однако для запуска прокси-сервера разработки требуется некоторое время. Чтобы убедиться, что прокси-сервер разработчика готов перед запуском тестов, дождитесь его запуска. Чтобы дождаться запуска прокси-сервера разработки, зайдите в журнал его выходные данные в файл, а затем проверьте, прослушивает ли прокси-сервер разработчика веб-запросы, например:

# 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

Запись запросов

Если вы хотите проанализировать запросы API, выданные приложением, запустите Dev Proxy в режиме записи. Вы можете запустить Dev Proxy с записью, используя аргумент командной --record строки, например:

./devproxy/devproxy --record

Остановка прокси-сервера разработки

Завершив работу с тестами, остановите Dev Proxy, отправив SIGINT ему сигнал. Сигнал можно отправить SIGINT с помощью kill команды, например:

kill -INT $proxy_pid

После остановки процесса Dev Proxy может потребоваться некоторое время для его полного закрытия. Это особенно актуально, когда вы настраиваете Dev Proxy для анализа записанных запросов. Чтобы убедиться, что прокси-сервер разработчика завершил обработку записанных запросов, дождитесь завершения процесса, например:

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

Когда все подключаемые модули записи завершают работу, прокси-сервер разработчика DONE выводит сообщение в выходные данные. Если запросов на обработку не было, прокси-сервер разработчика выводит сообщение на No requests to process печать. Если в подключаемом модуле произошла ошибка, то прокси-сервер разработчика выводит сообщение.An error occurred in a plugin Когда вы увидите любое из этих сообщений, вы можете быть уверены, что прокси-сервер разработчика завершил обработку записанных запросов.

Пример сценария

Ниже приведен пример скрипта bash, который запускает прокси-сервер разработки, ожидает его запуска, выполняет тесты, записывает запросы и останавливает Прокси-сервер разработки:

# 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