Создание, тестирование и развертывание приложений PHP

Azure DevOps Services

В этой статье показано, как создать конвейер в Azure Pipelines, который создает веб-приложение PHP и развертывает его в Службе приложений Azure. Служба приложений — это служба на основе HTTP для размещения веб-приложений, REST API и мобильных серверных частей. Конвейер использует непрерывную интеграцию из источника GitHub и непрерывной доставки в Службу приложений для автоматического создания, тестирования и развертывания приложений PHP.

Azure Pipelines создает проекты PHP без необходимости настраивать любую инфраструктуру. PHP предварительно установлен в агентах, размещенных в Майкрософт, а также во многих распространенных библиотеках для версий PHP. Для выполнения сборок можно использовать агенты Linux, macOS или Windows. Дополнительные сведения о предварительно установленных версиях PHP см. в разделе Software.

Предпосылки

  • Свой форк образца проекта PHP на GitHub по адресу https://github.com/Azure-Samples/php-docs-hello-world.

    Подсказка

    В примере проекта используются параметры часового пояса PHP по умолчанию, которые по умолчанию используются в формате UTC для агентов, размещенных корпорацией Майкрософт. Если приложению требуется определенный часовой пояс, обратитесь к разделу "Настройка часового пояса PHP".

  • Веб-приложение PHP, созданное для проекта в Службе приложений Azure. Чтобы быстро создать веб-приложение PHP, см. статью "Создание веб-приложения PHP в службе приложений Azure". Вы также можете использовать собственный проект PHP GitHub и веб-приложение.

Вам также требуются следующие предварительные требования:

Продукт Требования
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

Пример конвейера

В следующем примере файл azure-pipelines.yml, основанный на шаблоне конвейера для PHP как веб-приложения Linux в Azure, имеет две стадии: Build и Deploy. Этап Build устанавливает PHP 8.2, а затем выполняет задачи для архивации файлов проекта и публикации артефакта сборки ZIP в пакет с именем drop.

Этап Deploy выполняется, если этап Build завершается успешно. Он развертывает пакет в службе приложений drop с помощью задачи Azure Web App. При использовании шаблона PHP как веб-приложения Linux на Azure для создания конвейера, сгенерированный конвейер задает и использует переменные и другие значения на основе ваших настроек конфигурации.

Замечание

Если вы создаете конвейер из PHP в качестве веб-приложения Linux в шаблоне Azure, а приложение PHP не использует Composer, удалите следующие строки из созданного конвейера перед сохранением и запуском. Конвейер шаблона завершается ошибкой, если composer.json отсутствует в репозитории.

    - script: composer install --no-interaction --prefer-dist
     workingDirectory: $(rootFolder)
     displayName: 'Composer install'
trigger:
- main

variables:
  # Azure Resource Manager service connection
  azureSubscription: 'service-connection-based-on-subscription-id'
  # Web app name
  webAppName: 'my-php-web-app'
  # Agent VM image name
  vmImageName: 'ubuntu-22.04'
  # Environment name
  environmentName: 'my-php-web-app-environment'
  # Root folder where your composer.json file is available.
  rootFolder: $(System.DefaultWorkingDirectory)

stages:
- stage: Build
  displayName: Build stage
  variables:
    phpVersion: '8.2'
  jobs:
  - job: BuildJob
    pool:
      vmImage: $(vmImageName)
    steps:
    - script: |
        sudo update-alternatives --set php /usr/bin/php$(phpVersion)
        sudo update-alternatives --set phar /usr/bin/phar$(phpVersion)
        sudo update-alternatives --set phpdbg /usr/bin/phpdbg$(phpVersion)
        sudo update-alternatives --set php-cgi /usr/bin/php-cgi$(phpVersion)
        sudo update-alternatives --set phar.phar /usr/bin/phar.phar$(phpVersion)
        php -version
      workingDirectory: $(rootFolder)
      displayName: 'Use PHP version $(phpVersion)'

    - task: ArchiveFiles@2
      displayName: 'Archive files'
      inputs:
        rootFolderOrFile: '$(rootFolder)'
        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: AzureWebApp@1
            displayName: 'Deploy Azure Web App'
            inputs:
              azureSubscription: $(azureSubscription)
              appName: $(webAppName)
              package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip

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

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

  1. В проекте Azure DevOps выберите Pipelines в меню навигации слева, а затем выберите "Создать конвейер " или "Создать конвейер ", если этот конвейер является первым в проекте.

  2. На странице "Где находится кодовая страница", выберите GitHub.

  3. На странице Выбор репозитория выберите форк репозитория php-docs-hello-world.

  4. Azure Pipelines распознает код как приложение PHP и предлагает несколько шаблоновконвейеров на странице "Настройка конвейера ". В этом примере выберите PHP в качестве веб-приложения Linux в Azure.

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

  6. На следующем экране выберите веб-приложение Azure и выберите "Проверить и настроить". Azure Pipelines создает файл azure-pipelines.yml и отображает его в редакторе конвейера YAML.

  7. На экране проверки вашего конвейера YAML просмотрите код вашего конвейера. Когда будете готовы, выберите Сохранить и запустить.

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

  8. На следующем экране нажмите кнопку "Сохранить и снова запустить ", чтобы зафиксировать новый файл azure-pipelines.yml в репозиторий и запустить сборку CI/CD.

    Замечание

    При первом запуске конвейера запрашивается разрешение на доступ к среде, которая она создает. Выберите "Разрешить, чтобы предоставить конвейеру доступ к среде".

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

  10. Убедитесь, что развертывание выполнено успешно, перейдя по URL-адресу. Вы увидите выходные данные примера приложения Hello World!

Настройка конвейера

Вы можете изменить конвейер, выбрав значок «Дополнительные действия» в правом верхнем углу страницы «Сводка запуска» и затем выбрав «Изменить конвейер». Также это можно сделать, выбрав «Изменить» в правом верхнем углу на странице самого конвейера. Каждое изменение, которое вы фиксируете в репозитории, запускает новый процесс работы конвейера CI/CD.

Конвейер можно настроить несколькими способами:

Использование определенной версии PHP

Агенты Ubuntu, размещенные корпорацией Майкрософт, имеют установлено несколько версий PHP. Символьная ссылка на /usr/bin/php указывает на текущую версию PHP, поэтому при запуске phpвыполняется заданная версия.

Чтобы использовать версию PHP, отличной от используемой по умолчанию, укажите ссылку на нужную версию с помощью update-alternatives команды. В конвейере YAML измените значение переменной phpVersion на нужную версию. Добавьте следующий фрагмент кода в variablessteps разделы этапа сборки:

variables:
  phpVersion: 8.3

steps:
- script: |
    sudo update-alternatives --set php /usr/bin/php$(phpVersion)
    sudo update-alternatives --set phar /usr/bin/phar$(phpVersion)
    sudo update-alternatives --set phpdbg /usr/bin/phpdbg$(phpVersion)
    sudo update-alternatives --set php-cgi /usr/bin/php-cgi$(phpVersion)
    sudo update-alternatives --set phar.phar /usr/bin/phar.phar$(phpVersion)
    php -version
  displayName: 'Use PHP version $(phpVersion)'

Установка часового пояса PHP

Агенты, размещенные корпорацией Майкрософт, по умолчанию используются в формате UTC, поэтому функции PHP, такие как date() и strtotime() возвращают значения UTC. Чтобы использовать другой часовой пояс в скриптах конвейера, задайте TZ переменную среды или вызов date_default_timezone_set() в коде PHP.

В следующем примере для шага скрипта задается часовой пояс для восточного времени. Добавьте этот фрагмент steps в раздел задания сборки:

- script: |
    export TZ='America/New_York'
    php -r "date_default_timezone_set('America/New_York'); echo date('Y-m-d H:i:s T');"
  displayName: 'Run PHP with Eastern time zone'

Список поддерживаемых идентификаторов часового пояса см. в списке поддерживаемых часовых поясов PHP.

Установка зависимостей

Чтобы использовать Composer для установки зависимостей, добавьте следующий фрагмент кода в steps раздел задания сборки:

- script: composer install --no-interaction --prefer-dist
  displayName: 'composer install'

Если файлcomposer.json отсутствует в корневом каталоге, используйте --working-dir аргумент, чтобы указать, какой каталог следует использовать. Например, если composer.json находится в вложенных папках /pkgs, используйте composer install --no-interaction --working-dir=pkgs. Можно также указать абсолютный путь с помощью встроенной системной переменной: --working-dir='$(System.DefaultWorkingDirectory)/pkgs'

Тестирование с помощью PHPUnit

Чтобы запустить тесты с помощью PHPUnit, сначала установите его в качестве зависимости разработки с помощью Composer, а затем запустите его. Добавьте следующий фрагмент кода в steps раздел задания сборки:

- script: composer require --dev phpunit/phpunit
  displayName: 'Install PHPUnit'

- script: vendor/bin/phpunit --log-junit $(Build.StagingDirectory)/test-results.xml
  displayName: 'Run tests with PHPUnit'

Сохранение артефактов PHP с записью сборки

Чтобы сохранить артефакты сборки с записью сборки, включите задачу "Архивные файлы " в конвейер и при необходимости настройте значение rootFolderOrFile для изменения того, что включает архив.

- task: ArchiveFiles@2
  inputs:
    rootFolderOrFile: '$(System.DefaultWorkingDirectory)'
    includeRootFolder: false

Устранение неполадок

Ошибки подключения службы

Если конвейер завершается ошибкой авторизации во время развертывания, убедитесь, что подключение службы Azure Resource Manager настроено правильно и имеет необходимые разрешения для развертывания в службе приложений.

Сбои установки Composer

При composer install сбое убедитесь, что файл composer.json присутствует в рабочем каталоге. Если файл находится в подкаталоге --working-dir , используйте аргумент. Если composer.json не существует в репозитории, удалите шаг Composer из конвейера.

Версия PHP недоступна

Если update-alternatives завершится с ошибкой, такой как no alternatives for php8.x, запрошенная версия PHP не установлена на образе агента. Проверьте список программного обеспечения агента, размещенного корпорацией Майкрософт , для доступных версий PHP.

Разрешение на развертывание запрещено

Если этап развертывания завершается неудачно из-за ошибки прав доступа, проверьте, что:

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