연습 - 파란색-녹색 배포 패턴 구현하기
Azure Pipelines를 사용하여 다단계 파이프라인 만들기에서는 개발, 테스트, 스테이징 단계에서 웹 애플리케이션을 Azure App Service에 배포하는 기본 배포 파이프라인을 만들었습니다.
여기서는 ‘스테이징’ 단계 중에 ‘파란색-녹색’ 배포 패턴을 적용하여 해당 워크플로에 추가합니다.
이렇게 하려면 다음을 수행합니다.
- ‘스테이징’에 해당하는 App Service 인스턴스에 배포 슬롯을 추가합니다.
- 파이프라인에 작업을 추가하여 배포 슬롯을 교환합니다.
배포 슬롯 추가
여기서는 ‘스테이징’에 해당하는 App Service 인스턴스에 배포 슬롯을 추가합니다.
기본적으로 모든 App Service 인스턴스는 production이라는 기본 슬롯을 제공합니다. 이전 섹션에서 파이프라인을 설정할 때 production 슬롯에 배포했습니다.
App Service 인스턴스에서는 여러 슬롯을 사용할 수 있습니다. 여기서는 ‘스테이징’에 해당하는 App Service 인스턴스에 두 번째 배포 슬롯을 추가합니다. 배포 슬롯의 이름은 swap입니다.
슬롯을 추가하려면 다음을 수행합니다.
Azure Portal로 이동하고 로그인합니다.
메뉴에서 Cloud Shell을 선택합니다. 프롬프트가 표시되면 Bash 환경을 선택합니다.
다음 명령을 실행하여 ‘스테이징’에 해당하는 App Service 인스턴스의 이름을 가져오고 그 결과를
staging
이라는 Bash 변수에 저장합니다.staging=$(az webapp list \ --resource-group tailspin-space-game-rg \ --query "[?contains(@.name, 'tailspin-space-game-web-staging')].{name: name}" \ --output tsv)
--query
인수는 JSON용 쿼리 언어인 JMESPath를 사용합니다. 해당 인수는name
필드에 “tailspin-space-game-web-staging”이 포함된 App Service 인스턴스를 선택합니다.staging
변수를 인쇄하여 올바른 이름을 얻을 수 있는지 확인합니다.echo $staging
출력 예는 다음과 같습니다.
tailspin-space-game-web-staging-1234
다음 명령을 실행하여 스테이징 환경에 swap이라는 슬롯을 추가합니다.
az webapp deployment slot create \ --name $staging \ --resource-group tailspin-space-game-rg \ --slot swap
다음 명령을 실행하여 배포 슬롯의 호스트 이름을 나열합니다.
az webapp deployment slot list \ --name $staging \ --resource-group tailspin-space-game-rg \ --query [].hostNames \ --output tsv
결과는 다음 출력과 유사합니다.
tailspin-space-game-web-staging-25391-swap.azurewebsites.net
해당 호스트 이름은 나중에 사용할 수 있도록 기록해 두세요.
선택적 단계로 브라우저에서 사이트로 이동합니다. 아직 해당 슬롯에 코드를 배포하지 않았기 때문에 기본 홈페이지가 표시됩니다.
기본적으로 배포 슬롯은 인터넷에서 액세스할 수 있습니다. 실제로는 인터넷에서 라우팅할 수 없지만, 팀만 액세스할 수 있는 네트워크에 swap 슬롯을 배치하는 Azure 가상 네트워크를 구성할 수 있습니다. production 슬롯은 계속해서 인터넷에서 연결할 수 있게 유지됩니다.
스테이징에서 배포 슬롯 교환하기
여기서는 AzureAppServiceManage@0 작업을 사용하여 스테이징 환경에서 배포 슬롯을 교환합니다.
해당 작업을 사용하여 슬롯을 시작, 중지, 삭제할 수도 있습니다. 또는 해당 작업을 사용하여 사이트 확장을 설치하거나 App Service에 대한 지속적인 모니터링을 사용하도록 설정할 수 있습니다.
다음 코드를 사용하여 Visual Studio Code에서 azure-pipelines.yml을 수정합니다.
팁
전체 파일을 바꾸거나 강조 표시된 부분만 업데이트할 수 있습니다.
trigger: - '*' variables: buildConfiguration: 'Release' stages: - stage: 'Build' displayName: 'Build the web application' jobs: - job: 'Build' displayName: 'Build job' pool: vmImage: 'ubuntu-20.04' demands: - npm variables: wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot' dotnetSdkVersion: '6.x' steps: - task: UseDotNet@2 displayName: 'Use .NET SDK $(dotnetSdkVersion)' inputs: version: '$(dotnetSdkVersion)' - task: Npm@1 displayName: 'Run npm install' inputs: verbose: false - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)' displayName: 'Compile Sass assets' - task: gulp@1 displayName: 'Run gulp tasks' - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt' displayName: 'Write build info' workingDirectory: $(wwwrootDir) - task: DotNetCoreCLI@2 displayName: 'Restore project dependencies' inputs: command: 'restore' projects: '**/*.csproj' - task: DotNetCoreCLI@2 displayName: 'Build the project - $(buildConfiguration)' inputs: command: 'build' arguments: '--no-restore --configuration $(buildConfiguration)' projects: '**/*.csproj' - task: DotNetCoreCLI@2 displayName: 'Publish the project - $(buildConfiguration)' inputs: command: 'publish' projects: '**/*.csproj' publishWebProjects: false arguments: '--no-build --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(buildConfiguration)' zipAfterPublish: true - publish: '$(Build.ArtifactStagingDirectory)' artifact: drop - stage: 'Dev' displayName: 'Deploy to the dev environment' dependsOn: Build jobs: - deployment: Deploy pool: vmImage: 'ubuntu-20.04' environment: dev variables: - group: Release strategy: runOnce: deploy: steps: - download: current artifact: drop - task: AzureWebApp@1 displayName: 'Azure App Service Deploy: website' inputs: azureSubscription: 'Resource Manager - Tailspin - Space Game' appName: '$(WebAppNameDev)' package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip' - stage: 'Test' displayName: 'Deploy to the test environment' dependsOn: Dev jobs: - deployment: Deploy pool: vmImage: 'ubuntu-20.04' environment: test variables: - group: 'Release' strategy: runOnce: deploy: steps: - download: current artifact: drop - task: AzureWebApp@1 displayName: 'Azure App Service Deploy: website' inputs: azureSubscription: 'Resource Manager - Tailspin - Space Game' appName: '$(WebAppNameTest)' package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip' - stage: 'Staging' displayName: 'Deploy to the staging environment' dependsOn: Test jobs: - deployment: Deploy pool: vmImage: 'ubuntu-20.04' environment: staging variables: - group: 'Release' strategy: runOnce: deploy: steps: - download: current artifact: drop - task: AzureWebApp@1 displayName: 'Azure App Service Deploy: website' inputs: azureSubscription: 'Resource Manager - Tailspin - Space Game' deployToSlotOrASE: 'true' resourceGroupName: 'tailspin-space-game-rg' slotName: 'swap' appName: '$(WebAppNameStaging)' package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip' - task: AzureAppServiceManage@0 displayName: 'Swap deployment slots' inputs: azureSubscription: 'Resource Manager - Tailspin - Space Game' resourceGroupName: 'tailspin-space-game-rg' webAppName: '$(WebAppNameStaging)' sourceSlot: 'swap' targetSlot: 'production' action: 'Swap Slots'
다음 변경 내용에 유의하세요.
- 이제
AzureWebApp@1
작업은 다음 값을 지정합니다.deployToSlotOrASE
가true
로 설정된 경우 기존 배포 슬롯에 배포합니다.resourceGroupName
은 리소스 그룹의 이름을 지정합니다.deployToSlotOrASE
가true
인 경우 해당 값은 필수입니다.slotName
은 배포 슬롯 이름을 지정합니다. 여기서 swap이라는 슬롯에 배포합니다.
- 새 작업인
AzureAppServiceManage@0
은 배포 슬롯을 교환합니다.sourceSlot
과targetSlot
은 교환할 슬롯을 지정합니다.action
은 수행할 작업을 지정합니다. 다시 말하지만, 해당 작업을 사용하여 슬롯을 시작, 중지, 삭제할 수 있습니다. 여기서 “Swap Slots”는 원본 슬롯과 대상 슬롯을 교환하도록 지정합니다.
해당 구성은 항상 swap 슬롯에 배포합니다. 그런 다음 production과 swap 슬롯을 교환합니다. 교환 프로세스를 통해 production이 최신 배포를 가리키는지 확인할 수 있습니다.
- 이제
통합 터미널에서 azure-pipelines.yml을 인덱스에 추가합니다. 변경 내용을 커밋한 후 분기를 GitHub로 푸시합니다.
팁
Git 명령을 실행하기 전에 azure-pipelines.yml을 저장합니다.
git add azure-pipelines.yml git commit -m "Swap deployment slots" git push origin blue-green
Azure Pipelines에서 각 단계를 통해 빌드를 추적합니다.
참고
...'staging' slot did not respond to http ping. (CODE: 417)
오류가 발생하면 앱 서비스를 다시 시작해 보세요. 문제가 지속되면 슬롯에 대한 자동 교환을 다시 설정합니다.
선택적 단계로, 브라우저에서 각 단계에 해당하는 URL로 이동합니다.
웹 사이트를 아직 변경하지 않았지만, Space Game 웹 사이트가 각 App Service 환경에 성공적으로 배포된 것을 확인할 수 있습니다.