在 CI/CD 情境中使用 Dev Proxy 是在受控環境中測試應用程式的絕佳方式。 當您將 Dev Proxy 與在應用程式中產生 API 要求的測試相結合時,可以涵蓋各種不同的情境:從確保應用程式不會使用陰影或非生產 API,到確認其僅使用最低限度的 Microsoft Graph 權限。 雖然確切的設定步驟會根據您的 CI/CD 系統而有所不同,但以下是您應該遵循的一些一般原則。
在大部分情況下,您的執行器未安裝開發代理。 在您可以使用 Dev Proxy 之前,您需要先安裝它。 的安裝步驟 取決於您的執行器所使用的操作系统。
提示
為了加速流水線,您可以考慮對開發 Proxy 的安裝資料夾進行快取。 如此一來,您就不需要在每次執行管道時下載 Dev Proxy。 如需確切步驟,請參閱 CI/CD 系統的文件。
在 CI/CD 設定中安裝 Dev Proxy 時,您通常會想要固定所安裝的 Dev Proxy 版本。 鎖定版本可確保每次執行管線時都使用相同的 Dev Proxy 版本。 釘選版本的確切步驟取決於您的執行環境的作業系統。 以下是如何在以 Linux 為基礎的執行器上鎖定 Dev Proxy 版本的範例:
# install Dev Proxy v1.0.0
bash -c "$(curl -sL https://aka.ms/devproxy/setup.sh)" -- v1.0.0
啟動開發代理伺服器
安裝開發 Proxy 之後,您必須啟動它。 在 CI/CD 管線中啟動 Dev Proxy 時,請務必在背景中啟動它。 否則,您的管線會遭到封鎖,直到您停止開發 Proxy 為止。
如果您使用以 Linux 為基礎的執行器,您可以在背景中啟動 Dev Proxy:
# start Dev Proxy in the background
./devproxy/devproxy &`.
信任開發代理伺服器根證書
啟動 Dev Proxy 之後,您必須在傳送請求之前信任 Dev Proxy 的根憑證,因為 Dev Proxy 使用的是自我簽署的根憑證。
當 Dev Proxy 啟動時,rootCert.pfx 憑證會建立在 ~/.config/dev-proxy/rootCert 資料夾中。
視您的許可權而定,您可能需要在開始開發 Proxy 之前,先建立 ~/.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 為基礎的執行環境,您可以將 Dev Proxy 根憑證複製到系統信任的 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
等待開發代理伺服器啟動
當您在背景啟動開發 Proxy 時,腳本會立即執行。 不過,開發 Proxy 需要一些時間才能開始。 若要確定 Dev Proxy 已準備就緒,再開始發出要求,請等候它啟動。 若要等候開發 Proxy 啟動,請將其輸出記錄至檔案,然後檢查 Dev Proxy 是否正在接聽 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
設定 Proxy 環境變數
許多應用程式和連結庫都會使用 http_proxy 和 https_proxy 環境變數來判斷要用於 HTTP 和 HTTPS 要求的 Proxy 伺服器。 若要確保您的應用程式使用 Dev Proxy,您必須將這些環境變數設定為指向 Dev Proxy 實例。
export http_proxy=http://127.0.0.1:8000
export https_proxy=http://127.0.0.1:8000
控制開發人員 Proxy
當您在 CI/CD 管線中執行開發 Proxy 時,您無法以互動方式控制它。 相反地,您可以將要求傳送至 開發 Proxy API 來控制它。
如果您要分析應用程式發出的 API 要求,您可以將要求傳送 POST 至 /record 端點:
curl -X POST http://localhost:8897/proxy/record -H "Content-Type: application/json" -d '{"recording": true}'
若要停止 Dev Proxy,您可以將POST要求傳送至/stop端點:
curl -X POST http://localhost:8897/proxy/stop
停止 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
當所有錄製外掛程式都執行完畢時,Dev Proxy 會將 DONE 訊息列印至輸出。 如果沒有處理要求,Dev Proxy 會列印 No requests to process 訊息。 如果外掛程式發生錯誤,Dev Proxy 會列印 An error occurred in a plugin 訊息。 當您看到上述任何訊息時,您可以確定 Dev Proxy 已完成處理記錄的要求。
範例啟動腳本
以下是可用來在 CI/CD 管線中啟動開發 Proxy 的 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