Объем: У меня есть приложение-функция Python, которое работает, как и ожидалось, локально и при развертывании через VS Code.
Проблема возникает при развертывании приложения-функции в группе ресурсов продукта (и приложении-функции).
Различия между двумя развертываниями:
trigger:
- none
variables:
# Azure Resource Manager connection created during pipeline creation
azureServiceConnectionId: '******'
# Web app name
webAppName: '*******'
# Agent VM image name
vmImageName: 'ubuntu-latest'
# Environment name
environmentName: 'PROD'
# Project root folder. Point to the folder containing manage.py file.
projectRoot: $(System.DefaultWorkingDirectory)
# Resource group
resourceGroupName : '********'
# Python version: 3.11
pythonVersion: '3.11'
stages:
- stage: Build
displayName: Build stage
jobs:
- job: BuildJob
pool: Default
steps:
- script: |
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: Default
environment: $(environmentName)
strategy:
runOnce:
deploy:
steps:
- task: AzureFunctionApp@2
displayName: 'Deploy Azure Web App'
inputs:
connectedServiceNameARM: '$(azureServiceConnectionId)'
appType: 'functionAppLinux'
appName: '$(webAppName)'
package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip'
runtimeStack: 'PYTHON|3.11'
appSettings: '-KeyvaultURL ***** -StorageaccountURL *****'
deploymentMethod: 'auto'
Кроме того, я попытался развернуть эту функцию с помощью:
- task: AzureCLI@2
displayName: 'Deploy with Azure CLI'
inputs:
azureSubscription: '$(azureServiceConnectionId)'
scriptType: 'pscore'
scriptLocation: 'inlineScript'
inlineScript: |
$artifactPath = "$(Pipeline.Workspace)/drop/$(Build.BuildId).zip"
az functionapp deployment source config-zip -g $(resourceGroupName) -n $(webAppName) --src $artifactPath --verbose
Результат был тот же.
Итак, первоначальная проблема, с которой я столкнулся, заключалась в том, что функции просто не отображались, развертывание почти всегда проходит успешно. Пройдя по кроличьей норе, мне удалось найти журналы, которые показывают, что «синхронизация триггеров HTTP не удалась», а также модули, которые не удалось импортировать (нет конкретных модулей — все).
Из журнала я вижу, что выбрана правильная папка:
/home/site/wwwroot/.python_packages/lib/site-packages/pandas/
И я могу убедиться, что эти пакеты действительно существуют:
По какой-то причине function_app.py не видит установленные модули, что вызывает цепную реакцию, которая приводит к тому, что функции не отображаются даже после успешного развертывания.
Что я пробовал до сих пор:
Были некоторые ресурсы по SO, но, похоже, ничего не решило эту проблему, это довольно странно, поскольку я чувствую, что многие разработчики должны выполнять этот тип развертывания практически каждый день, поэтому либо я делаю что-то действительно неправильно, либо есть основная причина проблема, которую я, кажется, не понимаю.
Кроме того, __pycache__
НЕ находится прямо под site-packages
с моей стороны, это .python_packages\lib\site-packages\azure\functions\__pycache__
. Пожалуйста, проверьте, правильно ли подготовлено содержимое артефакта.
Спасибо, что нашли время проверить это. Файлы действительно находятся в разделе файлов приложений. У меня есть автономный агент, работающий для этих развертываний, где по умолчанию используется версия 3.11, поэтому, к сожалению, использование версии Python не является решением в этом случае.
Если вы загрузите артефакт на компьютер с агентом и развернете его с помощью Azure cli, сможет ли приложение-функция найти модуль? Как я уже упоминал выше, структура артефакта выглядит странно.
Я тоже попробовал это (см. Редактирование кода).
предыдущий комментарий используется для сужения проблемы, но не для ее решения. Поскольку поведение при развертывании с помощью Azure CLI с артефактом такое же, проблема должна быть связана с содержимым артефакта. Вам необходимо правильно подготовить содержимое развертывания.
С артефактом все в порядке, я скачал и проверил его, развернута та же структура, что и в самом артефакте, единственное, что отличается от развертывания VS Code, это то, что в артефакте есть папка .vscode при создании через конвейер. .
Наличие папки .vscode не имеет значения. Если вы попытались развернуть Azure Cli с помощью zip-архива артефакта, но модуль по-прежнему не найден, это означает, что содержимое неверно. Нет необходимости сравнивать развертывание кода VS.
Однако он работает при развертывании через код VS.
Он использует другую файловую структуру, если вы развертываете его с помощью кода VS. Но если вы выполняете развертывание с помощью Azure Cli или задачи DevOps, они оба используют одно и то же содержимое артефакта. Рекомендуется следовать документу , чтобы создать образец Python, проверить код и сравнить развертывание с Devops.
Могу ли я узнать, исправлено ли содержимое артефакта? Пожалуйста, проверьте, есть ли у вас .gitignore
в репозитории, который обычно игнорирует __pycache__/
, когда вы отправляете код из локального хранилища.
После обширного сеанса отладки со службой поддержки Microsoft нам удалось найти решение.
Оказывается, в VS Code есть множество различных проверок при развертывании приложения-функции, тогда как эти шаги необходимо реализовать вручную в конвейере Azure DevOps.
В конечном итоге трюк заключался в первоначальной настройке:
ENABLE_ORYX_BUILD = true
SCM_DO_BUILD_DURING_DEPLOYMENT = true
WEBSITE_RUN_FROM_PACKAGE = 0
А также удалить часть требований к установке из конвейера DevOps и изменить метод развертывания на zipDeploy
вместо auto
.
Журналы приложения-функции можно найти в центре развертывания приложения-функции, где нам удалось увидеть, как приложение-функция выполняет сборку «внутри себя» и устанавливает необходимые требования.
После первого развертывания с вышеуказанными настройками функции наконец появились в приложении-функции, после чего мы могли отредактировать конвейер для выполнения сборки (вернули часть требований к установке) и установить:
ENABLE_ORYX_BUILD = false
SCM_DO_BUILD_DURING_DEPLOYMENT = false
После выполнения первоначальной сборки самого приложения развертывание со сборкой Azure DevOps теперь можно использовать в обычном режиме.
Пока неясно, нужно ли нам будет делать то же самое в следующий раз, когда мы добавим в проект дополнительный пакет, если да, то я обязательно предоставлю обновленную информацию в этом посте.
Я надеюсь, что это поможет кому-то в будущем, поскольку я считаю, что это довольно распространенный вариант использования.
Я добавляю
UsePythonVersion@0
, чтобы указать Python3.11
в начале первого задания (ссылка здесь), и скопировал ваш yaml, развертывание прошло успешно, и приложение-функция работает нормально. Могу ли я узнать, проверили ли вы на портале Azure -> приложение целевой функции -> Функции -> файлы приложения, содержит ли он правильные файлы (например: function_app.py)? Это необходимо для проверки правильности развертывания файлов.