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


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

Azure DevOps Services

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

Изучив это руководство, вы:

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

Дополнительные сведения о концепциях Azure Pipelines см. в следующем видео:

Предварительные условия

Продукт Требования
Azure DevOps - Проект Azure DevOps.
— способность запуска потоков на хостинговых агентах Microsoft. Вы можете приобрести параллельное задание или запросить уровень "Бесплатный".
— Базовые знания о YAML и Azure Pipelines. Дополнительные сведения см. в разделе Создайте ваш первый конвейер.
Разрешения - :
     — Чтобы создать конвейер: необходимо быть в группе Участников, и у группы должно быть разрешение создать конвейер сборки установлено на "Разрешить". Члены группы "Администраторы проектов" могут управлять конвейерами.
    — Для создания подключений к службам необходимо иметь роль администратора или создателя для подключений служб.
GitHub — учетная запись GitHub.
- Подключение службы GitHub для авторизации Azure Pipelines.
Лазурный Подписка Azure
Продукт Требования
Azure DevOps - Проект Azure DevOps.
— самостоятельно размещённый агент. Сведения о создании см. в разделе "Локальные агенты".
— Базовые знания о YAML и Azure Pipelines. Дополнительные сведения см. в разделе Создайте ваш первый конвейер.
Разрешения - :
    — Чтобы создать конвейер: необходимо быть в группе Участников, и у группы должно быть разрешение создать конвейер сборки установлено на "Разрешить". Члены группы "Администраторы проектов" могут управлять конвейерами.
    — Для создания подключений к службам необходимо иметь роль администратора или создателя для подключений служб.
GitHub — учетная запись GitHub.
- Подключение службы GitHub для авторизации Azure Pipelines.
Лазурный Подписка Azure

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

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

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

Требуемая версия 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.

Подготовка примера приложения

  1. Сделайте форк образца репозитория в вашем аккаунте GitHub на https://github.com/Microsoft/python-sample-vscode-flask-tutorial.

  2. Клонируйте вилку на локальный компьютер с помощью git clone <your-forked-repository-url>.git.

  3. Перейдите к локальному клону, используя его, cd python-sample-vscode-flask-tutorialи создайте и запустите приложение локально, чтобы убедиться, что оно работает.

    python -m venv .env
    source .env/Scripts/activate
    pip install --upgrade pip
    pip install -r ./requirements.txt
    export FLASK_APP=hello_app.webapp
    flask run
    
  4. Чтобы протестировать приложение, перейдите http://localhost:5000 в окно браузера и убедитесь, что вы видите название Visual Studio Flask Tutorial.

  5. Закройте окно браузера и остановите сервер Flask с помощью клавиш CTRL+C.

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

Создайте веб-приложение Службы приложений Azure с помощью Cloud Shell на портале Azure. Чтобы использовать Cloud Shell, войдите на портал Azure и нажмите кнопку Cloud Shell на панели инструментов.

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

Cloud Shell отображается в нижней части браузера. Убедитесь, что Bash выбран в качестве среды в раскрывающемся меню. Вы можете развернуть окно Cloud Shell, чтобы предоставить себе больше места.

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

Совет

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

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

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

    git clone <your-forked-repository-url>
    
  2. Измените каталог на папку клонированного репозитория.

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

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

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

  1. Создает группу ресурсов по умолчанию.
  2. Создает план службы приложений по умолчанию.
  3. Создает веб-приложение с назначенным именем. Это приложение URL<your-web-app-name>.azurewebsites.net.
  4. Развертывает все файлы из текущего рабочего каталога в ZIP-архив с включенной автоматизацией сборки.
  5. Кэширует параметры локально в файле .azure/config , чтобы их не нужно указывать повторно при развертывании из папки проекта с az webapp up другими az webapp командами. Команды автоматически используют кэшированные значения по умолчанию.

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

Команда az webapp up создает следующие выходные данные JSON для примера веб-приложения:

{
  "URL": <your-web-app-url>,
  "appserviceplan": <your-app-service-plan-name>,
  "location": <your-azure-region>,
  "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Запишите значения resourcegroupи runtime_version значения, которые будут использоваться далее в этом руководстве.

Настройка команды запуска

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

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

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

Чтобы увидеть запущенное приложение, откройте браузер и перейдите по адресу URL показанному в выходных данных команды az webapp up. Если вы видите обычную страницу, подождите несколько секунд до начала работы Службы приложений, а затем обновите страницу. Убедитесь, что вы видите название Visual Studio Flask Tutorial.

Подключение проекта Azure DevOps к подписке Azure

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

Создание субъекта-службы

Субъект-служба — это удостоверение, созданное для приложений, размещенных служб и автоматизированных средств для доступа к ресурсам Azure. Этот доступ ограничен ролями, назначенными субъекту-службе, что позволяет контролировать доступ к ресурсам на каком уровне.

Чтобы создать субъект-службу, выполните следующую команду в Bash Cloud Shell. Замените <service-principal-name> именем субъекта-службы, <your-subscription-id> идентификатором подписки Azure и <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:

{
  "appId": "<client GUID>",
  "displayName": "<service-principal-name">,
  "password": "<password-string>",
  "tenant": "<tenant GUID>"
  ...
}

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

Соединение с сервисом

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

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

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

  3. На странице "Подключения службы" выберите "Создать подключение службы " или "Создать подключение службы", если это подключение службы является первым в проекте.

    Снимок экрана: выбор подключений к службе конвейеров в параметрах проекта.

  4. На экране "Создать подключение службы " выберите Azure Resource Manager и нажмите кнопку "Далее".

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

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

  6. Для учетных данных выберите федерацию удостоверений рабочей нагрузки (автоматически).

  7. Заполните следующие поля:

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

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

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

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

  3. На странице "Подключения службы" выберите "Создать подключение службы " или "Создать подключение службы", если это подключение службы является первым в проекте.

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

  4. На экране "Создать подключение службы " выберите Azure Resource Manager и нажмите кнопку "Далее".

    Снимок экрана: выбор Azure Resource Manager.

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

    Снимок экрана: выбор метода аутентификации сервисного принципала (вручную).

  6. На экране подключения к службе Azure заполните следующие поля:

    • Среда: выбор облака Azure.
    • Уровень области: выберите подписку.
    • Идентификатор подписки. Введите идентификатор подписки Azure.
    • Имя подписки. Введите имя подписки Azure.
  7. В разделе "Проверка подлинности" выполните следующие поля:

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

  9. Установите флажок для предоставления разрешений на доступ ко всем конвейерам.

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

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

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

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

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

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

  2. На странице "Конвейеры" выберите "Создать конвейер" или "Создать конвейер ", если этот конвейер является первым в проекте.

    Скриншот кнопки новой конвейерной линии в списке конвейерных линий.

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

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

  4. На экране "Выбор репозитория" выберите форк вашего образца репозитория. GitHub может снова ввести пароль GitHub или установить приложение Azure Pipelines GitHub. Следуйте инструкциям на экране, чтобы установить приложение. Дополнительные сведения см. в разделе проверки подлинности приложения GitHub.

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

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

  6. На следующем экране выберите подписку Azure и нажмите кнопку "Продолжить".

  7. На следующем экране выберите веб-приложение Azure и выберите "Проверить и настроить".

Azure Pipelines создает файл azure-pipelines.yml и отображает его в редакторе конвейера YAML.

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

  2. На странице "Конвейеры" выберите "Создать конвейер" или "Создать конвейер ", если этот конвейер является первым в проекте.

    Скриншот кнопки новой конвейерной линии в списке конвейерных линий.

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

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

  4. На вкладке "Выбор репозитория " выберите вилку репозитория. GitHub может предложить вам снова ввести пароль GitHub или установить расширение или приложение Azure Pipelines GitHub. Следуйте инструкциям на экране, чтобы установить приложение. Дополнительные сведения см. в разделе Доступ к репозиториям GitHub.

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

  5. На странице "Настройка конвейера " выберите "Начальный конвейер".

  6. На странице проверки конвейера YAML замените содержимое начального azure-pipelines.yml файла следующим файлом конвейера YAML. В ФАЙЛЕ YAML:

    • Замените <your-service-connection-name><your-web-app-name> заполнители собственными значениями.

    • Замените <your-pool-name> именем пула агентов, который вы хотите использовать, и замените <your-python-version> версию Python, запущенную в агенте. Эта версия должна соответствовать выходным runtime_version данным az webapp up JSON команды.

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

На странице проверки конвейера YAML просмотрите конвейер, чтобы узнать, что это делает. Убедитесь, что все входные данные по умолчанию подходят для кода. Дополнительные сведения о схеме файла YAML конвейера см. в справочнике по схеме YAML.

Следующий полный пример файла конвейера YAML определяет конвейер CI/CD в виде ряда этапов, заданий и шагов, где каждый шаг содержит сведения о различных задачах и сценариях. Созданный код 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 setuptools
        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
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'

Переменные

Раздел variables в начале ФАЙЛА YAML определяет следующие переменные:

Переменная Описание
azureServiceConnectionId Идентификатор подключения службы Azure Resource Manager.
webAppName Имя веб-приложения службы приложений.
vmImageName Имя операционной системы, используемой для агента сборки.
environmentName Имя среды для развертывания, в которой автоматически создается при выполнении задания развертывания.
projectRoot Корневая папка, содержащая код приложения.
pythonVersion Версия Python, используемая в агентах сборки и развертывания.
Переменная Описание
azureServiceConnectionId Идентификатор подключения службы Azure Resource Manager.
webAppName Имя веб-приложения службы приложений.
environmentName Имя среды для развертывания, в которой автоматически создается при выполнении задания развертывания.
projectRoot Папка, содержащая код приложения. Это значение является автоматической системной переменной.
pythonVersion Версия Python, используемая в агентах сборки и развертывания.

Этапы сборки и развертывания

Конвейер состоит из этапов сборки и развертывания.

Этап сборки

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

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

Этап сборки содержит одно задание, которое выполняется на агенте pool в определяемом параметром name .

Вы можете указать возможности агента с помощью ключевого 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 setuptools
            pip install  -r ./requirements.txt
          workingDirectory: $(projectRoot)
          displayName: "Install requirements"
    
  3. Задача ArchiveFiles создает ZIP-архив, содержащий созданное веб-приложение.

        - task: ArchiveFiles@2
          displayName: 'Archive files'
          inputs:
            rootFolderOrFile: '$(projectRoot)'
            includeRootFolder: false
            archiveType: zip
            archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
            replaceExistingArchive: true
    

    Параметры задаются следующим образом:

    Параметр Описание
    rootFolderOrFile Расположение кода приложения.
    includeRootFolder Следует ли включить корневую папку в файл .zip . Задайте значение false. Если задано значение true, содержимое файла.zip помещаются в папку с именем s , а задача не может найти код приложения.
    archiveType Тип создаваемого архива. Задайте значение zip.
    archiveFile Расположение создаваемого файла .zip .
    replaceExistingArchive Указывает, следует ли заменить существующий архив, если файл уже существует. Задайте значение true.
  4. Затем .zip файл отправляется в конвейер в виде артефакта с именем drop. Этап развертывания использует файл.zip для развертывания приложения.

        - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
          displayName: 'Upload package'
          artifact: drop
    
    • Параметр upload задает расположение и имя файла .zip для отправки.
    • Параметр artifact задает имя созданного артефакта drop.

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

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

  dependsOn: Build
  condition: succeeded()

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

  - deployment: DeploymentJob
    pool:
      vmImage: $(vmImageName)
    environment: $(environmentName)
  • Ключевое deployment слово указывает, что задание является заданием развертывания , предназначенным для среды для развертывания. Автоматически environment создается в проекте при запуске задания.

  • Параметр pool указывает пул агентов развертывания и использует пул агентов по умолчанию, если name он не указан. Агент выполняется в операционной системе, определенной в переменной vmImageName , в данном случае ubuntu-latest.

  - deployment: DeploymentJob
    pool:
      name: <your-pool-name>
    environment: $(environmentName)
  • Ключевое deployment слово указывает, что задание является заданием развертывания , предназначенным для среды для развертывания. Автоматически environment создается в проекте при запуске задания.

  • Параметр pool указывает пул агентов развертывания и должен содержать агент с возможностью запуска версии Python, указанной в конвейере.

Ключевое strategy слово определяет стратегию развертывания.

  strategy:
    runOnce:
      deploy:
        steps:
  • Ключевое runOnce слово указывает, что задание развертывания выполняется один раз.
  • Ключевое deploy слово указывает steps выполнение в задании развертывания.

На steps этом этапе выполняются следующие задачи:

  1. UsePythonVersion@0 выбирает версию Python, используемую так же, как и на этапе сборки.
  2. AzureWebApp@1 развертывает веб-приложение и drop ZIP-артефакт.
- 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 содержит указанный azureServiceConnectionId в переменных конвейера.
  • Содержит appName значение переменной webAppName .
  • Указывает package имя и расположение файла.zip для развертывания.

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

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

Теперь вы готовы попробовать конвейер.

  1. В редакторе конвейера выберите "Сохранить и запустить".

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

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

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

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

    Снимок экрана комментария из конвейера редактирования в отчете о сборке.

  3. В задании развертывания выберите задачу «Развернуть веб-приложение Azure», чтобы отобразить результаты.

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

  4. В выходных данных выберите URL-адрес после URL-адреса приложения службы приложений. Приложение должно отображаться следующим образом:

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

Примечание.

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

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

Чтобы задать это действие, выполните указанные ниже действия.

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

Запуск выполнения конвейера

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

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

Развертывание приложений Django в службе приложений

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

Как описано в процессе запуска контейнера, служба приложений автоматически ищет файл 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 для публикации результатов теста в конвейере. Дополнительные сведения см. в разделе "Выполнение тестов".

Очистка ресурсов

Если вы закончите работу с ресурсами Azure, созданными в этом руководстве, удалите их, чтобы избежать дополнительных расходов.

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