如何连续交付部署在azure中的python函数应用程序?

zour9fqk  于 2021-06-21  发布在  Kudu
关注(0)|答案(5)|浏览(392)

我第一次使用部署管道将python函数应用程序部署到azure:
https://docs.microsoft.com/bs-latn-ba/azure/azure-functions/functions-how-to-azure-devops
包是使用kudu-zip-deploy部署到azure的。
我的http触发函数在本地(在windows上)运行得非常好,但是我在azure上有500个内部错误,因为它找不到模块请求。
异常:modulenotfounderror:没有名为“requests”的模块
导入\uu init \uuuuy.py:

import logging, requests, os
import azure.functions as func

如果我删除“requests”依赖项,该函数将在azure上工作(状态200)。
请求库由requirement.txt导入,并通过构建管道复制到.venv36/lib/site packages/requests。
所以我想知道包中构建的virtual environment.venv36是否被部署在azure中的函数所使用。没有关于如何在azure中激活虚拟环境的指示。

w51jfk4q

w51jfk4q1#

如果你命名你的虚拟环境 worker_venv 正如您链接的文档中所命名的,它应该可以工作(假设您的管道使用的是linux环境)。
但是,pythonazure函数文档将很快更新,建议不要从部署管道部署整个虚拟环境。相反,您希望在中安装软件包 .python_packages/lib/site-packages .
你能做到的--

pip3.6 install --target .python_packages/lib/site-packages -r requirements.txt

而不是--

python3.6 -m venv worker_venv
source worker_venv/bin/activate
pip3.6 install setuptools
pip3.6 install -r requirements.txt

它应该很好用。

cld4siwp

cld4siwp2#

希望我能正确理解你的问题。
在本地计算机上安装libs时,libs安装在python所在的位置(或者至少安装在实际代码所在的位置以外的位置)。这意味着,在打包代码时,实际上并没有将lib放在一起。
为了解决这个问题,可以使用虚拟环境。python提供了一个venv工具(还有一个标准的linux virtual env工具),您可以通过该工具运行:

python -m venv /path/to/my/dir
source /path/to/my/dir/bin/activate 
cd /path/to/my/dir/bin/activate
pip install -r requirements.txt
deactivate

我知道你提到过windows,所以我建议使用wsl和ubuntu映像(通常是一个很好的工具)。也许有一种方法可以让它在windows下工作,否则我不知道。
编辑:固定格式

nwo49xxi

nwo49xxi3#

你需要分别处理这两个进口,

import azure.functions as func
import requests
tct7dpnv

tct7dpnv4#

我们使用最新版本的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'

删除虚拟环境步骤后,功能应用程序部署并运行时不会出现任何问题。这似乎不是python的最佳实践;然而,这是我们唯一能做的事情,让这个正确部署在azuredevops管道。
另外,在进行此更改之前,我们能够使用visualstudio代码插件进行部署,这向我们表明这是一个环境问题。

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管道上的工作版本)

- 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'
jk9hmnmh

jk9hmnmh5#

虽然很旧,但是:

  • pip(python版本) install --target .python_packages/lib/site-packages -r requirements.txt 例如,如果你使用 3.7 然后是pip3.7 install --target .python_packages/lib/site-packages -r requirements.txt 很有魅力

相关问题