다음을 통해 공유


PHP 앱 빌드, 테스트 및 배포

Azure DevOps Services

이 문서에서는 PHP 웹앱을 빌드하고 Azure App Service에 배포하는 파이프라인을 Azure Pipelines에서 만드는 방법을 보여 줍니다. App Service는 웹 애플리케이션, REST API 및 모바일 백 엔드를 호스팅하기 위한 HTTP 기반 서비스입니다. 파이프라인은 GitHub 원본에서 연속 통합을 사용하고 App Service에 지속적인 업데이트를 사용하여 PHP 앱을 자동으로 빌드, 테스트 및 배포합니다.

Azure Pipelines는 인프라를 설정하지 않고도 PHP 프로젝트를 빌드합니다. PHP는 PHP 버전에 대한 많은 일반 라이브러리와 함께 Microsoft 호스팅 에이전트에 사전 설치됩니다. Linux, macOS 또는 Windows 에이전트를 사용하여 빌드를 실행할 수 있습니다. 사전 설치된 PHP 버전에 대한 자세한 내용은 Software를 참조 하세요.

필수 조건

  • https://github.com/Azure-Samples/php-docs-hello-world에서 GitHub의 PHP 샘플 프로젝트에 대한 사용자의 고유 포크입니다.

    팁 (조언)

    샘플 프로젝트는 MICROSOFT 호스팅 에이전트에서 기본적으로 UTC로 설정되는 PHP의 기본 표준 시간대 설정을 사용합니다. 앱에 특정 표준 시간대가 필요한 경우 PHP 표준 시간대 설정을 참조하세요.

  • Azure App Service에서 프로젝트에 대해 만든 PHP 웹앱입니다. PHP 웹앱을 빠르게 만들려면 Azure App Service에서 PHP 웹앱 만들기를 참조하세요. 사용자 고유의 PHP GitHub 프로젝트 및 웹앱을 사용할 수도 있습니다.

다음 필수 구성 요소도 필요합니다.

제품 요구 사항
Azure DevOps - Azure DevOps 프로젝트입니다.
- Microsoft 호스팅 에이전트에서 파이프라인을 실행하는 기능입니다. 병렬 작업을 구매하거나 무료 등급을 요청할 수 있습니다.
- YAML 및 Azure Pipelines에 대한 기본 지식 자세한 내용은 첫 번째 파이프라인 만들기를 참조하세요.
- 권한:
     - 파이프라인을 만들려면 참가자 그룹에 있어야 하며 그룹에 빌드 파이프라인 만들기 권한이 허용으로 설정되어 있어야 합니다. 프로젝트 관리자 그룹의 구성원은 파이프라인을 관리할 수 있습니다.
    서비스 연결을 만들려면, 관리자 또는 작성자 역할이 있어야 합니다.
깃허브 - GitHub 계정입니다.
- Azure Pipelines에 권한을 부여하는 GitHub 서비스 연결 입니다.
Azure Azure 구독.
제품 요구 사항
Azure DevOps - Azure DevOps 프로젝트입니다.
자체적으로 호스팅되는 에이전트입니다. 에이전트를 만들려면 자체 호스팅 에이전트를 참조하세요.
- YAML 및 Azure Pipelines에 대한 기본 지식 자세한 내용은 첫 번째 파이프라인 만들기를 참조하세요.
- 권한:
    - 파이프라인을 만들려면 참가자 그룹에 있어야 하며 그룹에 빌드 파이프라인 만들기 권한이 허용으로 설정되어 있어야 합니다. 프로젝트 관리자 그룹의 구성원은 파이프라인을 관리할 수 있습니다.
    서비스 연결을 만들려면, 관리자 또는 작성자 역할이 있어야 합니다.
깃허브 - GitHub 계정입니다.
- Azure Pipelines에 권한을 부여하는 GitHub 서비스 연결 입니다.
Azure Azure 구독.

예제 파이프라인

다음 예제 azure-pipelines.yml 파일은 PHP를 Linux 웹앱으로 Azure에서 실행하는 파이프라인 템플릿에 기반하여 두 단계로 구성되어 Build 있습니다Deploy. 단계에서는 PHP 8.2를 설치한 후, 작업을 실행하여 프로젝트 파일을 아카이브하고, ZIP 빌드 아티팩트를 Build라는 이름의 패키지에 게시합니다.

Build 스테이지가 성공하면 Deploy 스테이지가 실행됩니다. drop 작업을 사용하여 App Service에 패키지를 배포 합니다. PhP를 Azure 템플릿에서 Linux 웹앱으로 사용하여 파이프라인을 만드는 경우 생성된 파이프라인은 구성 설정에 따라 변수 및 기타 값을 설정하고 사용합니다.

비고

Azure의 PHP as Linux Web App템플릿에서 파이프라인을 생성하고 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 프로젝트의 왼쪽 탐색 메뉴에서 파이프라인 을 선택한 다음, 프로젝트의 첫 번째 파이프라인인 경우 새 파이프라인 또는 만들기 파이프라인 을 선택합니다.

  2. 코드의 위치 페이지에서 GitHub를 선택합니다.

  3. 리포지토리 선택 페이지에서 포크된 php-docs-hello-world 리포지토리를 선택합니다.

  4. Azure Pipelines는 코드를 PHP 앱으로 인식하고 파이프라인 구성 페이지에서 여러 파이프라인 템플릿을 제안합니다. 이 예제에서는 Azure에서 LINux 웹앱으로 PHP를 선택합니다.

  5. 다음 화면에서 Azure 구독을 선택하고 계속을 선택합니다. 이 작업은 Azure 리소스에 대한 서비스 연결을 만듭니다.

  6. 다음 화면에서 Azure 웹앱을 선택하고 유효성 검사 및 구성을 선택합니다. Azure Pipelines는 azure-pipelines.yml 파일을 만들고 YAML 파이프라인 편집기에서 표시합니다.

  7. 파이프라인 YAML 검토 화면에서 파이프라인에 대한 코드를 검토합니다. 준비가 되면 저장을 선택하고 실행합니다.

    새 YAML 파이프라인의 저장 및 실행 단추를 보여 주는 스크린샷

  8. 다음 화면에서 저장을 선택하고 다시 실행하여 새 azure-pipelines.yml 파일을 리포지토리에 커밋하고 CI/CD 빌드를 시작합니다.

    비고

    파이프라인이 처음 실행되면 파이프라인이 만드는 환경에 액세스할 수 있는 권한을 요청합니다. 파이프라인이 환경에 액세스할 수 있는 권한을 부여하려면 [허용 ]을 선택합니다.

  9. 파이프라인의 작동을 확인하려면 실행 요약 페이지에서 작업을 선택합니다. 실행이 완료되면 Azure Web App 배포 단계에서 App Service 애플리케이션 URL 링크를 선택하여 배포된 웹앱을 확인합니다.

  10. URL로 이동하여 배포가 성공했는지 확인합니다. 샘플 앱의 Hello World! 출력이 표시됩니다.

파이프라인 사용자 지정

실행 요약 페이지에서 오른쪽 위에 있는 기타 작업 아이콘을 선택한 다음, 파이프라인 편집을 선택하거나 파이프라인 페이지의 오른쪽 위에서 편집을 선택하여 파이프라인을 편집할 수 있습니다. 리포지토리에 커밋하는 각 편집은 새 CI/CD 파이프라인 실행을 시작합니다.

다음과 같은 여러 가지 방법으로 파이프라인을 사용자 지정할 수 있습니다.

특정 PHP 버전 사용

Microsoft 호스팅 Ubuntu 에이전트에는 여러 PHP 버전이 설치되어 있습니다. /usr/bin/php의 symlink는 현재 PHP 버전을 가리키므로 실행php하면 집합 버전이 실행됩니다.

기본값이 아닌 PHP 버전을 사용하려면 명령을 사용하여 symlink를 원하는 버전으로 가리킵니다 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 표준 시간대 설정

Microsoft 호스팅 에이전트는 기본적으로 UTC이므로 PHP 함수는 date()strtotime()을 사용하여 UTC 값을 반환합니다. 파이프라인 스크립트에서 다른 표준 시간대를 사용하려면 환경 변수를 TZ 설정하거나 PHP 코드에서 호출 date_default_timezone_set() 합니다.

다음 예제에서는 스크립트 단계의 표준 시간대를 동부 시간으로 설정합니다. 빌드 작업의 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

Troubleshoot

서비스 연결 오류

배포 중에 권한 부여 오류로 인해 파이프라인이 실패하는 경우 Azure Resource Manager 서비스 연결 이 올바르게 구성되어 있고 App Service에 배포하는 데 필요한 권한이 있는지 확인합니다.

작성기 설치 실패

실패하면 composer installcomposer.json 파일이 작업 디렉터리에 있는지 확인합니다. 파일이 하위 디렉터리에 있는 경우 인수를 --working-dir 사용합니다. 리포지토리에 composer.json 없는 경우 파이프라인에서 Composer 단계를 제거합니다.

PHP 버전을 사용할 수 없음

같은 update-alternatives오류와 함께 실패하면 no alternatives for php8.x 요청된 PHP 버전이 에이전트 이미지에 설치되지 않습니다. Microsoft 호스팅 에이전트 소프트웨어 목록에서 사용 가능한 PHP 버전을 확인합니다.

배포 권한이 거부됨

권한 오류와 함께 배포 단계가 실패하는 경우 다음을 확인합니다.

  • 서비스 연결에는 App Service 리소스에 대한 기여자 역할이 있습니다.
  • 파이프라인에는 환경에 액세스할 수 있는 권한이 있습니다. 첫 번째 실행에서 메시지가 표시되면 [허용] 을 선택합니다.