Azure Web App 배포

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018

참고

Microsoft TFS(Team Foundation Server) 2018 이하 버전에서 빌드 및 릴리스 ‘파이프라인’은 ‘정의’라고 하며 ‘실행’은 ‘빌드’, ‘서비스 연결’은 ‘서비스 엔드포인트’, ‘스테이지’는 ‘환경’, ‘작업’은 ‘단계’라고 합니다.

Azure Pipelines 사용하여 모든 성공적인 빌드에서 Azure App Service 웹앱을 자동으로 배포합니다. Azure Pipelines를 사용하면 Azure DevOps를 사용하여 CI(연속 통합) 및 CD(지속적인 업데이트)를 빌드, 테스트 및 배포할 수 있습니다.

YAML 파이프라인은 리포지토리의 YAML 파일을 사용하여 정의됩니다. 단계는 파이프라인의 가장 작은 구성 요소이며 스크립트 또는 작업(미리 패키지된 스크립트)일 수 있습니다. 파이프라인을 구성하는 주요 개념 및 구성 요소에 대해 알아봅니다.

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

Linux 컨테이너용 Azure Web App에 배포하는 방법을 알아보려면 Azure Web App 컨테이너 배포를 참조하세요.

필수 구성 요소

다음 항목이 있는지 확인합니다.

  • 리포지토리를 만들 수 있는 GitHub 계정입니다. 체험 계정 만들기

  • Azure DevOps 조직. 체험 계정 만들기 팀에 이미 있는 경우 사용하려는 Azure DevOps 프로젝트의 관리자인지 확인합니다.

  • Microsoft 호스팅 에이전트에서 파이프라인을 실행하는 기능. 병렬 작업을 구매하거나 무료 계층을 요청할 수 있습니다.

Azure Portal Azure App Service 만들기

Linux에서 Azure App Service 만들거나 Azure Cloud Shell 사용하여 Windows. 시작하기:

  1. Azure Portal에 로그인합니다.
  2. 포털의 위쪽 탐색 창에서 Cloud Shell을 시작합니다. Open the Cloud Shell.

자세한 내용은 Azure Cloud Shell 개요를 참조하세요.

Linux에서 Azure App Service 만듭니다.

# Create a resource group
az group create --location eastus2 --name myapp-rg

# Create an app service plan of type Linux
az appservice plan create -g myapp-rg -n myapp-service-plan --is-linux

# Create an App Service from the plan 
az webapp create -g myapppipeline-rg -p myapp-service-plan -n my-app-dotnet --runtime "DOTNETCORE|3.1" 

Azure Pipelines 사용하여 앱 빌드

.NET 프로젝트 만들기

사용할 .NET 프로젝트가 없는 경우 새 프로젝트를 만들고 코드를 GitHub 리포지토리 또는 Azure Repos 업로드합니다. 먼저 최신 .NET 6.0 SDK 를 설치합니다.

새 .NET 6 웹앱을 만듭니다.

dotnet new webapp -f net6.0

동일한 터미널 세션에서 프로젝트 디렉터리의 명령을 사용하여 애플리케이션을 dotnet run 로컬로 실행합니다.

dotnet run

코드 업로드

코드를 새 웹앱 GitHub 또는 Azure Repos 업로드.

파이프라인 만들기

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

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

  3. 먼저 소스 코드의 위치로 GitHub를 선택하여 마법사의 단계를 진행합니다.

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

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

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

  7. 구성 탭이 나타나면 ASP.NET Core 선택합니다.

  8. 새 파이프라인이 나타나면 YAML에서 수행하는 작업을 확인합니다. 준비가 되면 저장 및 실행을 선택합니다.

Azure Web App 작업 추가

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

    Azure web app task.

  2. 연결 유형에 대한 Azure Resource Manager 선택하고 Azure 구독을 선택합니다. 연결 에 권한을 부여 해야 합니다.

  3. Linux에서 웹앱을 선택하고 , appNamepackage.를 입력합니다azureSubscription. 전체 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: '<Azure service connection>'
        appType: 'webAppLinux'
        appName: '<Name of web app>'
        package: '$(System.DefaultWorkingDirectory)/**/*.zip'
    
    • azureSubscription: Azure 구독
    • appName: 기존 앱 서비스 이름
    • package: 패키지 또는 앱 서비스 콘텐츠가 포함된 폴더에 대한 파일 경로 와일드카드가 지원됩니다.

새 사용자에게 YAML 파이프라인을 사용하여 Azure DevOps Server 2019에서 배포하도록 권장하지는 않습니다. 숙련된 파이프라인 사용자이고 .NET Core 앱을 빌드하기 위한 YAML 파이프라인이 이미 있는 경우 아래 예제가 유용할 수 있습니다.

YAML은 TFS에서 지원되지 않습니다.

이제 이 항목의 나머지 부분을 읽고 사용자가 Azure Web App 배포를 사용자 지정하기 위해 변경하는 몇 가지 일반적인 변경 내용을 알아볼 준비가 되었습니다.

Azure Web App 작업 사용

Azure Web App에 배포하는 가장 간단한 방법은 Azure Web App (AzureWebApp) 작업을 사용하는 것입니다.

웹 배포 패키지 배포(ASP.NET)

.zip 웹 배포 패키지(예: ASP.NET 웹앱)를 Azure Web App에 배포하려면 azure-pipelines.yml 파일에 다음 코드 조각을 추가합니다.

- task: AzureWebApp@1
  inputs:
    azureSubscription: '<Azure service connection>'
    appName: '<Name of web app>'
    package: $(System.DefaultWorkingDirectory)/**/*.zip    
  • azureSubscription: Azure 구독
  • appName: 기존 앱 서비스 이름
  • package: 패키지 또는 앱 서비스 콘텐츠가 포함된 폴더에 대한 파일 경로 와일드카드가 지원됩니다.

코드 조각은 YAML 파일의 빌드 단계에서 에이전트의 폴더에 $(System.DefaultWorkingDirectory) zip 보관 파일을 생성한다고 가정합니다.

Azure 서비스 연결에 대한 자세한 내용은 다음 섹션을 참조하세요.

.NET 앱 배포

.NET Core 앱을 빌드하는 경우 다음 코드 조각을 사용하여 빌드를 앱에 배포합니다.

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: '<Azure service connection>'
    appType: 'webAppLinux'
    appName: '<Name of web app>'
    package: '$(System.DefaultWorkingDirectory)/**/*.zip'
  • azureSubscription: Azure 구독
  • appType: 웹 앱 유형
  • appName: 기존 앱 서비스 이름
  • package: 패키지 또는 앱 서비스 콘텐츠가 포함된 폴더에 대한 파일 경로 와일드카드가 지원됩니다.

JavaScript Node.js 앱 배포

JavaScript Node.js 앱을 빌드하는 경우 작업 디렉터리의 전체 콘텐츠를 웹앱에 게시합니다. 또한 이 코드 조각은 애플리케이션에 없는 경우 배포 중에 Web.config 파일을 생성하고 Azure Web App에서 iisnode 처리기를 시작합니다.

- task: AzureWebApp@1
  inputs:
    azureSubscription: '<Azure service connections>'
    appName: '<Name of web app>'
    package: '$(System.DefaultWorkingDirectory)'
    customWebConfig: '-Handler iisnode -NodeStartFile server.js -appType node'
  • azureSubscription: Azure 구독
  • appName: 기존 앱 서비스 이름
  • package: 패키지 또는 앱 서비스 콘텐츠가 포함된 폴더에 대한 파일 경로 와일드카드가 지원됩니다.
  • customWebConfig: Python, Node.js, Go 및 Java 앱에 대한 web.config 매개 변수를 생성합니다. 표준 web.config 파일이 생성되고 애플리케이션에 없는 경우 Azure App Service 배포됩니다.

Azure 서비스 연결에 대한 자세한 내용은 다음 섹션을 참조하세요.

YAML은 TFS에서 지원되지 않습니다.

서비스 연결 사용

Azure App Service 배포하려면 Azure Resource Manager 서비스 연결을 사용해야 합니다. Azure 서비스 연결은 자격 증명을 저장하여 Azure Pipelines 또는 Azure DevOps Server Azure에 연결합니다.

Azure Resource Manager 서비스 연결에 대해 자세히 알아봅니다. 서비스 연결이 예상대로 작동하지 않는 경우 서비스 연결 문제 해결을 참조하세요.

작업에 대한 Azure 서비스 연결이 AzureWebApp 필요합니다. Azure 서비스 연결은 Azure Pipelines Azure에 연결할 자격 증명을 저장합니다. Azure 서비스 연결 만들기를 참조하세요.

YAML은 TFS에서 지원되지 않습니다.

가상 애플리케이션에 배포

기본적으로 배포는 Azure 웹앱의 루트 애플리케이션에 발생합니다. 작업의 속성을 사용하여 특정 가상 애플리케이션에 배포할 VirtualApplication 수 있습니다.AzureRmWebAppDeployment

- task: AzureRmWebAppDeployment@4
  inputs:
    VirtualApplication: '<name of virtual application>'

YAML pis는 TFS에서 지원되지 않습니다.

슬롯에 배포

여러 슬롯을 갖도록 Azure Web App을 구성할 수 있습니다. 슬롯을 사용하면 고객이 사용할 수 있도록 하기 전에 앱을 안전하게 배포하고 테스트할 수 있습니다.

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

- task: AzureWebApp@1
  inputs:
    azureSubscription: '<Azure service connection>'
    appType: webAppLinux
    appName: '<name of web app>'
    deployToSlotOrASE: true
    resourceGroupName: '<name of resource group>'
    slotName: staging

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: '<Azure service connection>'
    appType: webAppLinux
    WebAppName: '<name of web app>'
    ResourceGroupName: '<name of resource group>'
    SourceSlot: staging
    SwapWithProduction: true
  • azureSubscription: Azure 구독
  • appType: (선택 사항) Linux의 웹앱에 배포하는 데 사용합니다 webAppLinux .
  • appName: 기존 앱 서비스 이름
  • deployToSlotOrASE: Boolean. 기존 배포 슬롯 또는 Azure App Service 환경에 배포합니다.
  • resourceGroupName: 리소스 그룹의 이름입니다. true이면 deployToSlotOrASE 필수입니다.
  • slotName: 슬롯의 이름입니다. 기본값은 .입니다 production. true이면 deployToSlotOrASE 필수입니다.
  • SourceSlot: true인 경우 SwapWithProduction 프로덕션으로 전송되는 슬롯입니다.
  • SwapWithProduction: Boolean. 원본 슬롯의 트래픽을 프로덕션으로 교환합니다.

YAML은 TFS에서 지원되지 않습니다.

여러 웹앱에 배포

YAML 파일의 작업을 사용하여 배포 파이프라인을 설정할 수 있습니다. 작업을 사용하여 여러 웹앱에 대한 배포 순서를 제어할 수 있습니다.

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: '<Azure service connection>'
      appType: <app type>
      appName: '<name of test stage web app>'
      deployToSlotOrASE: true
      resourceGroupName: <resource 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: '<Azure service connection>'
      appType: <app type>
      appName: '<name of test stage web app>'
      resourceGroupName: <resource group name>
      package: '$(Pipeline.Workspace)/**/*.zip'

YAML은 TFS에서 지원되지 않습니다.

구성 변경 내용

대부분의 언어 스택에서 앱 설정연결 문자열은 런타임에 환경 변수로 설정할 수 있습니다. Key Vault 참조를 사용하여 Key Vault에서 앱 설정을 해결할 수 있습니다.

ASP.NET 및 ASP.NET Core 개발자의 경우 App Service 앱 설정을 Web.config 설정하는 <appSettings> 것과 같습니다. 웹앱 대상에 배포하기 전에 특정 구성을 적용할 수 있습니다. 이는 파이프라인의 여러 웹앱에 동일한 빌드를 배포할 때 유용합니다. 예를 들어 Web.config 파일에 이름이 지정된 connectionString연결 문자열이 포함된 경우 각 웹앱에 배포하기 전에 해당 값을 변경할 수 있습니다. Web.config 변환을 적용하거나 Web.config 파일에서 변수를 대체하여 이 작업을 수행할 수 있습니다.

Azure App Service 배포 작업을 사용하면 지정된 스테이지 이름에 따라 웹 패키지 및 XML 매개 변수 파일(parameters.xml) 내의 구성 파일(*.config 파일)에서 구성 설정을 수정할 수 있습니다.

참고

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

다음 코드 조각은 변수 대체의 예를 보여줍니다.

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 piis는 TFS에서 지원되지 않습니다.

조건부 배포

Azure Web App에 특정 빌드만 배포하도록 선택할 수 있습니다.

YAML에서 이 작업을 수행하려면 다음 기술 중 하나를 사용할 수 있습니다.

  • 배포 단계를 별도의 작업으로 격리하고 해당 작업에 조건을 추가합니다.
  • 단계에 조건을 추가합니다.

다음 예제에서는 단계 조건을 사용하여 주 분기에서 시작된 빌드만 배포하는 방법을 보여 줍니다.

- task: AzureWebApp@1
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
  inputs:
    azureSubscription: '<Azure service connection>'
    appName: '<name of web app>'

조건에 대한 자세한 내용은 조건 지정을 참조하세요.

YAML은 TFS에서 지원되지 않습니다.

(클래식) 릴리스 파이프라인을 사용하여 배포

릴리스 파이프라인을 사용하여 빌드에서 게시한 아티팩트를 선택하고 Azure 웹 사이트에 배포할 수 있습니다.

  1. 릴리스 파이프라인 만들기를 시작하려면 다음 중 하나를 수행합니다.

    • CI 빌드를 방금 완료한 경우 링크(예: 빌드 20170815.1)를 선택하여 빌드 요약을 엽니다. 그런 다음 릴리스 를 선택하여 빌드 파이프라인에 자동으로 연결되는 새 릴리스 파이프라인을 시작합니다.

    • Azure Pipelines에서 릴리스 탭을 열고 릴리스 파이프라인 목록에서 드롭다운을 열고 +릴리스 파이프라인 만들기를 선택합니다.

  2. 릴리스 파이프라인을 만드는 가장 쉬운 방법은 템플릿을 사용하는 것입니다. Node.js 앱을 배포하는 경우 Azure App Service 템플릿에 Node.js 앱 배포를 선택합니다. 그렇지 않으면 Azure App Service 배포 템플릿을 선택합니다. 그런 다음 적용을 선택합니다.

    참고

    이러한 템플릿 간의 유일한 차이점은 Node.js 템플릿이 iisnode 서비스를 시작하는 매개 변수를 포함하는 web.config 파일을 생성하도록 태스크를 구성한다는 것입니다.

  3. 빌드 요약에서 새 릴리스 파이프라인을 만든 경우 빌드 파이프라인 및 아티팩트가 파이프라인 탭의 아티팩트 섹션에 표시되는지 확인합니다. 릴리스 탭에서 새 릴리스 파이프라인 만든 경우 + 추가 링크를 선택하고 빌드 아티팩트를 선택합니다.

  4. 아티팩트 섹션에서 연속 배포 아이콘을 선택하고, 연속 배포 트리거가 사용하도록 설정되어 있는지 확인하고, 기본 분기를 포함할 필터를 추가합니다.

    참고

    릴리스 탭에서 새 릴리스 파이프라인을 만들 때는 기본적으로 지속적인 배포를 사용할 수 없습니다.

  5. 작업 탭을 열고 1단계를 선택한 상태에서 다음과 같이 작업 속성 변수를 구성합니다.

    • Azure 구독:사용 가능한 Azure 서비스 연결 아래의 목록에서 연결을 선택하거나 Azure 구독에 대한 더 제한된 권한 연결을 만듭니다. Azure Pipelines를 사용 중이고 입력 옆에 권한 부여 단추가 표시되는 경우 해당 단추를 클릭하여 Azure 구독에 연결하도록 Azure Pipelines에 권한을 부여합니다. TFS를 사용 중이거나 구독 목록에 원하는 Azure 구독이 표시되지 않는 경우 연결을 수동으로 설정하려면 Azure Resource Manager 서비스 연결을 참조하세요.

    • App Service 이름: 구독에서 웹앱의 이름을 선택합니다.

    참고

    템플릿에서 릴리스 파이프라인을 만들 때 작업에 대한 일부 설정이 자동으로 단계 변수 로 정의되었을 수 있습니다. 이러한 설정은 작업 설정에서 수정할 수 없습니다. 대신 이러한 설정을 편집하려면 부모 단계 항목을 선택해야 합니다.

  6. 릴리스 파이프라인을 저장합니다.

앱을 배포하는 릴리스 만들기

이제 릴리스를 만들 준비가 되었습니다. 즉, 특정 빌드에서 생성된 아티팩트를 사용하여 릴리스 파이프라인을 실행합니다. 그러면 빌드가 배포됩니다.

  1. + 릴리스를 선택하고 릴리스 만들기를 선택합니다.

  2. 새 릴리스 만들기 패널에서 사용하려는 아티팩트 버전이 선택되어 있는지 확인하고 만들기를 선택합니다.

  3. 알림 표시줄 메시지에서 릴리스 링크를 선택합니다. 예를 들어 "Release-1 릴리스를 만들었습니다"를 선택합니다.

  4. 파이프라인 보기에서 파이프라인의 단계에서 상태 링크를 선택하여 로그 및 에이전트 출력을 확인합니다.

  5. 릴리스가 완료되면 웹앱 URL http://{web_app_name}.azurewebsites.net을 사용하여 Azure에서 실행되는 사이트로 이동하여 해당 콘텐츠를 확인합니다.

Azure Government 클라우드 또는 Azure Stack에 배포

적합한 서비스 연결을 만듭니다.

배포 메커니즘

앞의 예제는 Azure와의 간소화된 통합을 제공하는 기본 제공 Azure Web App 작업을 사용합니다.

Windows 에이전트를 사용하는 경우 이 작업은 웹 배포 기술을 사용하여 Azure Web App과 상호 작용합니다. 웹 배포는 배포 중에 잠긴 파일의 이름을 변경하고 App_Data 폴더에서 파일을 제외하는 등 몇 가지 편리한 배포 옵션을 제공합니다.

Linux 에이전트를 사용하는 경우 작업은 Kudu REST API를 사용합니다.

배포하기 전에 확인해야 할 한 가지 사항은 Azure App Service 액세스 제한 목록입니다. 이 목록에는 IP 주소 또는 Azure Virtual Network 서브넷이 포함될 수 있습니다. 하나 이상의 항목이 있는 경우 목록 끝에 있는 암시적 "거부 모두"가 있습니다. 앱에 대한 액세스 제한 규칙을 수정하려면 Azure Portal에서 액세스 제한 규칙 추가 및 편집을 참조하세요. 소스 제어 관리(scm) 사이트에 대한 액세스를 수정/제한할 수도 있습니다.

Azure App Service 관리 작업은 배포에 유용한 또 다른 작업입니다. 이 작업을 사용하여 배포 전후에 웹앱을 시작, 중지 또는 다시 시작할 수 있습니다. 이 작업을 사용하여 슬롯을 교환하거나, 사이트 확장을 설치하거나, 웹앱 모니터링을 사용하도록 설정할 수도 있습니다.

파일 변환 작업을 사용하여 모든 구성 및 매개 변수 파일에 파일 변환 및 변수 대체를 적용할 수 있습니다.

기본 제공 작업이 요구 사항을 충족하지 않는 경우 다른 방법을 사용하여 배포를 스크립트할 수 있습니다. 몇 가지 예제는 다음 작업 각각에서 YAML 코드 조각을 확인합니다.