如何持续交付部署在 Azure 中的 Python 函数应用?

Ant*_*ère 5 python deployment azure kudu azure-functions

我第一次使用部署管道将 Python 函数应用部署到 Azure:

https://docs.microsoft.com/bs-latn-ba/azure/azure-functions/functions-how-to-azure-devops

该包使用 Kudu Zip 部署部署到 Azure。

我的 http 触发函数在本地运行得很好(在 Windows 上),但我在 Azure 上有 500 个内部错误,因为它没有找到模块requests

异常:ModuleNotFoundError:没有名为“请求”的模块

__init__.py 的导入:

import logging, requests, os
import azure.functions as func
Run Code Online (Sandbox Code Playgroud)

如果我删除“请求”依赖项,则该函数可在 Azure 上运行(状态 200)。

requests 库由requirement.txt导入,并由构建管道复制到.venv36/lib/site-packages/requests。

所以我想知道包中内置的虚拟环境.venv36是否被Azure中部署的函数使用。没有关于如何在 Azure 中激活虚拟环境的指示。

Wil*_*fin 7

我们在使用最新版本的 YAML 管道模板时也遇到了同样的问题:

- task: UsePythonVersion@0
  displayName: 'Use Python 3.6'
  inputs:
    versionSpec: 3.6 # Functions V2 supports Python 3.6 as of today

- bash: |
    python -m venv worker_venv
    source worker_venv/bin/activate
    pip install -r requirements.txt
  workingDirectory: $(workingDirectory)
  displayName: 'Install application dependencies'
Run Code Online (Sandbox Code Playgroud)

删除虚拟环境步骤,Function App 部署和运行没有任何问题。这似乎不是 Python 最佳实践;但是,这是我们在 Azure DevOps Pipelines 上正确部署它的唯一方法。

另外,在进行此更改之前,我们能够使用 Visual Studio 代码插件进行部署,这向我们表明这是一个环境问题。

来自 Microsoft 的更新文档 (1/12/2020)

https://docs.microsoft.com/en-us/azure/azure-functions/functions-how-to-azure-devops?tabs=python

azure-pipelines.yml(我们在 Azure DevOps Pipelines 上的工作版本)

- master

variables:
  # Azure Resource Manager connection created during pipeline creation
  azureSubscription: '<subscription-id>'

  # Function app name
  functionAppName: '<built-function-app-name>'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

  # Working Directory
  workingDirectory: '$(System.DefaultWorkingDirectory)/__app__'

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.7'
      inputs:
        versionSpec: 3.7 # Functions V2 supports Python 3.6 as of today

    - bash: |
        pip install --upgrade pip
        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: 'production'
    pool:
      vmImage: $(vmImageName)

    strategy:
      runOnce:
        deploy:

          steps:
          - task: AzureFunctionApp@1
            displayName: 'Azure functions app deploy'
            inputs:
              azureSubscription: '$(azureSubscription)'
              appType: functionAppLinux
              appName: $(functionAppName)
              package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip'
Run Code Online (Sandbox Code Playgroud)


Ank*_*mar 6

如果你命名你的虚拟环境 worker_venv命名为您链接的文档中的,它应该可以工作(假设您的管道使用 Linux 环境)。

但是,Python Azure Functions 文档很快就会更新,推荐的方法是不要从部署管道中部署整个虚拟环境。相反,您希望将软件包安装在.python_packages/lib/site-packages.

你可以这样做——

pip3.6 install --target .python_packages/lib/site-packages -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

代替 -

python3.6 -m venv worker_venv
source worker_venv/bin/activate
pip3.6 install setuptools
pip3.6 install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

它应该可以正常工作。

  • 抱歉,我不小心留下了以上不完整的内容。这就是我所说的——是的,这应该可以正常工作(至少对于 Python 3.6 Azure Functions 来说)。如上所述,您当然可以部署整个虚拟环境,但 Azure Functions 只需要包,并且虚拟环境可能附带的其他二进制文件是不必要的。对于 Python 3.7 Azure Functions(最近发布),您可能必须将 `worker_venv/lib/python3.7/*` 移至 `.python_packages/lib/*`,因为该结构中不再包含 python 版本。 (2认同)

eri*_*ine 5

确实需要更明确地指出,部署 Azure Functions 时 Python 包的正确目录是.python_packages/lib/site-packages. 我必须深入研究 Azure Function Core Tools 源代码,看看它们把 Python 包放在哪里

在此输入图像描述

还必须在 Function 调试控制台中进行挖掘,以查看 Oryx 从哪里获取包。

在此输入图像描述

我猜这里的 3.7 版 YAML 文件中有一个指针,但没有标注该目录的重要性以及它是否适用于 Python 3.8 函数?

在此输入图像描述

如果我没记错的话,这是使用 DevOps 部署 Python Functions 的要求(除非您想安装 Function Core Tools 作为构建管道的一部分!)。