生成和测试 PHP 应用

Azure DevOps Services

使用 Azure Pipelines 持续集成和持续交付(CI/CD)生成、部署和测试 PHP 项目。

了解如何创建 PHP 管道、将包含示例项目的管道部署到 Azure 应用服务,以及如何配置环境。

若要了解有关 Azure 应用服务的详细信息,请参阅 在 Azure 应用服务中创建 PHP Web 应用

先决条件

产品 要求
Azure DevOps - Azure DevOps 项目
- 能够在 Microsoft 托管的代理上运行管道。 可以购买 并行作业 ,也可以请求免费层。
- 对 YAML 和 Azure Pipelines 的基本知识。 有关详细信息,请参阅 创建第一个管道
- 权限:
     - 若要创建管道:必须位于 “参与者 ”组中,并且该组需要将 “创建生成管道 ”权限设置为“允许”。 项目管理员组的成员可以管理管道。
    - 若要创建服务连接:必须具有服务连接的管理员创建者角色。
GitHub - GitHub 帐户。
- 用于授权 Azure Pipelines 的 GitHub 服务连接
天蓝色 Azure 订阅
产品 要求
Azure DevOps - Azure DevOps 项目
- 自托管代理。 若要创建一个代理,请参阅 自承载代理
- 对 YAML 和 Azure Pipelines 的基本知识。 有关详细信息,请参阅 创建第一个管道
- 权限:
    - 若要创建管道:必须位于 “参与者 ”组中,并且该组需要将 “创建生成管道 ”权限设置为“允许”。 项目管理员组的成员可以管理管道。
    - 若要创建服务连接:必须具有服务连接的管理员创建者角色。
GitHub - GitHub 帐户。
- 用于授权 Azure Pipelines 的 GitHub 服务连接
天蓝色 Azure 订阅

如果要部署到 Azure 应用服务,则需要创建 Web 应用。

获取代码

如果 GitHub 上已有一个要部署的应用,则可以为该代码创建管道。 但是,如果你是新用户,则可以使用我们的示例代码获得更好的开端。 在这种情况下,请在 GitHub 处分叉以下存储库:

https://github.com/Azure-Samples/basic-php-composer

创建管道

  1. 登录到你的 Azure DevOps 组织,并转到你的项目。

  2. 转到管道,然后选择“ 新建管道”。

  3. 选择源位置(GitHub、Azure Repos Git、Bitbucket Cloud 或其他 Git 存储库)。

  4. 选择代码所在的存储库。

  5. 在“配置”选项卡中选择 PHP

  6. 确保 PHP 版本为 8.3。

  7. 检查新管道。 准备就绪后,选择“保存并运行”。

    新 YAML 管道中的“保存并运行”按钮

  8. 系统会提示将新的 azure-pipelines.yml 文件提交到存储库。 选择“ 保存”并再次运行

    如果您想观看管道的实际运作,请选择构建作业。

    现在,存储库中有一个可用的 YAML 管道(azure-pipelines.yml),可供自定义!

若要更改管道,请在“管道”页上选择管道,然后编辑azure-pipelines.yml文件。

阅读以深入了解自定义管道的常见方法。

部署到应用服务

使用管道生成 PHP Web 应用并部署到 Azure 应用服务。 Azure 应用服务是一项基于 HTTP 的服务,用于托管 Web 应用程序、REST API 和移动后端 。

可以使用任务来存档文件、发布生成项目,然后使用 Azure Web 应用任务部署到 Azure 应用服务。

此流水线分为两个阶段:构建和部署。 在构建阶段,安装了 PHP 8.3 和 Composer。 应用文件将存档并上传到名为 drop的包中。 在部署阶段,包 drop 将作为 Web 应用部署到 Azure 应用服务。


trigger:
- main

variables:
  # Azure Resource Manager connection created during pipeline creation
  azureSubscription: 'subscription-id'
  # Web app name
  webAppName: 'web-app-name'
  # Agent VM image name
  vmImageName: 'ubuntu-22.04'
  # Environment name
  environmentName: 'environment-name'
  # Root folder under which your composer.json file is available.
  rootFolder: $(System.DefaultWorkingDirectory)

stages:
- stage: Build
  displayName: Build stage
  variables:
    phpVersion: '8.3'
  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)'

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

    - 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

配置生成环境

使用 Azure Pipelines 生成 PHP 项目,而无需设置基础结构。

使用特定的 PHP 版本

PHP 预安装在 Microsoft托管的代理上,以及每个 PHP 版本的许多常见库。 可以使用 Linux、macOS 或 Windows 代理来运行生成。 有关详细信息和预安装的 PHP 的确切版本,请参阅 Microsoft托管代理

在Microsoft托管的 Ubuntu 代理上,安装了多个版本的 PHP。 /usr/bin/php 处的符号链接指向当前配置的 PHP 版本,这样当运行 php 时,当前配置的版本就会被执行。

若要使用非默认的 PHP 版本,可以使用 update-alternatives 工具创建指向该版本的符号链接。 通过将以下代码片段添加到 azure-pipelines.yml 文件并更改 phpVersion 变量的值来设置所需的 PHP 版本。

pool:
  vmImage: 'ubuntu-22.04'

variables:
  phpVersion: 8.2

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)'

安装依赖项

若要使用 Composer 安装依赖项,请将以下代码片段添加到 azure-pipelines.yml 文件中。

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

使用 phpunit 进行测试

若要使用 phpunit 运行测试,请将以下代码片段添加到 azure-pipelines.yml 文件中。

- script: ./phpunit
  displayName: 'Run tests with phpunit'

保留包含生成记录的 PHP 应用

若要使用生成记录保存此生成的项目,请将以下代码片段添加到 azure-pipelines.yml 文件中。 (可选)自定义 rootFolderOrFile 的值以更改存档中包含的内容。

- task: ArchiveFiles@2
  inputs:
    rootFolderOrFile: '$(system.defaultWorkingDirectory)'
    includeRootFolder: false
- task: PublishBuildArtifacts@1

使用自定义编辑器位置

如果 composer.json 位于子文件夹中而不是根目录,则可以使用 --working-dir 参数来告知撰写者要使用的目录。 例如,如果 composer.json 位于子文件夹 pkgs

composer install --no-interaction --working-dir=pkgs

还可以使用内置系统变量指定绝对路径:

composer install --no-interaction --working-dir='$(system.defaultWorkingDirectory)/pkgs'