在 CI/CD 场景中使用 Dev Proxy

在 CI/CD 方案中使用开发代理是一种在受控环境中测试应用程序的好方法。 将 Dev Proxy 与在应用程序中生成 API 请求的测试相结合时,可以涵盖各种场景:从确保应用不使用影子或非生产环境 API,到检查其是否使用最少的 Microsoft Graph 权限。 虽然确切的配置步骤因 CI/CD 系统而异,但应遵循一些一些一般原则。

在大多数情况下,运行器未安装 Dev Proxy。 因此,在使用 Dev Proxy 开发代理工具之前,您需要安装它。 安装步骤取决于运行程序使用的操作系统。

小窍门

若要加快管道速度,请考虑缓存开发代理安装文件夹。 这样,每次运行管道时都不需要下载开发代理。 有关确切步骤,请参阅 CI/CD 系统的文档。

在 CI/CD 安装中安装开发代理时,通常需要固定所安装的开发代理版本。 固定版本可确保每次运行管道时都使用相同的开发代理版本。 固定版本的确切步骤取决于运行器的操作系统。 下面是如何在 Linux 的运行环境上锁定 Dev Proxy 版本的示例:

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

启动开发代理

安装开发代理后,需要启动它。 在 CI/CD 管道中启动开发代理时,请务必在后台启动它。 否则,您的管道将被阻塞,直到停止 Dev Proxy。

如果使用基于 Linux 的运行程序,可以在后台启动开发代理:

# start Dev Proxy in the background
./devproxy/devproxy &`.

信任开发代理根证书

启动开发代理后,需要在发送请求之前信任开发代理根证书,因为开发代理使用自签名根证书。

开发代理启动时,将在 rootCert.pfx 文件夹中创建 ~/.config/dev-proxy/rootCert 证书。

根据你的权限,可能需要先创建 ~/.config/dev-proxy/rootCert 文件夹,然后再启动开发代理:

# ensure the rootCert folder
echo "Ensuring the Dev Proxy rootCert folder"
mkdir -p ~/.config/dev-proxy/rootCert

# start Dev Proxy
echo "Starting Dev Proxy"
./devproxy/devproxy &

如果使用基于 Linux 的运行程序,可以通过将其复制到系统的受信任 CA 证书存储来安装开发代理根证书:

# export the Dev Proxy's Root Certificate
echo "Exporting the Dev Proxy's Root Certificate"
openssl pkcs12 -in ~/.config/dev-proxy/rootCert.pfx -clcerts -nokeys -out dev-proxy-ca.crt -passin pass:""

# install root certificate
echo "Installing the Dev Proxy's Root Certificate"
sudo cp dev-proxy-ca.crt /usr/local/share/ca-certificates/

# update CA certificates
echo "Updating the CA certificates"
sudo update-ca-certificates

等待开发代理启动

在后台启动开发代理时,脚本将立即执行。 但是,开发代理需要一些时间才能完成启动。 若要确保开发代理在开始发出请求之前准备就绪,请等待它启动。 若要等待开发代理启动,请将其输出记录到文件中,然后检查开发代理是否正在侦听 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 &

# 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

配置代理环境变量

许多应用程序和库使用 http_proxy 环境变量 https_proxy 来确定要用于 HTTP 和 HTTPS 请求的代理服务器。 若要确保应用程序使用开发代理,需要将这些环境变量设置为指向开发代理实例。

export http_proxy=http://127.0.0.1:8000
export https_proxy=http://127.0.0.1:8000

控制开发代理

在 CI/CD 管道中运行开发代理时,无法以交互方式控制它。 相反,可以通过向 开发代理 API 发送请求来控制它。

如果要分析应用发出的 API 请求,可以向终结点发送 POST 请求 /record

curl -X POST http://localhost:8897/proxy/record -H "Content-Type: application/json" -d '{"recording": true}'

若要停止 Dev Proxy,您可以向 /stop 终结点发送 POST 请求。

curl -X POST http://localhost:8897/proxy/stop

停止开发代理进程后,它可能需要花费一段时间才能完全关闭。 若要确保开发代理完成,请等待进程关闭,例如:

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 消息。 看到这些消息中的任何一条消息时,可以确保开发代理已完成处理记录的请求。

示例启动脚本

下面是可用于在 CI/CD 管道中启动开发代理的 bash 脚本的示例:

log_file=devproxy.log

echo "Ensuring Dev Proxy rootCert folder"
mkdir -p ~/.config/dev-proxy/rootCert

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

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

echo "Exporting 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 the Dev Proxy's Root Certificate"
sudo cp dev-proxy-ca.crt /usr/local/share/ca-certificates/

echo "Updating the CA certificates"
sudo update-ca-certificates

echo "Set proxy variables"
export http_proxy=http://127.0.0.1:8000
export https_proxy=http://127.0.0.1:8000