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

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019

빌드가 성공할 때마다 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)을 사용할 수 있습니다.

필수 조건

1. 스택에 대한 파이프라인 만들기

이 섹션의 코드 예제에서는 ASP.NET 웹앱을 배포한다고 가정합니다. 다른 프레임워크에 대한 지침을 조정할 수 있습니다.

Azure Pipelines 에코시스템 지원에 대해 자세히 알아보세요.

  1. Azure DevOps 조직에 로그인하고, 프로젝트로 이동합니다.

  2. Pipelines로 이동한 다음, 새 파이프라인을 선택합니다.

  3. 메시지가 표시되면 소스 코드 위치(Azure Repos Git 또는 GitHub)를 선택합니다.

    로그인할 GitHub로 리디렉션될 수 있습니다. 그렇다면 GitHub 자격 증명을 입력합니다.

  4. 리포지토리 목록이 표시되면 리포지토리를 선택합니다.

  5. Azure Pipelines 앱을 설치하도록 GitHub로 리디렉션될 수 있습니다. 그렇다면 승인 및 설치를 선택합니다.

  6. 구성 탭이 표시되면 ASP.NET Core를 선택합니다.

  7. 새 파이프라인이 표시되면 YAML을 검토하여 수행하는 작업을 확인합니다. 준비가 되면 저장 및 실행을 선택합니다.

2. 배포 작업 추가

  1. YAML 파일의 끝을 클릭한 다음, 도우미 표시를 선택합니다.

  2. 작업 도우미를 사용하여 Azure Web App 작업을 추가합니다.

    Screenshot of Azure web app task.

    또는 Azure App Service 배포(AzureRmWebAppDeployment) 작업을 추가할 수 있습니다.

  3. Azure 구독을 선택합니다. 연결에 대한 권한을 부여해야 합니다. 권한 부여는 필요한 서비스 연결을 만듭니다.

  4. App Service 앱에 따라 앱 유형, 앱 이름런타임 스택을 선택합니다. 전체 YAML은 다음 코드와 유사합니다.

    variables:
      buildConfiguration: 'Release'
    
    steps:
    - script: dotnet build --configuration $(buildConfiguration)
      displayName: 'dotnet build $(buildConfiguration)'
    - 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:
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
- 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>'

예: 슬롯에 배포

다음 예제에서는 스테이징 슬롯에 배포한 다음, 프로덕션 슬롯으로 교환하는 방법을 보여 줍니다.

- 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:
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
- 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)은 다음과 같은 더 많은 사용자 지정 시나리오를 처리할 수 있습니다.

참고 항목

파일 변환 및 변수 대체는 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에 웹 배포할 수 없습니다.를 참조하세요.

다음 단계