Azure Pipelines를 사용하여 Python 웹앱을 빌드 및 배포하여 Azure 앱 Service

Azure DevOps Services

Ci/CD(지속적인 통합 및 지속적인 업데이트)를 위해 Azure Pipelines를 사용하여 Linux의 Azure 앱 Service에 Python 웹앱을 빌드하고 배포합니다. 리포지토리에 커밋이 있을 때마다 파이프라인은 자동으로 Python 웹앱을 빌드하고 App Service에 배포합니다.

이 문서에서는 다음 방법을 설명합니다.

  • Azure App Service에서 웹앱을 만듭니다.
  • Azure DevOps에서 프로젝트를 만듭니다.
  • DevOps 프로젝트를 Azure에 커넥트.
  • Python 관련 파이프라인을 만듭니다.
  • 파이프라인을 실행하여 App Service에서 웹앱에 앱을 빌드하고 배포합니다.

필수 구성 요소

  • Azure 구독 아직 없는 경우 무료 계정을 만들 수 있습니다.
  • GitHub 계정. 계정이 없는 경우 체험 계정을 만듭니다.
  • An Azure DevOps Server.
  • 자체 호스팅 에이전트입니다. 자체 호스팅 에이전트를 만들어야 하는 경우 자체 호스팅 에이전트를 참조 하세요.

앱 코드에 대한 리포지토리 만들기

샘플 리포지토리 https://github.com/Microsoft/python-sample-vscode-flask-tutorial 를 GitHub 계정에 포크합니다.

로컬 호스트에서 GitHub 리포지토리를 복제합니다. 포크된 리포지토리의 URL로 바꿔 <repository-url> 서 다음 명령을 사용합니다.

git clone <repository-url>

로컬로 앱 테스트

앱을 로컬로 빌드하고 실행하여 작동하는지 확인합니다.

  1. 복제된 리포지토리 폴더로 변경합니다.

    cd python-sample-vscode-flask-tutorial
    
  2. 앱 빌드 및 실행

    python -m venv .env
    source .env/bin/activate
    pip install --upgrade pip
    pip install -r ./requirements.txt
    export set FLASK_APP=hello_app.webapp
    python3 -m flask run
    
  3. 앱을 보려면 브라우저 창을 열고 . http://localhost:5000으로 이동합니다. 제목 Visual Studio Flask Tutorial이 표시되는지 확인합니다.

  4. 완료되면 브라우저 창을 닫고 Ctrl+C사용하여 Flask 서버를 중지합니다.

Cloud Shell 열기

  1. https://portal.azure.com에서 Azure Portal에 로그인합니다.

  2. 포털 도구 모음에서 Cloud Shell 단추를 선택하여 Azure CLI를 엽니다.

    Azure Portal 도구 모음의 Azure Cloud Shell 단추 스크린샷

  3. Cloud Shell이 브라우저 아래쪽에 나타납니다. 드롭다운 메뉴에서 Bash를 선택합니다.

    Azure Cloud Shell 스크린샷

  4. 더 많은 작업 공간을 제공하려면 최대화 단추를 선택합니다.

Azure 앱 Service 웹앱 만들기

Azure Portal의 Cloud Shell에서 Azure 앱 Service 웹앱을 만듭니다.

Cloud Shell에 붙여넣려면 Ctrl+Shift+V를 사용하거나 마우스 오른쪽 단추를 클릭하고 상황에 맞는 메뉴에서 붙여넣기를 선택합니다.

  1. 다음 명령을 사용하여 리포지토리를 복제하고 포크된 리포지토리의 URL로 바꿉 <repository-url> 있습니다.

    git clone <repository-url>
    
  2. 디렉터리를 복제된 리포지토리 폴더로 변경하여 명령이 az webapp up 앱을 Python 앱으로 인식하도록 합니다.

    cd python-sample-vscode-flask-tutorial
    
  3. az webapp up 명령을 사용하여 App Service를 프로비전하고 앱의 첫 번째 배포를 수행합니다. Azure에서 고유한 이름으로 대체 <your-web-app-name> 합니다. 일반적으로 다음과 같은 <your-name>-flaskpipelines앱 식별자와 함께 개인 또는 회사 이름을 사용합니다. 앱 URL은 <your-appservice.azurewebsites.net> 됩니다.

    az webapp up --name <your-web-app-name>
    

    명령의 JSON 출력은 다음을 az webapp up 보여줍니다.

    {
      "URL": <your-web-app-url>,
      "appserviceplan": <your-app-service-plan-name>,
      "location": <your-azure-location>,
      "name": <your-web-app-name>,
      "os": "Linux",
      "resourcegroup": <your-resource-group>,
      "runtime_version": "python|3.11",
      "runtime_version_detected": "-",
      "sku": <sku>,
      "src_path": <repository-source-path>
    }
    

    URL 값과 runtime_version 값을 확인합니다. 파이프라인 YAML 파일에서 사용합니다 runtime_version . 웹 URL 앱의 URL입니다. 이를 사용하여 앱이 실행 중인지 확인할 수 있습니다.

    참고 항목

    az webapp up 명령에는 다음 작업이 포함됩니다.

    명령 매개 변수를 사용하여 사용자 고유의 값으로 기본 작업을 재정의할 수 있습니다. 자세한 내용은 az webapp up을 참조하세요.

  4. python-sample-vscode-flask-tutorial 앱에는 웹앱에 대한 특정 시작 명령이 포함된 startup.txt 파일이 있습니다. 웹앱 startup-file 구성 속성을 .로 startup.txt설정합니다.

    1. 명령 출력에서 az webapp up 값을 복사합니다 resourcegroup .

    2. 리소스 그룹 및 앱 이름을 사용하여 다음 명령을 입력합니다.

    az webapp config set --resource-group <your-resource-group> --name <your-web-app-name> --startup-file startup.txt
    

    명령이 완료되면 웹앱에 대한 모든 구성 설정이 포함된 JSON 출력이 표시됩니다.

  5. 실행 중인 앱을 보려면 브라우저를 열고 명령 출력에 URLaz webapp up 표시된 것으로 이동합니다. 일반 페이지가 표시되면 App Service가 시작될 때까지 몇 초 정도 기다린 다음 페이지를 새로 고칩니다. 제목 Visual Studio Flask Tutorial이 표시되는지 확인합니다.

Azure DevOps 프로젝트 만들기

새 Azure DevOps 프로젝트를 만듭니다.

  1. 브라우저에서 dev.azure.com 이동하여 로그인합니다.
  2. 조직을 선택합니다.
  3. 조직에서 첫 번째 프로젝트를 만드는 경우 새 프로젝트를 선택하거나 프로젝트 만들기를 선택하여 새 프로젝트를 만듭니다.
  4. 프로젝트 이름을 입력합니다.
  5. 프로젝트의 표시 유형을 선택합니다.
  6. 만들기를 실행합니다.
  1. 브라우저에서 Azure DevOps Server로 이동합니다.
  2. 컬렉션을 선택합니다.
  3. 컬렉션에서 첫 번째 프로젝트를 만드는 경우 새 프로젝트를 선택하거나 프로젝트 만들기를 선택하여 새 프로젝트를 만듭니다.
  4. 프로젝트 이름을 입력합니다.
  5. 프로젝트의 표시 유형을 선택합니다.
  6. 만들기를 실행합니다.

서비스 주체 만들기

서비스 주체는 Azure 리소스에 액세스하기 위해 애플리케이션, 호스팅된 서비스 및 자동화된 도구와 함께 사용하도록 만든 ID입니다. 이 액세스는 서비스 주체에 할당된 역할로 제한되므로 액세스할 수 있는 리소스와 어느 수준에서 액세스할 수 있는지 제어할 수 있습니다.

서비스 주체를 만들려면 cloud shell(bash)으로 이동하여 다음 명령을 실행합니다. 서비스 주체의 이름, <your-subscription-id> 구독 ID 및 <your-resource-group> 웹앱의 리소스 그룹으로 바꿉 <service-principal-name> 니다.

az ad sp create-for-rbac --display-name <service-principal-name> --role contributor --scopes /subscriptions/<your-subscription-id>/resourceGroups/<your-resource-group>

이 명령은 다음 예제와 유사한 JSON 개체를 반환합니다.

{
  "clientId": "<client GUID>",
  "clientSecret": "<string-value>",
  "subscriptionId": "<subscription GUID>",
  "tenantId": "<tenant GUID>",
  ...
}

, clientSecret, subscriptionIdtenantId 값을 기록해 둡다clientId. 다음 섹션에서 서비스 연결을 만들려면 이러한 값이 필요합니다.

서비스 연결 만들기

서비스 연결을 사용하면 Azure Pipelines에서 외부 및 원격 서비스로 인증된 액세스를 제공하는 연결을 만들 수 있습니다. Azure 앱 Service 웹앱에 배포하려면 웹앱을 포함하는 리소스 그룹에 대한 서비스 연결을 만듭니다.

  1. 프로젝트 페이지에서 프로젝트 설정을 선택합니다.

    프로젝트 대시보드의 프로젝트 설정 단추 스크린샷

  2. 메뉴의파이프라인 섹션에서 서비스 연결을 선택합니다.

  3. 서비스 연결 만들기를 선택합니다.

  4. Azure Resource Manager를 선택하고 다음을 선택합니다.

    Azure Resource Manager 서비스 연결 선택 스크린샷

  5. 인증 방법을 선택하고 다음을 선택합니다.

  6. 새 Azure 서비스 연결 대화 상자에서 선택한 인증 방법과 관련된 정보를 입력합니다. 인증 방법에 대한 자세한 내용은 Azure Resource Manager 서비스 연결을 사용하여 Azure에 커넥트 참조하세요.

    예를 들어 워크로드 ID 페더레이션(자동) 또는 서비스 주체(자동) 인증 방법을 사용하는 경우 필요한 정보를 입력합니다.

    새 서비스 연결 대화 상자의 스크린샷.

    필드 설명
    범위 수준 구독을 선택합니다.
    구독 Azure 구독 이름.
    리소스 그룹 웹앱을 포함하는 리소스 그룹의 이름입니다.
    서비스 연결 이름 연결에 대한 설명이 포함된 이름입니다.
    모든 파이프라인에 액세스 권한 부여 모든 파이프라인에 대한 액세스 권한을 부여하려면 이 옵션을 선택합니다.
  7. 저장을 선택합니다.

새 연결이 서비스 연결 목록에 표시되고 Azure Pipeline에서 사용할 준비가 된 것입니다.

  1. 프로젝트 페이지에서 프로젝트 설정을 선택합니다.

    프로젝트 대시보드의 프로젝트 설정 단추 스크린샷

  2. 메뉴의파이프라인 섹션에서 서비스 연결을 선택합니다.

  3. 서비스 연결 만들기를 선택합니다.

  4. Azure Resource Manager를 선택하고 다음을 선택합니다.

    Azure Resource Manager 서비스 연결 선택 스크린샷

  5. 새 Azure 서비스 연결에서 서비스 주체(수동)를 선택하고 다음을 선택합니다.

  6. 다음 대화 상자에서 필요한 정보를 입력합니다.

    새 서비스 연결 대화 상자의 스크린샷

    필드 설명
    환경 Azure Cloud를 선택합니다.
    범위 수준 구독을 선택합니다.
    구독 ID 구독 ID.
    구독 이름 Azure 구독 이름.
    서비스 주체 ID appId 명령에서 반환된 JSON 개체의 값입니다az ad sp create-for-rbac.
    서비스 주체 키 password 명령에서 반환된 JSON 개체의 값입니다az ad sp create-for-rbac.
    테넌트 ID tenant 명령에서 반환된 JSON 개체의 값입니다az ad sp create-for-rbac.
  7. 확인을 선택하여 연결을 확인합니다.

  8. 서비스 연결 이름을 입력합니다.

  9. 모든 파이프라인에 대한 액세스 권한 부여가 선택되어 있는지 확인 합니다 .

  10. 확인 및 저장을 선택합니다.

새 연결이 서비스 연결 목록에 표시되며 프로젝트에서 Azure Pipelines를 사용할 준비가 된 것입니다.

자체 호스팅 에이전트 구성

자체 호스팅 에이전트를 사용하는 경우 Python을 실행하도록 에이전트를 구성해야 합니다. Python 버전 다운로드는 자체 호스팅 에이전트에서 지원되지 않습니다. Python 버전을 미리 설치해야 합니다. 전체 설치 관리자를 사용하여 Python의 pip 호환 버전을 가져옵니다.

호환되지 않는 문제를 방지하려면 Python 버전을 Azure 앱 Services 웹앱의 런타임 버전과 일치시켜야 합니다. 런타임 버전은 명령의 JSON 출력에 az webapp up 표시됩니다.

작업에서 사용할 수 있도록 원하는 Python 버전을 자체 호스팅 에이전트의 도구 캐시에 추가해야 합니다. 일반적으로 도구 캐시는 에이전트의 _work/_tool 디렉터리 아래에 있습니다. 또는 환경 변수 AGENT_TOOLSDIRECTORY 경로를 재정의할 수 있습니다. 도구 디렉터리 아래에서 Python 버전을 기반으로 다음 디렉터리 구조를 만듭니다.

$AGENT_TOOLSDIRECTORY/
    Python/
        {version number}/
            {platform}/
                {tool files}
            {platform}.complete

버전 번호는 1.2.3 형식을 따라야 합니다. 플랫폼은 x86 또는 x64여야 합니다. 도구 파일은 압축을 푼 Python 버전 파일이어야 합니다. 이 파일은 {platform}.complete 캐시에 도구가 x86.completex64.complete 제대로 설치되었음을 나타내는 0바이트 파일이어야 합니다.

예를 들어 64비트 Windows 컴퓨터에서 Python 3.11을 사용하는 경우 디렉터리 구조는 다음과 같습니다.

$AGENT_TOOLSDIRECTORY/
    Python/
        3.11.4/
            x64/
                {python files}
            x64.complete

에이전트를 호스팅하는 컴퓨터에서 사용하려는 Python 버전이 이미 있는 경우 파일을 도구 캐시에 복사할 수 있습니다. Python 버전이 없는 경우 Python 웹 사이트에서 다운로드할 수 있습니다.

파이프라인을 만듭니다.

Python 웹앱을 빌드하고 Azure 앱 Service에 배포하는 파이프라인을 만듭니다. 파이프라인 개념을 이해하려면 다음을 수행합니다.

  1. 왼쪽 탐색 메뉴에서 파이프라인을 선택합니다.

    프로젝트 대시보드의 파이프라인 선택 스크린샷

  2. 파이프라인 생성를 선택합니다.

    파이프라인 목록의 새 파이프라인 단추 스크린샷

  3. 코드 위치 대화 상자에서 GitHub를 선택합니다. GitHub에 로그인하라는 메시지가 표시될 수 있습니다.

    코드의 위치로 GitHub를 선택하는 스크린샷

  4. 리포지토리 선택 화면에서 포크된 샘플 리포지토리를 선택합니다.

    리포지토리 선택 스크린샷

  5. 확인으로 GitHub 암호를 다시 입력하라는 메시지가 표시될 수 있습니다.

  6. Azure Pipelines 확장이 GitHub에 설치되지 않은 경우 GitHub는 Azure Pipelines 확장을 설치하라는 메시지를 표시합니다 .

    GitHub에 Azure Pipelines 확장을 설치합니다.

    이 페이지에서 리포지토리 액세스 섹션까지 아래로 스크롤하여 모든 리포지토리에 확장을 설치할지 또는 선택한 리포지토리에만 설치할지 선택한 다음, 승인 및 설치를 선택합니다.

    GitHub에서 Azure Pipelines 확장 승인 및 설치 스크린샷

  7. 파이프라인 구성 대화 상자에서 Azure에서 Python에서 Linux 웹앱으로 선택합니다.

  8. Azure 구독을 선택하고 계속을 선택합니다.

  9. 사용자 이름과 암호를 사용하여 인증하는 경우 Microsoft 계정에 로그인할 수 있는 브라우저가 열립니다.

  10. 드롭다운 목록에서 웹앱 이름을 선택하고 유효성 검사 및 구성을 선택합니다.

Azure Pipelines는 azure-pipelines.yml 파일을 만들고 YAML 파이프라인 편집기에서 표시합니다. 파이프라인 파일은 CI/CD 파이프라인을 일련의 단계, 작업 및 단계로 정의하며, 각 단계에는 다양한 작업스크립트에 대한 세부 정보가 포함됩니다. 파이프라인을 살펴보고 수행하는 작업을 확인합니다. 모든 기본 입력이 코드에 적합한지 확인합니다.

  1. 탐색 메뉴에서 파이프라인을 선택합니다.

    프로젝트 대시보드의 파이프라인 선택 스크린샷

  2. 파이프라인 생성를 선택합니다.

    ::image type="content" source="media/create-first-pipeline.png" alt-text="새 파이프라인 단추의 스크린샷.":::

  3. 코드 위치 대화 상자에서 GitHub Enterprise Server를 선택합니다. GitHub에 로그인하라는 메시지가 표시될 수 있습니다.

    코드의 위치로 GitHub를 선택하는 스크린샷

  4. 리포지토리 선택 탭에서 포크된 샘플 리포지토리를 선택합니다.

    리포지토리 선택 스크린샷

  5. 확인으로 GitHub 암호를 다시 입력하라는 메시지가 표시될 수 있습니다.

  6. Azure Pipelines 확장이 GitHub에 설치되지 않은 경우 GitHub는 Azure Pipelines 확장을 설치하라는 메시지를 표시합니다 .

    GitHub의 Azure Pipelines 확장 스크린샷

    이 페이지에서 리포지토리 액세스 섹션까지 아래로 스크롤하여 모든 리포지토리에 확장을 설치할지 또는 선택한 리포지토리에만 설치할지 선택한 다음, 승인 및 설치를 선택합니다.

    GitHub에서 Azure Pipelines 확장 승인 및 설치 스크린샷

  7. 파이프라인 구성 대화 상자에서 시작 파이프라인을 선택합니다.

  8. azure-pipelines.yml 파일의 내용을 다음 코드로 바꿉니다.

    trigger:
    - main
    
    variables:
      # Azure Resource Manager connection created during pipeline creation
      azureServiceConnectionId: '<your-service-connection-name>'
    
      # Web app name
      webAppName: '<your-web-app-name>'
    
      # Environment name
      environmentName: '<your-web-app-name>'
    
      # Project root folder. 
      projectRoot: $(System.DefaultWorkingDirectory)
    
      # Python version: 
      pythonVersion: '<your-python-version>'
    
    stages:
    - stage: Build
      displayName: Build stage
      jobs:
      - job: BuildJob
        pool:
          name: '<your-pool-name>'
          demands: python
        steps:
        - task: UsePythonVersion@0
          inputs:
            versionSpec: '$(pythonVersion)'
          displayName: 'Use Python $(pythonVersion)'
    
        - script: |
            python -m venv antenv
            source antenv/bin/activate
            python -m pip install --upgrade pip
            pip install setup
            pip install -r requirements.txt
          workingDirectory: $(projectRoot)
          displayName: "Install requirements"
    
        - task: ArchiveFiles@2
          displayName: 'Archive files'
          inputs:
            rootFolderOrFile: '$(projectRoot)'
            includeRootFolder: false
            archiveType: zip
            archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
            replaceExistingArchive: true
    
        - task: PublishBuildArtifacts@1
          inputs:
            PathtoPublish: '$(Build.ArtifactStagingDirectory)'
            ArtifactName: 'drop'
            publishLocation: 'Container'
    
    - stage: Deploy
      displayName: 'Deploy Web App'
      dependsOn: Build
      condition: succeeded()
      jobs:
      - deployment: DeploymentJob
        pool:
          name: '<your-pool-name'
        environment: $(environmentName)
        strategy:
          runOnce:
            deploy:
              steps:
    
              - task: UsePythonVersion@0
                inputs:
                  versionSpec: '$(pythonVersion)'
                displayName: 'Use Python version'
    
              - task: AzureWebApp@1
                displayName: 'Deploy Azure Web App : <your-web-app-name>'
                inputs:
                  azureSubscription: $(azureServiceConnectionId)
                  appName: $(webAppName)
                  package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
                  startUpCommand: 'startup.txt'
    
    
  9. 다음 자리 표시자를 사용자 고유의 값으로 바꿉다.

    자리표시자 설명
    <your-service-connection-name> 만든 서비스 연결의 이름입니다.
    <your-web-app-name> Azure 앱 Service 웹앱의 이름입니다.
    <your-pool-name> 사용하려는 에이전트 풀의 이름입니다.
    <your-python-version> 에이전트에서 실행되는 Python 버전입니다. 이 버전을 웹앱에서 실행되는 Python 버전과 일치시킬 것을 권장합니다. 웹앱 버전은 명령의 JSON 출력에 az webapp up 표시됩니다.

YAML 파이프라인 파일

다음 설명에서는 YAML 파이프라인 파일에 대해 설명합니다. 파이프라인 YAML 파일 스키마에 대한 자세한 내용은 YAML 스키마 참조를 참조하세요.

variables

섹션에는 variables 다음 변수가 포함되어 있습니다.

variables:
# Azure Resource Manager connection created during pipeline creation
azureServiceConnectionId: '<GUID>'

# Web app name
webAppName: '<your-web-app-name>'

# Agent VM image name
vmImageName: 'ubuntu-latest'

# Environment name
environmentName: '<your-web-app-name>'

# Project root folder.
projectRoot: $(System.DefaultWorkingDirectory)

# Python version: 3.11. Change this to match the Python runtime version running on your web app.
pythonVersion: '3.11'

변수 설명
azureServiceConnectionId Azure Resource Manager 서비스 연결의 ID 또는 이름입니다.
webAppName Azure App Service 웹앱의 이름입니다.
vmImageName 빌드 에이전트에 사용할 운영 체제의 이름입니다.
environmentName 배포 단계에서 사용되는 환경의 이름입니다. 스테이지 작업이 실행되면 환경이 자동으로 만들어집니다.
projectRoot 앱 코드가 포함된 루트 폴더입니다.
pythonVersion 빌드 및 배포 에이전트에서 사용할 Python 버전입니다.

섹션에는 variables 다음 변수가 포함되어 있습니다.

variables:
# Azure Resource Manager connection created during pipeline creation
azureServiceConnectionId: '<your-service-connection-name>'

# Web app name
webAppName: '<your-web-app-name>'

# Environment name
environmentName: '<your-web-app-name>'

# Project root folder. 
projectRoot: $(System.DefaultWorkingDirectory)

# Python version: 3.11. Change this to the version that is running on your agent and web app.
pythonVersion: '3.11'
변수 설명
azureServiceConnectionId Azure Resource Manager 서비스 연결의 이름입니다.
webAppName 웹앱의 이름입니다.
environmentName 배포 단계에서 사용되는 환경의 이름입니다.
projectRoot 앱 코드가 포함된 폴더입니다. 값은 자동 시스템 변수입니다.
pythonVersion 빌드 및 배포 에이전트에서 사용할 Python 버전입니다.

빌드 스테이지

빌드 단계에는 vmImageName 변수에 정의된 운영 체제에서 실행되는 단일 작업이 포함됩니다.

  - job: BuildJob
    pool:
      vmImage: $(vmImageName)

빌드 단계에는 이름 매개 변수로 식별되는 풀의 에이전트에서 실행되는 단일 작업이 포함됩니다. 키워드(keyword) 사용하여 에이전트 기능을 demands 지정할 수 있습니다. 예를 들어 demands: python 에이전트에 Python이 설치되어 있어야 한다고 지정합니다. 이름으로 자체 호스팅 에이전트를 지정하려면 키워드(keyword) 사용할 demands: Agent.Name -equals <agent-name> 수 있습니다.

  - job: BuildJob
    pool:
      name: <your-pool-name>
      demands: python

작업에는 다음과 같은 여러 단계가 포함됩니다.

  1. UsePythonVersion 작업은 사용할 Python 버전을 선택합니다. 버전은 변수에 pythonVersion 정의됩니다.

       - task: UsePythonVersion@0
          inputs:
            versionSpec: '$(pythonVersion)'
            displayName: 'Use Python $(pythonVersion)'
    
  2. 이 단계에서는 스크립트를 사용하여 가상 Python 환경을 만들고 파일에 포함된 requirements.txt 앱의 종속성을 설치합니다. 매개 변수는 --target 종속성을 설치할 위치를 지정합니다. 매개 변수는 workingDirectory 앱 코드의 위치를 지정합니다.

      - script: |
           python -m venv antenv
           source antenv/bin/activate
           python -m pip install --upgrade pip
           pip install setup
           pip install --target="./.python_packages/lib/site-packages" -r ./requirements.txt
         workingDirectory: $(projectRoot)
         displayName: "Install requirements"
    
  3. ArchiveFiles 작업은 웹앱을 포함하는 .zip 보관 파일을 만듭니다. 파일이 .zip 파이프라인에 라는 drop아티팩트로 업로드됩니다. 이 .zip 파일은 배포 단계에서 웹앱에 앱을 배포하는 데 사용됩니다.

       - task: ArchiveFiles@2
         displayName: 'Archive files'
         inputs:
           rootFolderOrFile: '$(projectRoot)'
           includeRootFolder: false
           archiveType: zip
           archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
           replaceExistingArchive: true
    
       - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
         displayName: 'Upload package'
         artifact: drop
    
    매개 변수 설명
    rootFolderOrFile 앱 코드의 위치입니다.
    includeRootFolder .zip 파일에 루트 폴더를 포함할지 여부를 나타냅니다. 이 매개 변수를 false 설정하지 않으면 .zip 파일의 내용이 s라는 폴더에 저장되고 Linux 컨테이너의 App Service에서 앱 코드를 찾을 수 없습니다.
    archiveType 만들 보관 파일의 형식입니다. zip로 설정합니다.
    archiveFile 만들 .zip 파일의 위치입니다.
    replaceExistingArchive 파일이 이미 있는 경우 기존 보관 파일을 바꿀지 여부를 나타냅니다. true로 설정합니다.
    upload 업로드할 .zip 파일의 위치입니다.
    artifact 만들 아티팩트의 이름입니다.

배포 단계

빌드 단계가 성공적으로 완료되면 배포 단계가 실행됩니다. 다음 키워드(keyword) 이 동작을 정의합니다.

  dependsOn: Build
  condition: succeeded()

배포 단계에는 다음 키워드(keyword) 구성된 단일 배포 작업이 포함됩니다.

  - deployment: DeploymentJob
    pool:
      vmImage: $(vmImageName)
    environment: $(environmentName)
키워드 설명
deployment 작업이 환경을 대상으로 하는 배포 작업임을 나타냅니다.
pool 배포 에이전트 풀을 지정합니다. 이름이 지정되지 않은 경우 기본 에이전트 풀입니다. vmImage 키워드(keyword) 에이전트의 가상 머신 이미지에 대한 운영 체제를 식별합니다.
environment 배포할 환경을 지정합니다. 작업이 실행되면 프로젝트에서 환경이 자동으로 만들어집니다.
  - deployment: DeploymentJob
    pool:
      name: <your-pool-name>
    environment: $(environmentName)
키워드 설명
deployment 작업이 환경을 대상으로 하는 배포 작업임을 나타냅니다.
pool 배포에 사용할 에이전트 풀을 지정합니다. 이 풀에는 파이프라인에 지정된 Python 버전을 실행할 수 있는 기능이 있는 에이전트가 포함되어야 합니다.
environment 배포할 환경을 지정합니다. 작업이 실행되면 프로젝트에서 환경이 자동으로 만들어집니다.

strategy 키워드(keyword) 배포 전략을 정의하는 데 사용됩니다. runOnce 키워드(keyword) 배포 작업이 한 번 실행되도록 지정합니다. deploy 키워드(keyword) 배포 작업에서 실행할 단계를 지정합니다.

  strategy:
    runOnce:
      deploy:
        steps:

steps 파이프라인의 내용은 다음과 같습니다.

  1. UsePythonVersion 작업을 사용하여 에이전트에서 사용할 Python 버전을 지정합니다. 버전은 변수에 pythonVersion 정의됩니다.

     - task: UsePythonVersion@0
       inputs:
         versionSpec: '$(pythonVersion)'
       displayName: 'Use Python version'
    
  2. AzureWebApp@1 사용하여 웹앱을 배포합니다. 이 작업은 파이프라인 아티팩 drop 트 웹앱에 배포합니다.

    - task: AzureWebApp@1
       displayName: 'Deploy Azure Web App : <your-web-app-name>'
       inputs:
          azureSubscription: $(azureServiceConnectionId)
          appName: $(webAppName)
          package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
    
    매개 변수 설명
    azureSubscription 사용할 Azure Resource Manager 서비스 연결 ID 또는 이름입니다.
    appName 웹앱의 이름입니다.
    package 배포할 .zip 파일의 위치입니다.

    또한 python-vscode-flask-tutorial 리포지토리는 startup.txt 파일에 동일한 시작 명령을 포함하므로 매개 변수startUpCommand: 'startup.txt'를 추가하여 해당 파일을 지정할 수 있습니다.

      - task: AzureWebApp@1
         displayName: 'Deploy Azure Web App : $(webAppName)'
         inputs:
           azureSubscription: $(azureServiceConnectionId)
           appName: $(webAppName)
           package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
           startUpCommand: 'startup.txt'
    
    매개 변수 설명
    azureSubscription 사용할 Azure Resource Manager 서비스 연결 ID 또는 이름입니다.
    appName 웹앱의 이름입니다.
    package 배포할 .zip 파일의 위치입니다.
    startUpCommand 앱이 배포된 후 실행할 명령입니다. 샘플 앱은 .를 사용합니다 startup.txt.

파이프라인 실행

이제 사용해 볼 준비가 되었습니다!

  1. 편집기에서 저장을 선택하고 실행합니다.

  2. 저장 및 실행 대화 상자에서 커밋 메시지 추가한 다음 저장 및 실행을 선택합니다.

    파이프라인 실행 요약에서 스테이지 또는 작업을 선택하여 파이프라인이 실행되는 것을 볼 수 있습니다.

    파이프라인 실행 요약 단계 섹션의 스크린샷.

    성공적으로 완료되면 각 스테이지와 작업 옆에 녹색 검사 표시가 있습니다. 오류가 발생하면 요약 또는 작업 단계에 표시됩니다.

    파이프라인 단계 단계의 스크린샷.

    요약 페이지의 오른쪽 위에 있는 세로 점을 선택하고 파이프라인 편집을 선택하여 YAML 편집기로 빠르게 돌아갈 수 있습니다.

    빌드 보고서의 파이프줄 주석 편집 스크린샷

  3. 배포 작업에서 Azure Web App 배포 작업을 선택하여 출력을 표시합니다. 배포된 사이트를 방문하려면 Ctrl 키를 누른 채 URLApp Service Application URL을 선택합니다.

    샘플 앱을 사용하는 경우 앱은 다음과 같이 표시됩니다.

    App Service에서 실행되는 샘플 앱의 보기 스크린샷

Important

종속성 누락으로 인해 앱이 실패하는 경우 배포 중에 requirements.txt 파일이 처리되지 않습니다. 이 동작은 이 문서에 표시된 대로 명령을 사용하지 az webapp up 않고 포털에서 직접 웹앱을 만든 경우에 발생합니다.

az webapp up 명령은 특히 빌드 동작 SCM_DO_BUILD_DURING_DEPLOYMENT 을 .로 true설정합니다. 포털을 통해 앱 서비스를 프로비전한 경우 이 작업은 자동으로 설정되지 않습니다.

다음 단계에서는 작업을 설정합니다.

  1. Azure Portal을 열고 App Service를 선택한 다음 구성을 선택합니다.
  2. 애플리케이션 설정 탭에서 새 애플리케이션 설정을 선택합니다.
  3. 팝업이 나타나면 이름을 로 설정하고 값을 설정하며 true확인을 선택합니다.SCM_DO_BUILD_DURING_DEPLOYMENT
  4. 구성 페이지의 맨 위에 있는 저장을 선택합니다.
  5. 파이프라인 다시 실행 배포하는 동안 종속성을 설치해야 합니다.

파이프라인 실행 트리거

파이프라인 실행을 트리거하려면 리포지토리에 변경 내용을 커밋합니다. 예를 들어 앱에 새 기능을 추가하거나 앱의 종속성을 업데이트할 수 있습니다.

  1. GitHub 리포지토리로 이동합니다.
  2. 앱의 제목 변경과 같이 코드를 변경합니다.
  3. 리포지토리에 변경 내용을 커밋합니다.
  4. 파이프라인으로 이동하여 새 실행이 생성되었는지 확인합니다.
  5. 실행이 완료되면 새 빌드가 웹앱에 배포되었는지 확인합니다.
    1. Azure Portal에서 웹앱으로 이동합니다.
    2. 배포 센터를 선택하고 로그 탭을 선택합니다.
    3. 새 배포가 나열되었는지 확인합니다.

Django에 대한 고려 사항

별도의 데이터베이스를 사용하는 경우 Azure Pipelines를 사용하여 Azure 앱 Service on Linux에 Django 앱을 배포할 수 있습니다. App Service에서 db.sqlite3 파일을 잠가 읽기 및 쓰기를 모두 차단하므로 SQLite 데이터베이스를 사용할 수 없습니다. 이 동작은 외부 데이터베이스에 영향을 주지 않습니다.

App Service에서 Python 앱 구성 - 컨테이너 시작 프로세스설명된 대로 App Service는 앱 코드 내에서 일반적으로 앱 개체를 포함하는 wsgi.py 파일을 자동으로 찾습니다. 어떤 방식으로든 시작 명령을 사용자 지정하려면 이전 섹션에서 설명한 대로 YAML 파이프라인 파일의 단계에서 매개 변수 AzureWebApp@1 를 사용합니다startUpCommand.

Django를 사용하는 경우 일반적으로 앱 코드를 배포한 후 사용하여 manage.py migrate 데이터 모델을 마이그레이션하려고 합니다. 이 목적을 위해 배포 후 스크립트를 사용하여 추가할 startUpCommand 수 있습니다. 예를 들어 AzureWebApp@1 작업의 속성은 다음과 같습니다 startUpCommand .

  - task: AzureWebApp@1
      displayName: 'Deploy Azure Web App : $(webAppName)'
      inputs:
        azureSubscription: $(azureServiceConnectionId)
        appName: $(webAppName)
        package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
        startUpCommand: 'python manage.py migrate'

빌드 에이전트에서 테스트 실행

빌드 프로세스의 일부로 앱 코드에서 테스트를 실행할 수 있습니다. 테스트는 빌드 에이전트에서 실행되므로 빌드 에이전트의 가상 환경에 종속성을 설치해야 합니다. 테스트를 실행한 후 배포할 .zip 파일을 만들기 전에 가상 환경을 삭제합니다. 다음 스크립트 요소는 이 프로세스를 보여 줍니다. azure-pipelines.yml 파일의 ArchiveFiles@2작업 앞에 배치합니다. 자세한 내용은 플랫폼 간 스크립트 실행을 참조 하세요.

# The | symbol is a continuation character, indicating a multi-line script.
# A single-line script can immediately follow "- script:".
- script: |
    python -m venv .env
    source .env/bin/activate
    pip install setuptools
    pip install -r requirements.txt

  # The displayName shows in the pipeline UI when a build runs
  displayName: 'Install dependencies on build agent'

- script: |
    # Put commands to run tests here
    displayName: 'Run tests'

- script: |
    echo Deleting .env
    deactivate
    rm -rf .env
  displayName: 'Remove .env before zip'

PublishTestResults@2 같은 작업을 사용하여 테스트 결과를 파이프라인에 게시할 수도 있습니다. 자세한 내용은 Python 앱 빌드 - 테스트 실행을 참조 하세요.

리소스 정리

이 자습서에서 만든 Azure 리소스에 대한 요금이 발생하지 않도록 하려면 다음을 수행합니다.

  • 만든 프로젝트를 삭제합니다. 프로젝트를 삭제하면 파이프라인 및 서비스 연결이 삭제됩니다.

  • App Service 및 App Service 계획을 포함하는 Azure 리소스 그룹을 삭제합니다. Azure Portal에서 리소스 그룹으로 이동하여 리소스 그룹 삭제를 선택하고 프롬프트를 따릅니다.

  • Cloud Shell에 대한 파일 시스템에 기본 스토리지 계정을 삭제합니다. Cloud Shell을 닫은 다음 cloud-shell-storage로 시작하는 리소스 그룹으로 이동하여 리소스 그룹 삭제를 선택하고 프롬프트를 따릅니다.

다음 단계