Freigeben über


Verwenden des Dev Proxys in CI/CD-Szenarien

Die Verwendung des Dev Proxys in CI/CD-Szenarien ist eine hervorragende Möglichkeit, Ihre Anwendungen in einer kontrollierten Umgebung zu testen. Wenn Sie Dev Proxy mit Tests kombinieren, die API-Anforderungen in Ihrer Anwendung generieren, können Sie eine Vielzahl von Szenarien abdecken: von der Sicherstellung, dass Ihre App keine Schatten- oder Nichtproduktions-APIs verwendet, bis hin zur Überprüfung, ob sie minimale Microsoft Graph-Berechtigungen verwendet. Obwohl die genauen Konfigurationsschritte abhängig von Ihrem CI/CD-System variieren, finden Sie hier einige allgemeine Prinzipien, die Sie befolgen sollten.

Konfigurieren Ihres Runners

Wenn Sie den Dev Proxy auf Ihrem lokalen Computer verwenden, wird er interaktiv ausgeführt und wartet darauf, dass Sie ihn durch Drücken der Tasten steuern. Wenn Sie es in einer CI/CD-Pipeline ausführen, können Sie sie nicht mit Schlüsseln steuern. Um den Dev Proxy anzuweisen, dass er nicht interaktiv ausgeführt werden soll, legen Sie die CI Umgebung auf oder truefest1.

Hinweis

Die meisten CI/CD-Runner verfügen bereits über die CI Umgebungsvariablen. Wenn Sie jedoch einen benutzerdefinierten Runner verwenden, müssen Sie ihn möglicherweise manuell festlegen.

Wenn der Dev Proxy die CI Umgebungsvariable erkennt, wartet er nicht auf Tastendrücke. Anschließend können Sie den Dev Proxy ordnungsgemäß beenden, indem Sie ein SIGINT Signal an den Prozess senden. Das ordnungsgemäße Schließen des Dev Proxys ist erforderlich, wenn Sie Anforderungen aufzeichnen und möchten, dass Dev Proxy sie mithilfe seiner Reporting-Plug-Ins analysieren soll. Ohne die Umgebungsvariable CI wartet der Dev Proxy darauf, dass Sie STRG+C drücken. Die einzige Möglichkeit, den Prozess zu beenden, wäre das erzwungene Schließen des Prozesses mit kill -9 oder kill -KILL, wodurch dev proxy sofort beendet und verhindert wird, dass die aufgezeichneten Anforderungen analysiert werden.

Installieren des Dev Proxys

In den meisten Fällen ist auf Ihrem Runner kein Dev Proxy installiert. Bevor Sie den Dev Proxy verwenden können, müssen Sie ihn also installieren. Die Installationsschritte hängen vom Betriebssystem ab, das Ihr Runner verwendet.

Tipp

Um Ihre Pipeline zu beschleunigen, sollten Sie den Installationsordner des Dev Proxy zwischenspeichern. Auf diese Weise müssen Sie den Dev Proxy nicht jedes Mal herunterladen, wenn Sie Ihre Pipeline ausführen. Die genauen Schritte finden Sie in der Dokumentation Ihres CI/CD-Systems.

Wenn Sie den Dev Proxy in einem CI/CD-Setup installieren, sollten Sie wahrscheinlich die Version des Dev Proxy anheften, die Sie installieren. Durch das Anheften der Version wird sichergestellt, dass Ihre Pipeline bei jeder Ausführung dieselbe Version des Dev Proxys verwendet. Die genauen Schritte zum Anheften einer Version hängen vom Betriebssystem Ihres Runners ab. Hier sehen Sie ein Beispiel dafür, wie Sie die Version von Dev Proxy an einen Linux-basierten Runner anheften können:

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

Ausführen des Dev Proxys aus einem Skript

Wenn Sie den Dev Proxy in einer CI/CD-Pipeline ausführen, müssen Sie ihn über ein Skript starten. Das Starten des Dev Proxys über ein Skript ist erforderlich, da Sie zum ordnungsgemäßen Schließen des Dev Proxys ein SIGINT Signal an den Prozess senden müssen. Das Schließen eines Prozesses mit SIGINT ist nur über ein Skript mit aktivierter Auftragssteuerung möglich. Wenn Sie den Dev Proxy direkt über Ihr CI/CD-System starten, ignoriert der Dev Proxy-Prozess das SIGINT Signal und wird weiterhin ausgeführt.

Hier sehen Sie ein Beispiel für ein Bash-Skript mit aktivierter Auftragssteuerung, das den Dev-Proxy startet:

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

# the rest of the script using Dev Proxy

Ausführen des Dev-Proxys

Nach der Installation des Dev Proxys müssen Sie ihn starten. Beim Starten des Dev Proxys in einer CI/CD-Pipeline ist es wichtig, dass Sie ihn im Hintergrund starten. Andernfalls wird Ihre Pipeline blockiert, bis Sie den Dev Proxy beenden.

Wenn Sie einen Linux-basierten Runner verwenden, können Sie den Dev Proxy im Hintergrund starten, indem Sie am Ende des Befehls hinzufügen & , z. B ./devproxy/devproxy &. .

Warten, bis der Dev Proxy gestartet wird

Wenn Sie den Dev Proxy im Hintergrund starten, wird die Ausführung Ihres Skripts sofort fortgesetzt. Der Dev Proxy benötigt jedoch einige Zeit, um zu beginnen. Um sicherzustellen, dass der Dev Proxy bereit ist, bevor Sie mit der Ausführung der Tests beginnen, warten Sie, bis er gestartet wird. Um auf den Start des Dev Proxy zu warten, protokollieren Sie die Ausgabe in einer Datei, und überprüfen Sie dann, ob der Dev Proxy auf Webanforderungen lauscht, z. B.:

# 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

Aufzeichnen von Anforderungen

Wenn Sie von Ihrer App ausgegebene API-Anforderungen analysieren möchten, starten Sie den Dev Proxy im Aufzeichnungsmodus. Sie können den Dev Proxy mit der Aufzeichnung starten, indem Sie das --record Befehlszeilenargument verwenden, z. B.:

./devproxy/devproxy --record

Beenden des Dev-Proxys

Nachdem Sie ihre Tests abgeschlossen haben, beenden Sie den Dev Proxy, indem Sie ein SIGINT Signal an ihn senden. Sie können das SIGINT Signal mit dem kill Befehl senden, z. B.:

kill -INT $proxy_pid

Nachdem Sie den Dev Proxy-Prozess beendet haben, kann es einen Moment dauern, bis er vollständig geschlossen ist. Dies ist insbesondere der Fall, wenn Sie den Dev-Proxy konfigurieren, um aufgezeichnete Anforderungen zu analysieren. Um sicherzustellen, dass der Dev Proxy die Verarbeitung der aufgezeichneten Anforderungen abgeschlossen hat, warten Sie, bis der Prozess geschlossen wurde. Beispiel:

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

Wenn alle Aufzeichnungs-Plug-Ins ausgeführt werden, gibt der Dev Proxy die DONE Meldung an die Ausgabe aus. Wenn keine Zu verarbeitenden Anforderungen vorhanden sind, gibt der Dev Proxy die No requests to process Nachricht aus. Wenn in einem Plug-In ein Fehler aufgetreten ist, gibt der Dev Proxy die An error occurred in a plugin Meldung aus. Wenn eine dieser Meldungen angezeigt wird, können Sie sicher sein, dass der Dev Proxy die Verarbeitung der aufgezeichneten Anforderungen abgeschlossen hat.

Beispielskript

Hier sehen Sie ein Beispiel für ein Bash-Skript, das den Dev-Proxy startet, darauf wartet, dass er gestartet wird, Tests ausführt, Anforderungen aufzeichnet und den Dev Proxy beendet:

# 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