다음을 통해 공유


Azure Pipelines를 사용하여 Azure App Service에 배포

Azure DevOps Services | Azure DevOps Server 2022

이 문서에서는 Azure Pipelines 를 사용하여 Azure App Service에 웹앱을 자동으로 빌드, 테스트 및 배포하는 방법을 설명합니다. 리포지토리의 지정된 분기에 대한 코드 변경을 체크 인할 때마다 실행되는 CI/CD(연속 통합 및 지속적인 업데이트) 파이프라인을 설정할 수 있습니다.

파이프라인은 단계, 작업단계로 구성됩니다. 단계는 파이프라인의 가장 작은 구성 요소이며 미리 패키지된 스크립트인 스크립트 또는 작업일 수 있습니다. 파이프라인을 구성하는 주요 개념 및 구성 요소에 대한 자세한 내용은 주요 Azure Pipelines 개념을 참조하세요.

파이프라인에서 Azure Web App 작업을 사용하여 App Service에 배포할 수 있습니다. 배포에서 XML 매개 변수를 사용하는 것과 같은 더 복잡한 시나리오의 경우 Azure App Service 배포 작업을 사용할 수 있습니다.

필수 조건

중요합니다

GitHub 프로시저 중에 GitHub 서비스 연결을 만들거나 GitHub 로 리디렉션하여 로그인하거나, Azure Pipelines GitHub 앱을 설치하거나, Azure Pipelines 에 권한을 부여하거나, GitHub 조직에 인증하라는 메시지가 표시될 수 있습니다. 화면의 지침에 따라 필요한 프로세스를 완료합니다. 자세한 내용은 GitHub 리포지토리에 대한 액세스를 참조 하세요.

파이프라인 만들기

이 섹션의 코드 예제는 ASP.NET Core 웹앱에 대한 것입니다. 다른 프레임워크에 대한 지침을 조정할 수 있습니다. Azure Pipelines 에코시스템 지원에 대한 자세한 내용은 Azure Pipelines 에코시스템 예제를 참조하세요.

코드 리포지토리에서 azure-pipelines.yml YAML 파일을 만들어 파이프라인을 정의합니다.

  1. Azure DevOps 프로젝트의 왼쪽 탐색 메뉴에서 파이프라인을 선택합니다.
  2. 파이프라인 페이지에서 새 파이프라인 선택하거나 이 파이프라인이 프로젝트의 첫 번째 파이프라인인 경우 파이프라인을 만듭니다.
  3. 코드 위치 화면에서 소스 코드의 위치(Azure Repos Git 또는 GitHub)를 선택합니다. 필요한 경우 GitHub에 로그인합니다.
  4. 리포지토리 선택 화면에서 코드 리포지토리를 선택합니다.
  5. 파이프라인 구성 화면에서 시작 파이프라인을 선택합니다.

파이프라인에 .NET Core(DotNetCoreCLI@2) 작업을 추가하고 앱을 빌드하고 게시합니다.

  1. 파이프라인 YAML 검토 화면에서 줄 뒤의 모든 코드를 삭제합니다steps:.
  2. 파일의 끝을 선택한 다음 오른쪽에 도우미 표시 를 선택합니다.
  3. 작업에서 .NET Core를 선택합니다.
  4. .NET Core 구성 화면의 Azure Resource Manager 연결에서 Azure 구독을 선택한 다음 권한 부여를 선택하여 필요한 서비스 연결을 만듭니다.
  5. 명령에서 게시를 선택합니다.
  6. 웹 프로젝트 게시게시된 프로젝트 Zip 확인란이 선택되어 있는지 확인한 다음 추가를 선택합니다.
  7. 작업이 YAML 파이프라인에 나타납니다. YAML 코드를 검토하여 수행하는 작업을 확인합니다. 준비가 되면 저장 및 실행을 선택한 다음 저장을 선택하고 다시 실행합니다.
  8. 빌드 요약 화면의 작업에서 필요한 사용 권한 링크를 선택합니다. 검사 화면에서 [허용]을 선택한 다음 [허용]을 다시 선택합니다. 여기에 권한을 부여하면 이 파이프라인의 모든 실행에 대해 권한을 부여한 서비스 연결을 사용할 수 있습니다.

파이프라인은 배포 ZIP 파일을 다음 단계에서 사용할 배포 작업에 대한 Azure 아티팩트로 게시합니다.

배포 작업 추가

파이프라인이 성공적으로 실행되면 배포 작업을 추가합니다.

  1. 파이프라인 실행 요약 화면에서 오른쪽 위에 있는 기타 작업 아이콘을 선택한 다음 파이프라인 편집을 선택합니다.
  2. YAML 파일의 끝을 선택하고 작업 목록이 표시되지 않으면 도우미 표시를 선택합니다.
  3. 작업 목록에서 Azure Web App 작업을 검색하여 선택합니다. 또는 Azure App Service 배포 작업을 사용할 수 있습니다.
  4. Azure Web App 구성 화면의 Azure 구독에서 이전 단계에 대해 설정한 것과 동일한 서비스 연결을 선택합니다. 이 연결을 다시 인증할 필요가 없습니다.
  5. 앱 유형의 경우 코드에 따라 Linux의 Azure Web App 또는 Windows의 Azure Web App을 선택합니다.
  6. 앱 이름에 대해 App Service 앱 이름을 선택하거나 입력합니다.
  7. 추가를 선택합니다.
  8. 유효성 검사 및 저장을 선택한 다음 저장을 선택합니다.
  9. 실행을선택한 다음 실행을 다시 선택합니다.

전체 YAML 파이프라인은 다음 코드와 같습니다.

trigger:
- <branch-specification>

pool:
  vmImage: <agent-specification>

steps:
- task: DotNetCoreCLI@2
  inputs:
    azureSubscription: '<your-authorized-service-connection>'
    command: 'publish'
    publishWebProjects: true

- task: AzureWebApp@1
  inputs:
    azureSubscription: '<your-authorized-service-connection>'
    appType: 'webApp'
    appName: '<your-app-name>'
    package: '$(System.DefaultWorkingDirectory)/**/*.zip'
    deploymentMethod: 'auto'  
  • azureSubscription: Azure 구독에 대한 권한 있는 서비스 연결의 이름입니다.
  • appName: 기존 앱의 이름입니다.
  • package: App Service 콘텐츠를 포함하는 패키지 또는 폴더의 파일 경로입니다. 와일드카드가 지원됩니다.

예시

다음 섹션에서는 다양한 종류의 빌드 및 릴리스 파이프라인을 만드는 방법에 대해 설명합니다.

가상 애플리케이션에 배포

Azure Web App 작업은 Azure 웹앱의 루트 애플리케이션에 배포됩니다. VirtualApplication 배포 작업의 속성을 사용하여 특정 가상 애플리케이션에 배포할 수 있습니다.

- task: AzureRmWebAppDeployment@5
  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>'
    WebAppName: '<app-name>'
    ResourceGroupName: '<name of resource group>'
    SourceSlot: staging
    SwapWithProduction: true
  • azureSubscription: Azure 서비스 연결입니다.
  • appType: Linux에서 웹앱에 배포하는 것과 같은 webAppLinux 선택적 앱 유형입니다.
  • appName: 기존 앱의 이름입니다.
  • deployToSlotOrASE: 불리언. 기존 배포 슬롯 또는 App Service 환경에 배포할지 여부입니다.
  • resourceGroupName: 배포할 리소스 그룹의 이름이며, true인 경우 deployToSlotOrASE 필요합니다.
  • slotName: 배포할 슬롯의 이름이며, true인 경우 deployToSlotOrASE 필요합니다. 기본값은 production입니다.
  • package: 앱 콘텐츠가 포함된 패키지 또는 폴더의 파일 경로입니다. 와일드카드가 지원됩니다.
  • SourceSlot: true인 경우 SwapWithProduction 프로덕션으로 전송되는 슬롯입니다.
  • 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'

조건부 배포

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 배포 작업은 웹 배포를 사용하여 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@5
  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 작업은 Azure 웹앱에 배포하는 가장 간단한 방법입니다. 기본적으로 Azure 웹앱에 루트 애플리케이션을 배포합니다.

Azure App Service 배포 태스크는 다음과 같은 더 많은 사용자 지정 시나리오를 처리할 수 있습니다.

  • 일반적으로 IIS(인터넷 정보 서비스) 배포 프로세스를 사용하는 경우 웹 배포를 사용하여 배포합니다.
  • 가상 애플리케이션에 배포합니다.
  • 컨테이너 앱, 함수 앱, WebJobs 또는 API 및 모바일 앱과 같은 다른 앱 유형에 배포합니다.

참고 항목

별도의 파일 변환 태스크는 Azure Pipelines에서 사용할 파일 변환 및 변수 대체도 지원합니다. 파일 변환 태스크를 사용하여 모든 구성 및 매개 변수 파일에 파일 변환 및 변수 대체를 적용할 수 있습니다.

"잘못된 App Service 패키지 또는 폴더 경로가 제공됨"이라는 메시지가 표시되는 이유는 무엇인가요?

YAML 파이프라인에서는 빌드된 웹 패키지가 저장되는 위치와 배포 태스크가 찾는 위치 간에 불일치가 있을 수 있습니다. 기본 AzureWebApp 작업은 배포 $(System.DefaultWorkingDirectory)/**/*.zip를 위해 웹 패키지를 선택합니다. 웹 패키지가 다른 곳에 보관된 경우 매개 변수 값을 수정합니다 package .

"Webdeploy 옵션을 사용하여 게시는 Windows 에이전트를 사용하는 경우에만 지원됩니다"라는 메시지가 표시되는 이유는 무엇인가요?

이 오류는 웹 배포를 사용하여 배포하도록 작업을 구성할 때 AzureRmWebAppDeployment 작업에서 발생하지만 에이전트가 Windows를 실행하지 않습니다. YAML vmImage 매개 변수가 Windows를 지정했는지 확인합니다.

pool:
  vmImage: windows-latest

기본 인증을 사용하지 않도록 설정할 때 웹 배포가 작동하지 않는 이유는 무엇인가요?

Azure App Service 배포 작업을 수행하기 위해 Microsoft Entra ID 인증을 가져오는 방법에 대한 문제 해결 정보는 Windows 에이전트에서 Microsoft Entra ID 인증을 사용하여 Azure App Service에 웹 배포할 수 없습니다.