다음을 통해 공유


CI/CD 시나리오에서 개발 프록시 사용

CI/CD 시나리오에서 개발 프록시를 사용하는 것은 제어된 환경에서 애플리케이션을 테스트하는 좋은 방법입니다. 개발자 프록시를 애플리케이션에서 API 요청을 생성하는 테스트와 결합하는 경우 앱이 섀도 또는 비프로덕션 API를 사용하지 않도록 하는 것부터 최소한의 Microsoft Graph 권한을 사용하는지 확인하는 것까지 다양한 시나리오를 다룰 수 있습니다. 정확한 구성 단계는 CI/CD 시스템에 따라 다르지만 따라야 할 몇 가지 일반적인 원칙은 다음과 같습니다.

실행기 구성

로컬 컴퓨터에서 개발 프록시를 사용하는 경우 키를 눌러 제어할 때까지 대기하면서 대화형으로 실행됩니다. CI/CD 파이프라인에서 실행하는 경우 키로 제어할 수 없습니다. 비대화형으로 실행되도록 개발자 프록시에 지시하려면 환경을 또는 true1 설정합니다CI.

참고

대부분의 CI/CD 실행기에는 이미 환경 변수가 CI 설정되어 있습니다. 그러나 사용자 지정 실행기를 사용하는 경우 수동으로 설정해야 할 수 있습니다.

개발 프록시가 환경 변수를 CI 검색할 때 키 누름을 기다리지 않습니다. 그런 다음 프로세스에 신호를 보내 개발 프록시를 SIGINT 정상적으로 중지할 수 있습니다. 요청을 기록하고 개발자 프록시가 보고 플러그 인을 사용하여 분석하도록 하려면 개발자 프록시를 정상적으로 닫는 것이 필요합니다. 환경 변수가 CI 없으면 개발자 프록시가 CtrlC를 누+ 때까지 기다립니다. 이를 중지하는 유일한 방법은 또는 kill -KILL를 사용하여 kill -9 프로세스를 강제로 닫는 것입니다. 이 경우 개발 프록시가 즉시 중지되고 기록된 요청이 분석되지 않습니다.

개발 프록시 설치

대부분의 경우 실행기에 개발 프록시가 설치되어 있지 않습니다. 따라서 개발자 프록시를 사용하기 전에 설치해야 합니다. 설치 단계는 실행기에서 사용하는 운영 체제에 따라 달라집니다.

파이프라인 속도를 향상하려면 개발 프록시 설치 폴더를 캐싱하는 것이 좋습니다. 이렇게 하면 파이프라인을 실행할 때마다 개발 프록시를 다운로드할 필요가 없습니다. 정확한 단계는 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 &: ).

개발 프록시가 시작될 때까지 기다립니다.

백그라운드에서 개발 프록시를 시작하면 스크립트가 즉시 계속 실행됩니다. 그러나 개발자 프록시를 시작하려면 약간의 시간이 필요합니다. 테스트 실행을 시작하기 전에 개발 프록시가 준비되었는지 확인하려면 개발자 프록시가 시작될 때까지 기다립니다. 개발자 프록시가 시작될 때까지 기다리려면 해당 출력을 파일에 로그한 다음, 개발자 프록시가 웹 요청을 수신 대기하는지 확인합니다. 예를 들면 다음과 같습니다.

# 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 중지합니다. 명령을 사용하여 kill 신호를 보낼 SIGINT 수 있습니다. 예를 들면 다음과 같습니다.

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