연습 - 끌어오기 요청에 대한 임시 환경 만들기
팀 구성원들의 의견에 따르면 다른 팀 구성원에게 검토를 위해 보내기 전에 코드 변경 내용에 대해 자동화된 Bicep Linter 피드백을 받는 것이 유용하다고 합니다. 이제 기여자와 검토자에게 임시 환경에서 코드를 배포하고 검토할 수 있는 기능을 제공하기로 결정했습니다.
이 연습에서는 끌어오기 요청이 열릴 때마다 임시 환경을 배포하고 코드가 끌어오기 요청 분기에 푸시될 때 임시 환경을 다시 배포하도록 끌어오기 요청 워크플로를 업데이트합니다. 또한 끌어오기 요청이 닫히면 자동으로 환경을 삭제하는 다른 워크플로를 만듭니다. Docker 컨테이너 이미지를 사용하기 위해 웹 사이트에 대한 끌어오기 요청을 만들어 변경 내용을 테스트합니다.
프로세스 중에 다음을 수행합니다.
- 임시 환경을 배포하도록 끌어오기 요청 워크플로를 업데이트합니다.
- 임시 환경을 삭제하도록 끌어오기 요청 삭제 워크플로를 만듭니다.
- 끌어오기 요청을 만들고 임시 환경이 생성되는 것을 확인합니다.
- 끌어오기 요청을 승인하고 임시 환경이 삭제되는 것을 확인합니다.
임시 환경을 배포하도록 끌어오기 요청 워크플로 업데이트
시작하려면 먼저 pr-validation 워크플로를 업데이트하여 임시 환경을 만들어야 합니다.
Visual Studio Code 터미널에서 리포지토리의 기본 분기를 확인합니다.
git checkout main
GitHub에서 이전 연습에서 병합한 변경 내용을 포함하는 코드의 최신 버전을 가져옵니다.
git pull
Visual Studio Code에서 .github/workflows/pr-validation.yml 파일을 엽니다.
파일 위쪽에 있는
name
설정 아래에concurrency
설정을 추가합니다.name: pr-validation concurrency: ${{ github.event.number }}
이 설정을 사용하면 동일한 끌어오기 요청에 대한 여러 워크플로가 동시에 실행되지 않으므로 Azure에 리소스를 배포할 때 예기치 않은 결과가 발생할 수 있습니다.
파일 위쪽에서 트리거를 정의하는
on
섹션 아래에permissions
섹션을 정의합니다.name: pr-validation concurrency: ${{ github.event.number }} on: pull_request permissions: id-token: write contents: read
permissions
섹션 아래에 두 개의 새 환경 변수를 추가합니다.name: pr-validation concurrency: ${{ github.event.number }} on: pull_request permissions: id-token: write contents: read env: resourceGroupName: pr_${{ github.event.number }} resourceGroupLocation: westus3
resourceGroupName
환경 변수는 각 임시 환경에 사용해야 하는 리소스 그룹의 이름을 지정합니다. 각 리소스 그룹의 이름은pr_123
입니다(123
: 끌어오기 요청 고유 번호).resourceGroupLocation
환경 변수는 임시 환경이 모두 미국 서부 3 Azure 지역에 배포되어야 함을 지정합니다.lint
작업 아래에 이름이deploy
인 새 작업을 정의합니다.jobs: lint: uses: ./.github/workflows/lint.yml deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: azure/login@v1 name: Sign in to Azure with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
이 작업은 먼저 모든 코드를 GitHub 실행기에서 검사한 다음 Azure 환경에 로그인합니다.
팁
YAML 파일은 들여쓰기를 구분합니다. 이 코드를 입력하든 아니면 붙여넣든, 들여쓰기가 정확해야 합니다. 이 연습 뒷부분에서 파일의 일치 여부를 확인할 수 있도록 전체 YAML 워크플로 정의가 표시됩니다.
환경 변수에 정의된 이름으로 리소스 그룹을 만드는 단계를 추가합니다.
- uses: Azure/cli@v1 name: Create resource group with: inlineScript: | az group create \ --name ${{ env.resourceGroupName }} \ --location ${{ env.resourceGroupLocation }}
리소스 그룹 만들기 단계 후에 Bicep 파일을 리소스 그룹에 배포하는 단계를 추가합니다.
- uses: azure/arm-deploy@v1 id: deploy name: Deploy Bicep file with: failOnStdErr: false deploymentName: ${{ github.run_number }} resourceGroupName: ${{ env.resourceGroupName }} template: ./deploy/main.bicep parameters: > environmentType=Test
배포 단계 후에 워크플로 로그에 임시 환경의 웹 사이트 주소를 표시하는 단계를 추가합니다.
- name: Show website hostname run: | echo "Access the website at this address: https://${{ steps.deploy.outputs.appServiceAppHostName }}"
변경 내용을 저장합니다.
pr-validation.yml 파일이 다음과 같이 표시되는지 확인합니다.
name: pr-validation concurrency: ${{ github.event.number }} on: pull_request permissions: id-token: write contents: read env: resourceGroupName: pr_${{ github.event.number }} resourceGroupLocation: westus3 jobs: lint: uses: ./.github/workflows/lint.yml deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: azure/login@v1 name: Sign in to Azure with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - uses: Azure/cli@v1 name: Create resource group with: inlineScript: | az group create \ --name ${{ env.resourceGroupName }} \ --location ${{ env.resourceGroupLocation }} - uses: azure/arm-deploy@v1 id: deploy name: Deploy Bicep file with: failOnStdErr: false deploymentName: ${{ github.run_number }} resourceGroupName: ${{ env.resourceGroupName }} template: ./deploy/main.bicep parameters: > environmentType=Test - name: Show website hostname run: | echo "Access the website at this address: https://${{ steps.deploy.outputs.appServiceAppHostName }}"
같지 않으면 다음 예제와 일치하도록 업데이트한 후 저장합니다.
Visual Studio Code 터미널에서 변경 내용을 커밋합니다. 아직 원격 리포지토리에 푸시하지 않습니다.
git add . git commit -m "Update pull request validation workflow to deploy an ephemeral environment"
끌어오기 요청 삭제 워크플로 추가
각 끌어오기 요청의 변경 내용을 임시 리소스 그룹에 자동으로 배포하는 워크플로를 만들었습니다. 이제 더 이상 필요하지 않을 때 임시 환경을 삭제하는 두 번째 워크플로를 구성합니다.
.github/workflows 폴더에 pr-closed.yml이라는 새 파일을 만듭니다.
파일 맨 위에서 워크플로 이름을 지정하고, 끌어오기 요청 유효성 검사 워크플로에서 사용한 것과 동일한 동시성 키를 구성하고, 끌어오기 요청이 닫힐 때마다 실행되도록 워크플로를 구성하고, 워크플로가 액세스 토큰을 가져오도록 허용합니다.
name: pr-closed concurrency: ${{ github.event.number }} on: pull_request: types: [closed] permissions: id-token: write contents: read
방금 입력한 코드 아래에서 끌어오기 요청의 임시 환경에 연결된 리소스 그룹의 이름에 대해 환경 변수를 정의합니다.
env: resourceGroupName: pr_${{ github.event.number }}
리소스 그룹 이름은 끌어오기 요청 유효성 검사 워크플로에 사용한 이름과 동일합니다.
추가한 코드 아래에서 이름이
remove
인 새 작업을 정의하고 Azure에 로그인하도록 구성합니다.jobs: remove: runs-on: ubuntu-latest steps: - uses: azure/login@v1 name: Sign in to Azure with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
remove
작업 내에서 Azure CLI를 사용하여 리소스 그룹을 삭제하는 단계를 정의하고,--yes
인수를 사용하여 삭제를 확인합니다.- uses: Azure/cli@v1 name: Delete resource group with: inlineScript: | az group delete \ --name ${{ env.resourceGroupName }} \ --yes
변경 내용을 저장합니다.
pr-closed.yml 파일이 다음과 같이 표시되는지 확인합니다.
name: pr-closed concurrency: ${{ github.event.number }} on: pull_request: types: [closed] permissions: id-token: write contents: read env: resourceGroupName: pr_${{ github.event.number }} jobs: remove: runs-on: ubuntu-latest steps: - uses: azure/login@v1 name: Sign in to Azure with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - uses: Azure/cli@v1 name: Delete resource group with: inlineScript: | az group delete \ --name ${{ env.resourceGroupName }} \ --yes
같지 않으면 다음 예제와 일치하도록 업데이트한 후 저장합니다.
Visual Studio Code 터미널에서 변경 내용을 커밋하고 원격 리포지토리에 푸시합니다.
git add . git commit -m 'Add pull request closed workflow' git push
Bicep 파일 업데이트
다음으로, 웹 사이트의 애플리케이션으로 Docker 컨테이너 이미지를 사용하도록 Bicep 파일을 업데이트합니다.
Visual Studio Code 터미널에서 다음 명령을 실행하여 변경 내용에 대한 새 분기를 만듭니다.
git checkout -b feature/container-app
‘deploy’ 폴더에서 ‘main.bicep’ 파일을 엽니다.
appServiceAppLinuxFrameworkVersion
변수의 값을 업데이트합니다.var appServiceAppLinuxFrameworkVersion = 'DOCKER|dockersamples/static-site:latest'
변경 내용을 저장합니다.
Visual Studio Code 터미널에서 다음 명령을 실행하여 변경 내용을 커밋하고 Git 리포지토리에 푸시합니다.
git add . git commit -m "Use container image for website" git push origin feature/container-app
끌어오기 요청 만들기
끌어오기 요청에서 자동으로 임시 환경을 만들고 관리하도록 워크플로를 정의했습니다. 이제 Bicep 변경 내용에 대한 또 하나의 끌어오기 요청을 만듭니다.
브라우저에서 코드를 선택하고 3개의 분기를 선택합니다.
분기 아래의 feature/container-app 옆의 새 끌어오기 요청을 선택합니다.
끌어오기 요청 만들기를 선택합니다.
임시 환경 생성 확인
끌어오기 요청 세부 정보 페이지에서 상태 검사 항목이 나타날 때까지 기다립니다.
목록에서 배포 작업 옆의 세부 정보를 선택합니다.
배포가 완료될 때까지 기다립니다.
웹 사이트 호스트 이름 표시를 선택합니다.
로그에서 URL을 선택합니다.
웹 사이트가 끌어오기 요청 변경 내용에 정의된 컨테이너 이미지에서 실행 중임을 나타내는 Hello Docker!라는 메시지를 로드 및 표시합니다.
원하는 경우 Azure Portal을 열고 임시 환경의 리소스 그룹으로 이동합니다.
배포된 리소스(스토리지 계정, App Service 및 App Service 요금제)를 검토합니다.
끌어오기 요청 병합
끌어오기 요청을 테스트했으므로 이제 기본 분기에 병합할 수 있습니다.
끌어오기 요청을 선택하고 웹 사이트에 컨테이너 이미지 사용 끌어오기 요청을 선택합니다.
상태 검사가 통과되었습니다.
끌어오기 요청 병합을 선택합니다.
병합 확인을 선택합니다.
리소스 그룹 삭제 검토
브라우저에서 작업을 선택한 다음 왼쪽 창에서 pr-closed 워크플로를 선택합니다.
끌어오기 요청이 닫혔기 때문에 워크플로가 자동으로 호출된 것을 볼 수 있습니다.
로그를 검토할 워크플로를 선택합니다.
워크플로가 Azure에서 리소스 그룹 삭제를 완료하는 데 몇 분 정도 걸릴 수 있습니다.
중요
워크플로 실행이 완료될 때까지 기다릴 필요가 없습니다. 단, 나중에 Azure Portal을 열어서 임시 환경의 리소스 그룹이 성공적으로 삭제되었는지 확인하고 Azure 리소스에 대해 비용이 발생하는 일을 방지해야 합니다.
리소스 정리
모듈을 완료한 후 만든 리소스를 삭제할 수 있습니다.
GitHub 비밀
- GitHub 리포지토리에서 설정>비밀 및 변수>작업으로 이동합니다.
- 각 리포지토리 비밀에 대해 삭제 단추를 선택하고 프롬프트를 따릅니다.
GitHub 리포지토리
- 설정>일반으로 이동합니다.
- 화면 하단으로 스크롤하여 이 리포지토리 삭제를 선택한 후 프롬프트를 따릅니다.
Azure 앱 등록의 페더레이션 자격 증명 및 서비스 원칙.
- 포털 홈페이지에서 Microsoft Entra ID를 검색하고 서비스 목록에서 선택합니다.
- 관리>앱 등록으로 이동합니다.
- 소유 애플리케이션에서 toy-website-auto-review를 선택합니다.
- 삭제를 선택하고 지시를 따릅니다.
- 삭제된 애플리케이션을 선택하여 앱 등록을 영구적으로 삭제합니다.
중요
중복된 앱 등록 및 서비스 주체 이름이 있을 수 있습니다. 올바른 리소스를 삭제하고 있는지 확인하려면 애플리케이션 ID를 확인하는 것이 좋습니다.