Я разрабатываю приложение PythonAzure Function и использую Custom Package для этого проекта. из-за специального пакета я собираю и устанавливаю все зависимости в своем CI/CD конвейере, прежде чем создавать zip файл и развертывать его в Azure на основе этой документации. Моя проблема в том, что когда приложение успешно развернулось, я получил сообщение об ошибке Custom Package не найден при запуске приложения. Полное сообщение об ошибке:
Результат: Исключение сбоя: ModuleNotFoundError: нет модуля с именем «{имя пользовательского пакета}». Не могу найти модуль. Пожалуйста, проверьте файл требований.txt на наличие отсутствующего модуля.
Я проверяю эту документацию и дважды проверяю свой артефакт. единственное, что я нашел на основе документации, формат имени пакета должен быть «<package-name>-<version>-dist-info», но в моем артефакте — «<package-name>-<version>.dist-info».
Кроме того, я пробую эти конфигурации в Azure Function, но это не имеет значения.
Конфигурации:
BUILD_FLAGS=ИспользоватьExpressBuild
PYTHON_ISOLATE_WORKER_DEPENDENCIES=0
SCM_DO_BUILD_DURING_DEPLOYMENT=истина
ENABLE_ORYX_BUILD=истина






ModuleNotFoundError: нет модуля с именем «{имя пользовательского пакета}». Не могу найти модуль.
Ошибка ModuleNotFoundError возникает, когда ваш пакет не указан в requirements.txt вашего приложения-функции. Если вы хотите установить пакет отдельно, вам придется отдельно добавить команду apt-get package-name или команду pip install package-name в раздел команд запуска задачи Azure Function DevOps.
Команда запуска в yaml: -
- task: AzureFunctionApp@1
displayName: 'Azure functions app deploy'
inputs:
azureSubscription: 'xxxxxx (xxxxxx)'
appType: 'functionAppLinux'
appName: 'siliconfuncv2'
package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip'
startUpCommand: 'apt-get update apt-get install libgstreamer1.0-0 libunwind-dev gstreamer1.0-pulseaudio'
Есть two ways you can install Custom packages in your Linux Function app.
См. мой SO ответ 1, где я добавил пользовательские пакеты в папку исходного кода, а затем добавил имя папки в качестве пути в requirements.txt во время развертывания веб-приложения пакеты внутри папки добавляются автоматически. Вы можете использовать ту же концепцию для развертывания пользовательского пакета в вашем приложении-функции.
См. SO ответ 2, где вы можете загрузить свои собственные пакеты в Github, а затем использовать этот git+https://[email protected]/sid24desai/pycode.git@main URL-адрес с вашим токеном PAT Github/githuborg/repository/ в файле require.txt, как показано ниже: -
Это мой requirements.txt:-
azure-functions
git+https://[email protected]/sid24desai/pycode.git@main
Мой конвейер Yaml Azure Devops: -
trigger:
- master
variables:
azureSubscription: 'xxxxxxxx97cb2a7'
functionAppName: 'siliconfunc65'
vmImageName: 'ubuntu-latest'
workingDirectory: '$(System.DefaultWorkingDirectory)'
stages:
- stage: Build
displayName: Build stage
jobs:
- job: Build
displayName: Build
pool:
vmImage: $(vmImageName)
steps:
- bash: |
if [ -f extensions.csproj ]
then
dotnet build extensions.csproj --runtime ubuntu.16.04-x64 --output ./bin
fi
workingDirectory: $(workingDirectory)
displayName: 'Build extensions'
- task: UsePythonVersion@0
displayName: 'Use Python 3.6'
inputs:
versionSpec: 3.10
- bash: |
pip install --target = "./.python_packages/lib/site-packages" -r ./requirements.txt
workingDirectory: $(workingDirectory)
displayName: 'Install application dependencies'
- task: ArchiveFiles@2
displayName: 'Archive files'
inputs:
rootFolderOrFile: '$(workingDirectory)'
includeRootFolder: false
archiveType: zip
archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
replaceExistingArchive: true
- publish: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
artifact: drop
- stage: Deploy
displayName: Deploy stage
dependsOn: Build
condition: succeeded()
jobs:
- deployment: Deploy
displayName: Deploy
environment: 'development'
pool:
vmImage: $(vmImageName)
strategy:
runOnce:
deploy:
steps:
- task: AzureFunctionApp@1
displayName: 'Azure functions app deploy'
inputs:
azureSubscription: 'xxxxx subscription (xxxxxxxb2a7)'
appType: 'functionAppLinux'
appName: '$(functionAppName)'
package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip'

Дополнительная ссылка: -
Развертывание функций Azure с использованием конвейера CI-CD, отличающееся от развертывания VsCode – 1 Ответ Мой ответ SO
ModuleNotFoundError обычно возникает, когда необходимый пакет Python неправильно установлен в каталог «.python_packages/lib/site-packages». Этот каталог следует заархивировать вместе с файлами приложения-функции Python, чтобы создать ZIP-архив, который будет развернут в приложении-функции Azure.
В вашем случае, поскольку пакет Python является вашим пользовательским пакетом, рекомендуется опубликовать его в канале артефактов вашего проекта Azure DevOps для использования:
Создайте частный канал артефактов в своем проекте Azure DevOps, если у вас его нет. И убедитесь, что вы добавили PyPI в качестве восходящего канала в канале.
Создайте и опубликуйте свой собственный пакет Python в ленте. Вы можете настроить конвейер для этого для вашего пакета.
В конвейере для развертывания приложения-функции Python перед задачей, которая запускает команду «pip install», добавьте задачу Python pip аутентификации, как показано ниже.
steps:
. . .
- task: PipAuthenticate@1
displayName: 'Pip Authenticate'
inputs:
artifactFeeds: {Your Artifacts feed name}
. . .
Убедитесь, что вы указали пользовательский пакет в файле requirements.txt вашего приложения-функции Python. И в коде вашего приложения-функции Python убедитесь, что вы правильно установили import пользовательский пакет.
При запуске следующей команды «pip install» в корневом каталоге вашего приложения-функции Python будет установлен ваш пользовательский пакет из канала «Артефакты», а общедоступные пакеты из восходящего потока PyPI в каталог «.python_packages/lib/site-packages».
pip install --target = "./.python_packages/lib/site-packages" -r ./requirements.txt
Затем вы можете использовать задачу Архивировать файлы, чтобы заархивировать каталог «.python_packages/lib/site-packages» вместе с файлами вашего приложения-функции Python в ZIP-архив.