在 CI/CD 方案中使用开发代理
在 CI/CD 方案中使用开发代理是在受控环境中测试应用程序的好方法。 将开发代理与应用程序中生成 API 请求的测试相结合时,可以涵盖多种方案:从确保应用不使用影子或非生产 API,到检查它是否使用最少的 Microsoft Graph 权限。 虽然确切的配置步骤因 CI/CD 系统而异,但应遵循以下一些一般原则。
配置运行器
在本地计算机上使用开发代理时,它会以交互方式运行,等待你通过按键来控制它。 在 CI/CD 管道中运行时,无法使用密钥控制它。 若要指示开发代理应以非交互方式运行,请将 CI
环境设置为 1
或 true
。
注意
大多数 CI/CD 运行器已 CI
设置环境变量。 但是,如果你使用的是自定义运行器,则可能需要手动设置它。
当开发代理检测到环境变量时 CI
,它不会等待按键。 然后,可以通过向进程发送 SIGINT
信号来正常停止开发代理。 当你记录请求并希望开发代理使用其报告插件对其进行分析时,需要正常关闭开发代理。 CI
如果没有环境变量,开发代理将等待按 Ctrl+C。 停止它的唯一方法是使用 kill -9
或 kill -KILL
强制关闭其进程,这会立即停止开发代理并阻止它分析记录的请求。
安装开发代理
在大多数情况下,运行器未安装开发代理。 因此,在使用开发代理之前,需要先安装它。 安装步骤取决于运行器使用的操作系统。
提示
若要加快管道速度,请考虑缓存开发代理安装文件夹。 这样,就无需在每次运行管道时下载开发代理。 有关确切步骤,请参阅 CI/CD 系统的文档。
在 CI/CD 安装程序中安装开发代理时,可能需要固定安装的开发代理版本。 固定版本可确保管道在每次运行时都使用相同的开发代理版本。 固定版本的确切步骤取决于运行器的操作系统。 下面是如何在基于 Linux 的运行器上固定开发代理版本的示例:
# install Dev Proxy v0.18.0
bash -c "$(curl -sL https://aka.ms/devproxy/setup.sh)" -- v0.18.0
从脚本运行开发代理
在 CI/CD 管道中运行开发代理时,需要从脚本启动它。 必须从脚本启动开发代理,因为要正常关闭开发代理,需要向其进程发送 SIGINT
信号。 只能从启用了作业控件的脚本中关闭进程 SIGINT
。 如果直接从 CI/CD 系统启动开发代理,则开发代理进程会忽略该 SIGINT
信号,并继续运行。
下面是启用了作业控件的 bash 脚本示例,该脚本可启动开发代理:
# enable job control so that we can send SIGINT to Dev Proxy
set -m
# the rest of the script using Dev Proxy
运行开发代理
安装开发代理后,需要启动它。 在 CI/CD 管道中启动开发代理时,请务必在后台启动它。 否则,管道将被阻止,直到停止开发代理。
如果使用基于 Linux 的运行器,可以在后台启动开发代理,方法是在命令末尾添加 &
,例如 ./devproxy/devproxy &
。
等待开发代理启动
在后台启动开发代理时,脚本会立即继续执行。 但是,开发代理需要一些时间才能开始。 若要在开始运行测试之前确保开发代理已准备就绪,请等待它启动。 若要等待开发代理启动,请将其输出记录到文件,然后检查开发代理是否正在侦听 Web 请求,例如:
# 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 请求,请在录制模式下启动开发代理。 可以使用命令行参数通过录制 --record
启动开发代理,例如:
./devproxy/devproxy --record
停止开发代理
完成测试后,通过向开发代理发送 SIGINT
信号来停止开发代理。 可以使用 命令发送 SIGINT
信号 kill
,例如:
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
当所有录制插件完成运行时,开发代理会将 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