Поделиться через


Использование Azure Pipelines для создания и развертывания веб-приложения Python в службе приложение Azure

Azure DevOps Services

Используйте Azure Pipelines для непрерывной интеграции и непрерывной доставки (CI/CD) для создания и развертывания веб-приложения Python для приложение Azure службы в Linux. Конвейер автоматически создает и развертывает веб-приложение Python для Служба приложений при наличии фиксации в репозитории.

Вы узнаете, как выполнять следующие задачи:

  • создавать веб-приложения в службе приложений Azure;
  • Создайте проект в Azure DevOps.
  • Подключите проект DevOps к Azure.
  • Создайте конвейер, зависящий от Python.
  • Запустите конвейер, чтобы создать и развернуть приложение в веб-приложении в Служба приложений.

Необходимые компоненты

Создание репозитория для кода приложения

Вилку примера репозитория в https://github.com/Microsoft/python-sample-vscode-flask-tutorial учетную запись GitHub.

На локальном узле клонируйте репозиторий GitHub. Используйте следующую команду, заменив <repository-url> 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. По завершении закройте окно браузера и остановите сервер Flask с помощью ctrl+C.

Открытие окна Cloud Shell

  1. Войдите на портал Azure по адресу https://portal.azure.com.

  2. Откройте Azure CLI, нажав кнопку Cloud Shell на панели инструментов портала.

    Снимок экрана: кнопка Azure Cloud Shell на панели инструментов портал Azure.

  3. Cloud Shell отображается в нижней части браузера. Выберите Bash в раскрывающемся меню.

    Снимок экрана: Azure Cloud Shell.

  4. Чтобы предоставить вам больше места для работы, нажмите кнопку "Развернуть".

Создание веб-приложения службы приложение Azure

Создайте веб-приложение службы приложение Azure из Cloud Shell в портал Azure.

Совет

Чтобы вставить в Cloud Shell, нажмите клавиши CTRL+SHIFT+V или щелкните правой кнопкой мыши и выберите "Вставить" в контекстном меню.

  1. Клонируйте репозиторий с помощью следующей команды, заменив <repository-url> URL-адрес вилированного репозитория.

    git clone <repository-url>
    
  2. Измените каталог на клонированную папку репозитория, поэтому az webapp up команда распознает приложение как приложение Python.

    cd python-sample-vscode-flask-tutorial
    
  3. Используйте команду az webapp up, чтобы подготовить Служба приложений и выполнить первое развертывание приложения. Замените <your-web-app-name> на имя, уникальное в Azure. Как правило, вы используете личное или корпоративное имя вместе с идентификатором приложения, например <your-name>-flaskpipelines. URL-адрес приложения становится your-appservice.azurewebsites.net>.<

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

    Выходные данные az webapp up JSON команды показывают:

    {
      "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 значения. Используется runtime_version в файле YAML конвейера. Это URL URL-адрес веб-приложения. Его можно использовать, чтобы убедиться, что приложение запущено.

    Примечание.

    Команда az webapp up выполняет следующие действия:

    • создание группы ресурсов по умолчанию;

    • создание плана службы приложений по умолчанию;

    • создание приложения с указанным именем.

    • Zip-файл развертывает все файлы из текущего рабочего каталога с включенной автоматизацией сборки.

    • Локальное кэширование параметров в файле .azure/config, позволяющее не указывать их снова при последующем развертывании с помощью az webapp up или других команд az webapp из папки проекта. По умолчанию кэшированные значения используются автоматически.

    Действие по умолчанию можно переопределить собственными значениями с помощью параметров команды. Дополнительные сведения см. в az webapp up.

  4. В приложении python-sample-vscode-flask-tutorial есть файл startup.txt , содержащий определенную команду запуска для веб-приложения. Задайте для свойства конфигурации веб-приложения startup-file значение startup.txt.

    1. Скопируйте resourcegroup значение из выходных az webapp up данных команды.

    2. Введите следующую команду, используя группу ресурсов и имя приложения.

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

    По завершении команды отображаются выходные данные JSON, содержащие все параметры конфигурации для веб-приложения.

  5. Чтобы увидеть запущенное приложение, откройте браузер и перейдите к URL показанному в выходных az webapp up данных команды. Если вы видите универсальную страницу, подождите несколько секунд до начала Служба приложений, а затем обновите страницу. Убедитесь, что вы видите заголовок 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. Этот доступ ограничен ролями, назначенными субъекту-службе, что позволяет контролировать доступ к ресурсам и на каком уровне.

Чтобы создать субъект-службу, перейдите в cloud shell (bash) и выполните следующую команду. Замените <service-principal-name> именем субъекта-службы, <your-subscription-id> идентификатором подписки и <your-resource-group> группой ресурсов для веб-приложения.

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>",
  ...
}

Запишите clientIdзначения , clientSecretsubscriptionIdи tenantId значения. Эти значения необходимы для создания подключения к службе в следующем разделе.

Создание подключения службы

Подключение службы позволяет создать подключение для предоставления аутентифицированного доступа из Azure Pipelines к внешним и удаленным службам. Чтобы развернуть веб-приложение службы приложение Azure, создайте подключение службы к группе ресурсов, содержащей веб-приложение.

  1. На странице проекта выберите параметры проекта.

    Снимок экрана: кнопка

  2. Выберите подключения службы в разделе "Конвейеры" в меню.

  3. Выберите Создать подключение к службе.

  4. Выберите Azure Resource Manager и нажмите кнопку "Далее".

    Снимок экрана: выбор подключения службы Azure Resource Manager.

  5. Выберите метод проверки подлинности и нажмите кнопку "Далее".

  6. В диалоговом окне "Новое подключение службы Azure" введите сведения, относящиеся к выбранному методу проверки подлинности. Дополнительные сведения о методах проверки подлинности см. в статье "Подключение к Azure" с помощью подключения службы Azure Resource Manager.

    Например, если вы используете федерацию удостоверений рабочей нагрузки (автоматически) или метод проверки подлинности субъекта-службы (автоматически), введите необходимые сведения.

    Снимок экрана: диалоговое окно

    Поле Description
    Уровень области Выберите Подписка.
    Подписка Имя подписки Azure.
    Группа ресурсов Имя группы ресурсов, содержащей веб-приложение.
    Имя подключения службы Описательное имя подключения.
    Предоставление разрешений доступа всем конвейерам Выберите этот параметр, чтобы предоставить доступ ко всем конвейерам.
  7. Выберите Сохранить.

Новое подключение отображается в списке подключений службы и готово к использованию в Azure Pipeline.

  1. На странице проекта выберите параметры проекта.

    Снимок экрана: кнопка

  2. Выберите подключения службы в разделе "Конвейеры" в меню.

  3. Выберите Создать подключение к службе.

  4. Выберите Azure Resource Manager и нажмите кнопку "Далее".

    Снимок экрана: выбор подключения службы Azure Resource Manager.

  5. В новом подключении службы Azure выберите субъект-службу (вручную) и нажмите кнопку "Далее"

  6. В следующем диалоговом окне укажите необходимые сведения.

    Снимок экрана: диалоговое окно

    Поле Description
    Среда Выберите Azure Cloud.
    Уровень области Выберите Подписка.
    Идентификатор подписки Идентификатор подписки.
    Имя подписки Имя подписки Azure.
    Идентификатор субъекта-службы Значение appId объекта JSON, возвращаемого командой az ad sp create-for-rbac .
    Ключ субъекта-службы Значение password объекта JSON, возвращаемого командой az ad sp create-for-rbac .
    Идентификатор клиента Значение tenant объекта JSON, возвращаемого командой az ad sp create-for-rbac .
  7. Нажмите кнопку "Проверить" , чтобы проверить подключение.

  8. Введите имя подключения службы.

  9. Убедитесь, что выбрано разрешение на доступ ко всем конвейерам .

  10. Выберите " Проверить и сохранить".

Новое подключение отображается в списке подключений службы и готово к использованию Azure Pipelines из проекта.

Настройка локального агента

Если вы используете собственный локальный агент, необходимо настроить агент для запуска Python. Скачивание версий Python не поддерживается для локальных агентов. Необходимо предварительно установить версию Python. Используйте полный установщик, чтобы получить версию Python, совместимую с pip.

Чтобы избежать несовместимых проблем, следует сопоставить версию Python с версией среды выполнения в веб-приложении приложение Azure Services. Версия среды выполнения отображается в выходных данных az webapp up JSON команды.

Требуемая версия Python должна быть добавлена в кэш инструментов в локальном агенте, чтобы задача может использовать ее. Как правило, кэш инструментов находится в каталоге _work/_tool агента; Кроме того, путь можно переопределить с помощью переменной среды AGENT_TOOLSDIRECTORY. В каталоге средств создайте следующую структуру каталогов на основе версии Python:

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

Номер версии должен соответствовать формату 1.2.3. Платформа должна быть либо x86, либо x64. Файлы инструментов должны быть распакованными файлами версии Python. Должен {platform}.complete быть 0-байтовый файл, который выглядит как x86.complete или x64.complete просто означает, что средство правильно установлено в кэше.

Например, если вы используете Python 3.11 на 64-разрядном компьютере Windows, структура каталогов будет выглядеть следующим образом:

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

Если у вас уже есть версия Python, которую вы хотите использовать на компьютере, на котором размещен агент, можно скопировать файлы в кэш инструментов. Если у вас нет версии Python, ее можно скачать на веб-сайте Python.

Создание конвейера

Создайте конвейер для создания и развертывания веб-приложения Python в службе приложение Azure. Чтобы понять основные понятия конвейера, просмотрите:

  1. В меню навигации слева выберите "Конвейеры".

    Снимок экрана: выбор конвейеров на панели мониторинга проекта.

  2. Выберите Создать конвейер.

    Снимок экрана: новая кнопка конвейера в списке конвейеров.

  3. В диалоговом окне " Где находится код " выберите GitHub. Возможно, вам будет предложено войти в GitHub.

    Снимок экрана: выбор GitHub в качестве расположения кода.

  4. На экране "Выбор репозитория" выберите вилку репозитория.

    Снимок экрана: выбор репозитория.

  5. Возможно, вам будет предложено ввести пароль GitHub еще раз в качестве подтверждения.

  6. Если расширение Azure Pipelines не установлено на сайте GitHub, GitHub предложит установить расширение Azure Pipelines .

    Установите расширение Azure Pipelines на GitHub.

    На этой странице прокрутите вниз до раздела доступа к репозиторию, выберите, следует ли установить расширение на все репозитории или только выбранные, а затем нажмите кнопку "Утвердить и установить".

    Снимок экрана: утверждение и установка расширения Azure Pipelines на сайте GitHub.

  7. В диалоговом окне "Настройка конвейера" выберите Python для веб-приложения Linux в Azure.

  8. Выберите подписку Azure и нажмите кнопку "Продолжить".

  9. Если вы используете имя пользователя и пароль для проверки подлинности, браузер откроется для входа в учетную запись Майкрософт.

  10. Выберите имя веб-приложения в раскрывающемся списке и выберите " Проверить и настроить".

Azure Pipelines создает файл azure-pipelines.yml и отображает его в редакторе конвейеров YAML. Файл конвейера определяет конвейер CI/CD в виде ряда этапов, заданий и шагов, где каждый шаг содержит сведения о различных задачах и сценариях. Изучите работу конвейера. Убедитесь, что все входные данные по умолчанию подходят для кода.

  1. В меню навигации выберите "Конвейеры".

    Снимок экрана: выбор конвейеров на панели мониторинга проекта.

  2. Выберите Создать конвейер.

    Снимок экрана: кнопка

  3. В диалоговом окне " Где находится код " выберите GitHub Enterprise Server. Возможно, вам будет предложено войти в GitHub.

    Снимок экрана: выбор GitHub в качестве расположения кода.

  4. На вкладке "Выбор репозитория " выберите вилку репозитория.

    Снимок экрана: выбор репозитория.

  5. Возможно, вам будет предложено ввести пароль GitHub еще раз в качестве подтверждения.

  6. Если расширение Azure Pipelines не установлено на сайте GitHub, GitHub предложит установить расширение Azure Pipelines .

    Снимок экрана: расширение Azure Pipelines на GitHub.

    На этой странице прокрутите вниз до раздела доступа к репозиторию, выберите, следует ли установить расширение на все репозитории или только выбранные, а затем нажмите кнопку "Утвердить и установить".

    Снимок экрана: утверждение и установка расширения Azure Pipelines на сайте GitHub.

  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 -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. Замените следующие заполнители собственными значениями:

    Заполнитель Description
    <your-service-connection-name> Имя созданного подключения службы.
    <your-web-app-name> Имя веб-приложения службы приложение Azure.
    <your-pool-name> Имя пула агентов, который вы хотите использовать.
    <your-python-version> Версия Python, запущенная в агенте. Рекомендуется сопоставить эту версию с версией Python, работающей в веб-приложении. Версия веб-приложения отображается в выходных az webapp up данных JSON команды.

Файл конвейера YAML

В следующем объяснении описывается файл конвейера YAML. Дополнительные сведения о схеме файлов YAML конвейера см . в справочнике по схеме YAML.

Ниже показан полный пример файла YAML конвейера:

trigger:
- main

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

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

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

  # Environment name
  environmentName: '<your-webapp-name>'

  # Project root folder. Point to the folder containing manage.py file.
  projectRoot: $(System.DefaultWorkingDirectory)

  pythonVersion: '3.11'

stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: BuildJob
    pool:
      vmImage: $(vmImageName)
    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

    - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
      displayName: 'Upload package'
      artifact: drop

- stage: Deploy
  displayName: 'Deploy Web App'
  dependsOn: Build
  condition: succeeded()
  jobs:
  - deployment: DeploymentJob
    pool:
      vmImage: $(vmImageName)
    environment: $(environmentName)
    strategy:
      runOnce:
        deploy:
          steps:

          - task: UsePythonVersion@0
            inputs:
              versionSpec: '$(pythonVersion)'
            displayName: 'Use Python version'

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

Переменные

В variables разделе содержатся следующие переменные:

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

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

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

# Environment name
environmentName: '<your-webapp-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'

Переменная Description
azureServiceConnectionId Идентификатор или имя подключения службы Azure Resource Manager.
webAppName Имя веб-приложения службы приложение Azure.
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-webapp-name>'

# Environment name
environmentName: '<your-webapp-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'
Переменная Description
azureServiceConnectionId Имя подключения службы Azure Resource Manager.
webAppName имя веб-приложения.
environmentName Имя среды, используемой на этапе развертывания.
projectRoot Папка, содержащая код приложения. Это значение является автоматической системной переменной.
pythonVersion Версия Python, используемая в агентах сборки и развертывания.

Этап сборки

Этап сборки содержит одно задание, которое выполняется в операционной системе, определенной в переменной vmImageName.

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

Этап сборки содержит одно задание, которое выполняется в агенте в пуле, определяемом параметром имени. Вы можете указать возможности агента с помощью ключевого demands слова. Например, указывает, demands: python что агент должен быть установлен на Python. Чтобы указать локальный агент по имени, можно использовать ключевое 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 параметре, workingDirectory указывает расположение кода приложения.

      - 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"
    
  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
    
    Параметр Description
    rootFolderOrFile Расположение кода приложения.
    includeRootFolder Указывает, следует ли включить корневую папку в файл .zip . Задайте для этого параметра false значение в противном случае, содержимое файла .zip помещаются в папку с именем s и контейнер Служба приложений в Linux не может найти код приложения.
    archiveType Тип создаваемого архива. Задайте значение zip.
    archiveFile Расположение создаваемого файла .zip .
    replaceExistingArchive Указывает, следует ли заменить существующий архив, если файл уже существует. Задайте значение true.
    upload Расположение файла .zip для отправки.
    artifact Имя создаваемого артефакта.

Этап развертывания

Этап развертывания выполняется, если этап сборки завершается успешно. Следующие ключевые слова определяют это поведение:

  dependsOn: Build
  condition: succeeded()

Этап развертывания содержит одно задание развертывания, настроенное со следующими ключевыми словами:

  - deployment: DeploymentJob
    pool:
      vmImage: $(vmImageName)
    environment: $(environmentName)
Ключевое слово Description
deployment Указывает, что задание является заданием развертывания, предназначенным для среды.
pool Указывает пул агентов развертывания. Пул агентов по умолчанию, если имя не указано. Ключевое vmImage слово определяет операционную систему для образа виртуальной машины агента.
environment Указывает среду для развертывания. Среда автоматически создается в проекте при запуске задания.
  - deployment: DeploymentJob
    pool:
      name: <your-pool-name>
    environment: $(environmentName)
Ключевое слово Description
deployment Указывает, что задание является заданием развертывания, предназначенным для среды.
pool Указывает пул агентов, используемый для развертывания. Этот пул должен содержать агент с возможностью запуска версии Python, указанной в конвейере.
environment Указывает среду для развертывания. Среда автоматически создается в проекте при запуске задания.

Ключевое strategy слово используется для определения стратегии развертывания. Ключевое runOnce слово указывает, что задание развертывания выполняется один раз. Ключевое deploy слово указывает шаги, выполняемые в задании развертывания.

  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
    
    Параметр Description
    azureSubscription Идентификатор или имя подключения службы Azure Resource Manager.
    appName имя веб-приложения.
    package Расположение развернутого файла .zip .

    Кроме того, так как репозиторий python-vscode-flask-tutorial содержит ту же команду запуска в файле с именем startup.txt, вы можете указать этот файл, добавив параметр: startUpCommand: 'startup.txt'

В 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
    
    Параметр Description
    azureSubscription Идентификатор или имя подключения службы Azure Resource Manager.
    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'
    
    Параметр Description
    azureSubscription Идентификатор или имя подключения службы Azure Resource Manager.
    appName имя веб-приложения.
    package Расположение развернутого файла .zip .
    startUpCommand Команда, выполняемая после развертывания приложения. В примере приложения используется startup.txt.

Запуск конвейера

Теперь вы готовы попробовать его!

  1. В редакторе нажмите кнопку "Сохранить и запустить".

  2. В диалоговом окне "Сохранить и запустить" добавьте сообщение фиксации, а затем нажмите кнопку "Сохранить и запустить".

    Конвейер можно наблюдать за выполнением, выбрав этапы или задания в сводке по выполнению конвейера.

    Снимок экрана: раздел сводных этапов выполнения конвейера.

    Рядом с каждым этапом и заданием рядом с каждым этапом и заданием по мере успешного завершения есть зеленые флажки. Если возникают ошибки, они отображаются в сводке или в шагах задания.

    Снимок экрана: этапы конвейера.

    Вы можете быстро вернуться в редактор YAML, выбрав вертикальные точки в правом верхнем углу страницы "Сводка " и выбрав "Изменить конвейер":

    Снимок экрана: изменение канала строковый комментарий из отчета о сборке.

  3. В задании развертывания выберите задачу "Развернуть веб-приложение Azure", чтобы отобразить выходные данные. Чтобы посетить развернутый сайт, удерживайте клавишу CTRL и выберите URL-адрес после App Service Application URL.

    Если вы используете пример приложения, приложение должно выглядеть следующим образом:

    Снимок экрана: представление примера приложения, работающего на Служба приложений.

Внимание

Если приложение завершается ошибкой из-за отсутствующих зависимостей, requirements.txt файл не был обработан во время развертывания. Это происходит, если вы создали веб-приложение непосредственно на портале, а не с помощью az webapp up команды, как показано в этой статье.

Команда az webapp up специально задает действие SCM_DO_BUILD_DURING_DEPLOYMENT trueсборки. Если вы подготовили службу приложений через портал, это действие не устанавливается автоматически.

Ниже описано, как задать действие.

  1. Откройте портал Azure, выберите Служба приложений, а затем выберите "Конфигурация".
  2. На вкладке "Параметры приложения" выберите "Создать приложение".
  3. В появившемся всплывающем ок задайте имяSCM_DO_BUILD_DURING_DEPLOYMENT, задайте значение "Значениеtrue" и нажмите кнопку "ОК".
  4. Нажмите кнопку Сохранить в верхней части страницы Конфигурация.
  5. Повторный запуск конвейера. Зависимости должны быть установлены во время развертывания.

Активация выполнения конвейера

Чтобы активировать запуск конвейера, зафиксируйте изменение в репозитории. Например, можно добавить новую функцию в приложение или обновить зависимости приложения.

  1. Перейдите в репозиторий GitHub.
  2. Внесите изменения в код, например изменение названия приложения.
  3. Зафиксируйте изменение в репозитории.
  4. Перейдите к конвейеру и проверьте создание нового запуска.
  5. По завершении выполнения убедитесь, что новая сборка развернута в веб-приложении.
    1. Откройте портал Azure и перейдите к своему веб-приложению.
    2. Выберите Центр развертывания и перейдите на вкладку "Журналы ".
    3. Убедитесь, что новое развертывание указано.

Рекомендации по Django

Azure Pipelines можно использовать для развертывания приложений Django для приложение Azure службы в Linux, если вы используете отдельную базу данных. Невозможно использовать базу данных SQLite, так как Служба приложений блокирует файл db.sqlite3, предотвращая операции чтения и записи. Это поведение не влияет на внешнюю базу данных.

Как описано в разделе "Настройка приложения Python на Служба приложений — процесс запуска контейнера", Служба приложений автоматически ищет файл wsgi.py в коде приложения, который обычно содержит объект приложения. Если вы хотите настроить команду запуска каким-либо образом, используйте startUpCommand параметр на AzureWebApp@1 шаге файла конвейера YAML, как описано в предыдущем разделе.

При использовании Django обычно требуется перенести модели данных, используя manage.py migrate после развертывания кода приложения. Для этого можно добавить startUpCommand скрипт после развертывания. Например, вот startUpCommand свойство в задаче AzureWebApp@1.

  - 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 для развертывания. Следующие элементы скрипта иллюстрируют этот процесс. Поместите их перед задачей ArchiveFiles@2 в файле azure-pipelines.yml . Дополнительные сведения см. в разделе "Запуск кроссплатформенных сценариев".

# 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, созданные в этом руководстве, выполните следующие действия.

  • Удалите созданный проект. При удалении проекта удаляется подключение конвейера и службы.

  • Удалите группу ресурсов Azure, содержащую Служба приложений и план Служба приложений. В портал Azure перейдите в группу ресурсов, выберите "Удалить группу ресурсов" и следуйте инструкциям.

  • Удалите учетную запись хранения, которая поддерживает файловую систему для Cloud Shell. Закройте Cloud Shell, а затем перейдите в группу ресурсов, которая начинается с cloud-shell-storage, выберите "Удалить группу ресурсов" и следуйте инструкциям.

Следующие шаги