Azure Appservice для Django не работает с Azure Devops Pipeline

У меня есть служба приложений, работающая на Azure в среде Linux.

Я пытаюсь связать его с Azure Devops Pipeline, чтобы иметь CI/CD для репозиториев & веток на Github.

Я хочу, чтобы сборки происходили на Azure Pipeline & инфраструктуре Azure, а не на Github Actions.

Я попробовал все другие предложения, включая следующие переменные окружения на App Service :

SCM_DO_BUILD_DURING_DEPLOYMENT=true

WEBSITE_NODE_DEFAULT_VERSION=~18

WEBSITE_RUN_FROM_PACKAGE=true

Вот журналы, которые я получаю из журналов Kudu / Azure Devops Pipeline / AppService :

/home/LogFiles/2024_08_14_ln1xsdlwk0000K3_docker.log  (https://project-app-development.scm.azurewebsites.net/api/vfs/LogFiles/2024_08_14_ln1xsdlwk0000K3_docker.log)
2024-08-14T23:51:45.168Z INFO  -  Status: Image is up to date for 10.1.0.6:13209/appsvc/python:3.10_20240619.2.tuxprod
2024-08-14T23:51:45.179Z INFO  - Pull Image successful, Time taken: 0 Seconds
2024-08-14T23:51:45.223Z INFO  - Starting container for site
2024-08-14T23:51:45.223Z INFO  - docker run -d --expose=8000 --name project-app-development_0_f2e0544d -e WEBSITE_USE_DIAGNOSTIC_SERVER=false -e WEBSITE_SITE_NAME=project-app-development -e WEBSITE_AUTH_ENABLED=False -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=project-app-development.azurewebsites.net -e WEBSITE_INSTANCE_ID=3f627dbbecdaed255d87aa9c3e8f1448758df1cdff41f5e14b114384ea9b244a appsvc/python:3.10_20240619.2.tuxprod gunicorn -b :$PORT project.wsgi
2024-08-14T23:51:45.223Z INFO  - Logging is not enabled for this container.
Please use https://aka.ms/linux-diagnostics to enable logging to see container logs here.
2024-08-14T23:51:45.893Z INFO  - Initiating warmup request to container project-app-development_0_f2e0544d for site project-app-development
2024-08-14T23:51:49.043Z ERROR - Container project-app-development_0_f2e0544d for site project-app-development has exited, failing site start
2024-08-14T23:51:49.057Z ERROR - Container project-app-development_0_f2e0544d didn't respond to HTTP pings on port: 8000, failing site start. See container logs for debugging.
2024-08-14T23:51:49.063Z INFO  - Stopping site project-app-development because it failed during startup.
/home/LogFiles/2024_08_14_ln1xsdlwk0000WT_default_docker.log  (https://project-app-development.scm.azurewebsites.net/api/vfs/LogFiles/2024_08_14_ln1xsdlwk0000WT_default_docker.log)
2024-08-14T00:05:39.611783454Z   File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
2024-08-14T00:05:39.611788754Z   File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
2024-08-14T00:05:39.611793955Z   File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
2024-08-14T00:05:39.611799355Z   File "<frozen importlib._bootstrap>", line 1004, in _find_and_load_unlocked
2024-08-14T00:05:39.611804655Z ModuleNotFoundError: No module named 'project'
2024-08-14T00:05:39.611810055Z [2024-08-14 00:05:39 +0000] [83] [INFO] Worker exiting (pid: 83)
2024-08-14T00:05:39.756375163Z [2024-08-14 00:05:39 +0000] [49] [ERROR] Worker (pid:83) exited with code 3
2024-08-14T00:05:39.758705055Z [2024-08-14 00:05:39 +0000] [49] [ERROR] Shutting down: Master
2024-08-14T00:05:39.758726256Z [2024-08-14 00:05:39 +0000] [49] [ERROR] Reason: Worker failed to boot.

Вот моя команда запуска в Azure AppService Configuration :

gunicorn -b :8000 project.wsgi

Я проверил ваш образец Azure DevOps YAML Pipeline. В нем есть некоторые проблемы, которые приведут к тому, что служба App не сможет работать.

Из исходного журнала следует ошибка: ModuleNotFoundError: No module named 'project'. Причина проблемы в том, что zip-пакет не содержит необходимых пакетов python.

Вы можете внести следующие изменения в Azure Pipeline YAML Sample:

1.Вам необходимо изменить команду для установки пакетов python:

From

pip install -r requirements.txt

To

 pip install --target="./.python_packages/lib/site-packages" -r ./requirements.txt

В этом случае необходимые пакеты будут установлены в нужную папку и добавлены в zip-пакет.

2.Вам необходимо установить поле includeRootFolder в false в ArchiveFiles@2 задаче.

Если значение равно true, то в zip-пакет будет включена родительская папка : s в zip-пакет. Это вызовет проблему с путями в Web App. Поэтому необходимо установить значение false.

Вот пример:

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

Полный образец YAML трубопровода:

trigger:
- $(feature-branch)

variables:
  azureServiceConnectionId: '-db5f-4993-91f8-85f3a75cb357'
  webAppName: 'project-app-development'
  vmImageName: 'ubuntu-latest'
  environmentName: 'project-app-development'
  projectRoot: $(System.DefaultWorkingDirectory)
  pythonVersion: '3.8'
  system.debug: true

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 virtualenv env
        source env/bin/activate
        python -m pip install --upgrade pip
        pip install --target="./.python_packages/lib/site-packages" -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 : project-app-development'
            inputs:
              azureSubscription: $(azureServiceConnectionId)
              appName: $(webAppName)
              package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip

Для получения более подробной информации вы можете обратиться к этому документу: Использование конвейеров Azure для создания и развертывания веб-приложения Python в Azure App Service

Вернуться на верх