PHP アプリをビルドしてテストする

Azure DevOps Services

Azure Pipelines の継続的インテグレーションと継続的デリバリー (CI/CD) を使用して、PHP プロジェクトのビルド、デプロイ、テストを行うことができます。

PHP パイプラインを作成する方法、サンプル プロジェクトを含むパイプラインを Azure App Service にデプロイする方法、環境を構成する方法について説明します。

Azure App Service の詳細については、「Azure App Service に PHP Web アプリを作成する」を参照してください。

前提条件

以下のものがそろっていることを確認してください。

  • リポジトリを作成できる GitHub アカウント。 無料で作成できます

  • Azure DevOps 組織。 無料で作成できます。 チームに既にある場合は、使用する Azure DevOps プロジェクトの管理者であることを確認します。

  • Microsoft によってホストされるエージェントでパイプラインを実行する機能。 Microsoft ホステッド エージェントを使用するには、Azure DevOps 組織が Microsoft ホステッド並列ジョブにアクセスできる必要があります。 並列ジョブを購入するか、無料の許可を要求することができます。

  • Azure アカウント。 持っていない場合は、無料で作成できます。

    ヒント

    初めて作成する場合、最も簡単な方法は、Azure Pipelines の組織と Azure サブスクリプションの両方の所有者と同じメール アドレスを使用することです。

  • Azure App Service にデプロイする場合は、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 ファイルを編集します。

パイプラインをカスタマイズするいくつかの一般的な方法については、以下を参照してください。

App Service にデプロイする

パイプラインを使用して、PHP Web アプリをビルドし、Azure App Service デプロイします。 Azure App Service は、Web アプリケーション、REST API、およびモバイル バックエンドをホストするための HTTP ベースのサービスです。

タスクを使用してファイルをアーカイブし、ビルド成果物を発行した後、Azure Web App タスクを使用して Azure App Service にデプロイできます。

このパイプラインには、ビルドとデプロイの 2 つのステージがあります。 ビルド段階では、PHP 8.3 が Composer とともにインストールされます。 アプリ ファイルはアーカイブされ、drop という名前のパッケージにアップロードされます。 デプロイ フェーズでは、drop パッケージが Web アプリとして Azure App Service にデプロイされます。


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-latest'
  # 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 は、PHP バージョンごとの多数の共通ライブラリと共に、Microsoft によってホストされるエージェントにプレインストールされています。 Linux、macOS、または Windows エージェントを使用してビルドを実行できます。 プレインストールされる PHP の詳細と正確なバージョンについては、「Microsoft によってホストされるエージェント」を参照してください。

Microsoft によってホストされる Ubuntu エージェントには、PHP の複数のバージョンがインストールされています。 /usr/bin/php の symlink は、現在設定されている PHP バージョンを指すため、php を実行すると、設定されたバージョンが実行されます。

既定以外の PHP バージョンを使用するには、update-alternatives ツールを使用して symlink がそのバージョンを指すように設定できます。 目的の PHP バージョンを設定するには、次のスニペットを azure-pipelines.yml ファイルに追加し、phpVersion 変数の値を変更します。

pool:
  vmImage: 'ubuntu-latest'

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'