Azure Pipelines를 사용하여 App Service에 배포
Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019
참고 항목
2024년 6월 1일부터, 새로 만들어진 모든 App Service 앱에는 명명 규칙 <app-name>-<random-hash>.<region>.azurewebsites.net
을 사용하여 고유한 기본 호스트 이름을 생성할 수 있는 옵션이 제공됩니다. 기존 앱 이름은 변경되지 않은 상태로 유지됩니다.
예: myapp-ds27dh7271aah175.westus-01.azurewebsites.net
자세한 내용은 App Service 리소스의 고유 기본 호스트 이름을 참조하세요.
빌드가 성공할 때마다 Azure Pipelines를 사용하여 웹앱을 Azure App Service에 자동으로 배포합니다. Azure Pipelines를 사용하면 Azure DevOps를 사용하여 CI(연속 통합) 및 CD(지속적인 업데이트)로 빌드, 테스트 및 배포할 수 있습니다.
YAML 파이프라인은 리포지토리의 YAML 파일을 사용하여 정의됩니다. 단계는 파이프라인의 가장 작은 구성 요소이며 스크립트 또는 작업(미리 패키지된 스크립트)일 수 있습니다. 파이프라인을 구성하는 주요 개념 및 구성 요소에 대해 알아봅니다.
Azure Web App 작업(AzureWebApp
)을 사용하여 파이프라인에서 Azure App Service에 배포합니다. 배포에서 XML 매개 변수를 사용해야 하는 것과 같은 더 복잡한 시나리오의 경우 Azure App Service 배포 작업(AzureRmWebAppDeployment)을 사용할 수 있습니다.
필수 조건
- 활성 구독이 있는 Azure 계정. 체험 계정을 만듭니다.
- Azure DevOps 조직. 체험 계정 만들기
- Microsoft 호스팅 에이전트에서 파이프라인을 실행하는 기능. 병렬 작업을 구매하거나 무료 계층을 요청할 수 있습니다.
- GitHub 또는 Azure Repos에서 호스트되는 코드가 있는 작동하는 Azure App Service 앱
- .NET: Azure에서 ASP.NET Core 웹앱 만들기
- ASP.NET: Azure에서 ASP.NET Framework 웹앱 만들기
- JavaScript: Azure App Service에서 Node.js 웹앱 만들기
- Java: Azure App Service에서 Java 앱 만들기
- Python: Azure App Service에서 Python 앱 만들기
1. 스택에 대한 파이프라인 만들기
이 섹션의 코드 예제에서는 ASP.NET 웹앱을 배포한다고 가정합니다. 다른 프레임워크에 대한 지침을 조정할 수 있습니다.
Azure Pipelines 에코시스템 지원에 대해 자세히 알아보세요.
Azure DevOps 조직에 로그인하고, 프로젝트로 이동합니다.
Pipelines로 이동한 다음, 새 파이프라인을 선택합니다.
메시지가 표시되면 소스 코드 위치(Azure Repos Git 또는 GitHub)를 선택합니다.
로그인할 GitHub로 리디렉션될 수 있습니다. 그렇다면 GitHub 자격 증명을 입력합니다.
리포지토리 목록이 표시되면 리포지토리를 선택합니다.
Azure Pipelines 앱을 설치하도록 GitHub로 리디렉션될 수 있습니다. 그렇다면 승인 및 설치를 선택합니다.
구성 탭이 표시되면 ASP.NET Core를 선택합니다.
새 파이프라인이 표시되면 YAML을 검토하여 수행하는 작업을 확인합니다. 준비가 되면 저장 및 실행을 선택합니다.
2. 배포 작업 추가
YAML 파일의 끝을 클릭한 다음, 도우미 표시를 선택합니다.
작업 도우미를 사용하여 Azure Web App 작업을 추가합니다.
또는 Azure App Service 배포(AzureRmWebAppDeployment) 작업을 추가할 수 있습니다.
Azure 구독을 선택합니다. 연결에 대한 권한을 부여해야 합니다. 권한 부여는 필요한 서비스 연결을 만듭니다.
App Service 앱에 따라 앱 유형, 앱 이름 및 런타임 스택을 선택합니다. 전체 YAML은 다음 코드와 유사합니다.
variables: buildConfiguration: 'Release' steps: - task: DotNetCoreCLI@2 inputs: command: 'publish' publishWebProjects: true - task: AzureWebApp@1 inputs: azureSubscription: '<service-connection-name>' appType: 'webAppLinux' appName: '<app-name>' package: '$(System.DefaultWorkingDirectory)/**/*.zip'
- azureSubscription: Azure 구독에 대한 권한 있는 서비스 연결의 이름입니다.
- appName: 기존 앱의 이름입니다.
- package: 앱 서비스 콘텐츠가 포함된 폴더 또는 패키지의 파일 경로입니다. 와일드카드가 지원됩니다.
예: .NET 앱 배포
.zip 웹 패키지(예: ASP.NET 웹앱에서)를 Azure 웹앱에 배포하려면 다음 코드 조각을 사용하여 빌드를 앱에 배포합니다.
variables:
buildConfiguration: 'Release'
steps:
- task: DotNetCoreCLI@2
inputs:
command: 'publish'
publishWebProjects: true
- task: AzureWebApp@1
inputs:
azureSubscription: '<service-connection-name>'
appType: 'webAppLinux'
appName: '<app-name>'
package: '$(System.DefaultWorkingDirectory)/**/*.zip'
- azureSubscription: Azure 구독
- appType: 웹 앱 유형
- appName: 기존 앱 서비스 이름
- package: 패키지 또는 앱 서비스 콘텐츠가 포함된 폴더에 대한 파일 경로 와일드카드가 지원됩니다.
예: 가상 애플리케이션에 배포
기본적으로 배포는 Azure Web App의 루트 애플리케이션에 발생합니다. Azure App Service 배포(AzureRmWebAppDeployment
) 작업의 VirtualApplication
속성을 사용하여 특정 가상 애플리케이션에 배포할 수 있습니다.
- task: AzureRmWebAppDeployment@4
inputs:
VirtualApplication: '<name of virtual application>'
- VirtualApplication: Azure Portal에서 구성된 가상 애플리케이션의 이름입니다. 자세한 내용은 Azure Portal에서 App Service 앱 구성을 참조하세요.
예: 슬롯에 배포
다음 예제에서는 스테이징 슬롯에 배포한 다음, 프로덕션 슬롯으로 교환하는 방법을 보여 줍니다.
- task: AzureWebApp@1
inputs:
azureSubscription: '<service-connection-name>'
appType: webAppLinux
appName: '<app-name>'
deployToSlotOrASE: true
resourceGroupName: '<name of resource group>'
slotName: staging
package: '$(Build.ArtifactStagingDirectory)/**/*.zip'
- task: AzureAppServiceManage@0
inputs:
azureSubscription: '<service-connection-name>'
appType: webAppLinux
WebAppName: '<app-name>'
ResourceGroupName: '<name of resource group>'
SourceSlot: staging
SwapWithProduction: true
- azureSubscription: Azure 구독
- appType: (선택 사항) Linux의 Web App에 배포하려면
webAppLinux
를 사용합니다. - appName: 기존 앱 서비스 이름
- deployToSlotOrASE: 부울. 기존 배포 슬롯 또는 Azure App Service Environment에 배포합니다.
- resourceGroupName: 리소스 그룹의 이름입니다.
deployToSlotOrASE
가 true인 경우 필수입니다. - slotName: 슬롯 이름. 기본값은
production
입니다.deployToSlotOrASE
가 true인 경우 필수입니다. - package: 패키지 또는 앱 서비스 콘텐츠가 포함된 폴더에 대한 파일 경로 와일드카드가 지원됩니다.
- SourceSlot:
SwapWithProduction
이 true인 경우 프로덕션에 보내지는 슬롯입니다. - SwapWithProduction: 부울. 원본 슬롯의 트래픽을 프로덕션과 교환합니다.
예: 여러 웹앱에 배포
YAML 파일의 jobs를 사용하여 배포 파이프라인을 설정할 수 있습니다. 작업을 사용하면 여러 웹앱에 대한 배포 순서를 제어할 수 있습니다.
jobs:
- job: buildandtest
pool:
vmImage: ubuntu-latest
steps:
# publish an artifact called drop
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Build.ArtifactStagingDirectory)'
artifactName: drop
# deploy to Azure Web App staging
- task: AzureWebApp@1
inputs:
azureSubscription: '<service-connection-name>'
appType: <app type>
appName: '<staging-app-name>'
deployToSlotOrASE: true
resourceGroupName: <group-name>
slotName: 'staging'
package: '$(Build.ArtifactStagingDirectory)/**/*.zip'
- job: deploy
dependsOn: buildandtest
condition: succeeded()
pool:
vmImage: ubuntu-latest
steps:
# download the artifact drop from the previous job
- task: DownloadPipelineArtifact@2
inputs:
source: 'current'
artifact: 'drop'
path: '$(Pipeline.Workspace)'
- task: AzureWebApp@1
inputs:
azureSubscription: '<service-connection-name>'
appType: <app type>
appName: '<production-app-name>'
resourceGroupName: <group-name>
package: '$(Pipeline.Workspace)/**/*.zip'
예: 변수 대체 만들기
대부분의 언어 스택에서 앱 설정 및 연결 문자열은 런타임에 환경 변수로 설정할 수 있습니다.
하지만 Web.config에 변수를 대체하려는 다른 이유가 있습니다. 이 예제에서 Web.config 파일에는 connectionString
이라는 연결 문자열이 포함되어 있습니다. 각 웹앱에 배포하기 전에 값을 변경할 수 있습니다. 이 작업은 Web.config 변환을 적용하거나 Web.config 파일에서 변수를 대체하여 수행할 수 있습니다.
다음 코드 조각은 Azure App Service 배포(AzureRmWebAppDeployment
) 작업을 사용하여 변수 대체의 예를 보여줍니다.
jobs:
- job: test
variables:
connectionString: <test-stage connection string>
steps:
- task: AzureRmWebAppDeployment@4
inputs:
azureSubscription: '<Test stage Azure service connection>'
WebAppName: '<name of test stage web app>'
enableXmlVariableSubstitution: true
- job: prod
dependsOn: test
variables:
connectionString: <prod-stage connection string>
steps:
- task: AzureRmWebAppDeployment@4
inputs:
azureSubscription: '<Prod stage Azure service connection>'
WebAppName: '<name of prod stage web app>'
enableXmlVariableSubstitution: true
예: 조건부 배포
YAML에서 이 작업을 수행하려면 다음 기술 중 하나를 사용할 수 있습니다.
- 배포 단계를 별도의 작업으로 격리하고, 조건을 해당 작업에 추가합니다.
- 조건을 단계에 추가합니다.
다음 예제에서는 단계 조건을 사용하여 주 분기에서 시작되는 빌드만 배포하는 방법을 보여 줍니다.
- task: AzureWebApp@1
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
inputs:
azureSubscription: '<service-connection-name>'
appName: '<app-name>'
조건에 대한 자세한 내용은 조건 지정을 참조하세요.
예: 웹 배포를 사용하여 배포
Azure App Service 배포(AzureRmWebAppDeployment
) 작업은 웹 배포를 사용하여 App Service에 배포할 수 있습니다.
trigger:
- main
pool:
vmImage: windows-latest
variables:
buildConfiguration: 'Release'
steps:
- task: DotNetCoreCLI@2
inputs:
command: 'publish'
publishWebProjects: true
arguments: '--configuration $(buildConfiguration)'
zipAfterPublish: true
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: '<service-connection-name>'
appType: 'webApp'
WebAppName: '<app-name>'
packageForLinux: '$(System.DefaultWorkingDirectory)/**/*.zip'
enableCustomDeployment: true
DeploymentType: 'webDeploy'
자주 묻는 질문
AzureWebApp
작업과 AzureRmWebAppDeployment
작업의 차이점은 무엇인가요?
Azure Web App 작업(AzureWebApp
)은 Azure Web App에 배포하는 가장 간단한 방법입니다. 기본적으로 배포는 Azure Web App의 루트 애플리케이션에 발생합니다.
Azure App Service 배포 작업(AzureRmWebAppDeployment
)은 다음과 같은 더 많은 사용자 지정 시나리오를 처리할 수 있습니다.
- 웹 패키지 및 XML 매개 변수 파일 내에서 구성 설정을 수정합니다.
- IIS 배포 프로세스에 익숙한 경우 웹 배포를 사용하여 배포합니다.
- 가상 애플리케이션에 배포합니다.
- 컨테이너 앱, 함수 앱, WebJobs 또는 API 및 모바일 앱과 같은 다른 앱 유형에 배포합니다.
참고 항목
파일 변환 및 변수 대체는 Azure Pipelines에서 사용하는 별도의 파일 변환 작업에서도 지원됩니다. 파일 변환 작업을 사용하여 파일 변환 및 변수 대체를 구성 및 매개 변수 파일에 적용할 수 있습니다.
"잘못된 App Service 패키지 또는 폴더 경로를 제공했습니다."라는 메시지가 표시됩니다.
YAML 파이프라인에서 파이프라인에 따라 빌드된 웹 패키지가 저장되는 위치와 배포 작업이 이를 찾는 위치가 일치하지 않을 수 있습니다. 예를 들어 AzureWebApp
작업은 배포용 웹 패키지를 선택합니다. 예를 들어 AzureWebApp 작업은 $(System.DefaultWorkingDirectory)/**/*.zip
에서 찾습니다. 웹 패키지가 다른 곳에 보관된 경우 package
값을 수정합니다.
"웹 배포 옵션을 사용한 게시는 Windows 에이전트를 사용할 경우에만 지원됩니다."라는 메시지가 표시됩니다.
이 오류는 웹 배포를 사용하여 배포하도록 작업을 구성했지만 에이전트가 Windows를 실행하지 않는 경우 AzureRmWebAppDeployment 작업에서 발생합니다. YAML에 다음 코드와 비슷한 것이 있는지 확인하세요.
pool:
vmImage: windows-latest
기본 인증을 사용하지 않도록 설정하면 웹 배포가 작동하지 않습니다.
AzureRmWebAppDeployment
작업과 함께 작동하도록 Microsoft Entra ID 인증을 받는 방법에 대한 문제 해결 정보는 Windows 에이전트에서 Microsoft Entra ID 인증을 사용하여 Azure App Service에 웹 배포할 수 없습니다.를 참조하세요.
다음 단계
- Azure DevOps 파이프라인을 사용자 지정합니다.