从DevOps部署时忽略Azure Python Functions requirements.txt

0aydgbwb  于 2023-10-22  发布在  Python
关注(0)|答案(1)|浏览(160)

我正在尝试使用Azure DevOps YAML管道将一些Python函数部署到基于消费计划的Function App中。
尽管遵循这里找到的所有建议:https://learn.microsoft.com/en-us/azure/azure-functions/recover-python-functions?tabs=manual%2Cbash&pivots=python-mode-configuration#enable-remote-build
我仍然无法:(a)查看为什么项目根目录中的requirements.txt被忽略了;(b)找出为什么当我从APPLICATION_SETTINGS -> WEBSITE_RUN_FROM_PACKAGE变量提供的URL下载我的包时,实际上根本没有.python_packages目录。
尽管将SCM_DO_BUILD_DURING_DEPLOYMENT和ENABLE_ORYX_BUILD设置为True,但仍会出现这种情况。
经过几个小时的摸索,我最终发现了一个潜在的解决方案,那就是在DevOps管道中安装依赖项:

steps:
  - task: UsePythonVersion@0
    displayName: "Use Python 3.10"
    inputs:
      versionSpec: 3.10
    - bash: |
        pip install --target="./.python_packages/lib/site-packages" -r ./requirements.txt
      workingDirectory: $(workingDirectory)
      displayName: "Install application dependencies"

在此之前,创建和发布归档,然后AzureFunctionApp@2操作使用归档以部署它。
这是实现这一目标的正确方法吗?Python Functions文档似乎建议在构建过程中处理requirements.txt,但实际上并非如此。
我被困在试图理解这一步实际上是做什么。我说它正在将依赖项安装到DevOps代理上的Python示例中,只是为了代理自己的.python_packages文件夹,安装后,复制到然后部署的工件中,对吗?是这样吗?
从根本上说,我的问题是:有没有更好的办法?
谢谢你,谢谢

u5rb5r59

u5rb5r591#

这是实现这一目标的正确方法吗?Python Functions文档似乎建议在构建过程中处理requirements.txt,但实际上并非如此。
是的,requirements.txt包需要安装在DevOps代理中,然后将包含包的构建工件部署到Function应用程序中,以便Function触发器工作。即使是部署Python函数的默认Azure DevOps yaml代码也有单独的pip安装步骤来安装包。参考如下:-
我已经使用了下面的模板,并选择了我的函数应用程序和路径设置为-$(System.DefaultWorkingDirectory)

我的Azure DevOps yaml脚本:-

trigger:
- master

variables:
  
  azureSubscription: 'xxxxxxxxxx354dd'

  # Function app name
  functionAppName: 'siliconfunc76'

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

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

    - 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: '$(azureSubscription)'
              appType: functionAppLinux
              appName: $(functionAppName)
              package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip'

输出:-

所有包依赖项都在构建步骤中安装,其中Function在Azure DevOps代理上构建,如下所示:

这些软件包被存档为工件,如下所示:

然后,存档文件夹被发布为类似于下面的文件夹:

在下一阶段,这些发布的工件被下载并部署在函数应用程序中,如下所示:

以上方法是目前部署Function应用程序的理想且有效的方法

  • 您只能使用Build步骤构建Function应用程序,并使用Release pipeline通过Release部署Function应用程序。
  • 或者,您可以从这个SO线程answer 2中引用My YAML脚本,其中我使用了**func azure functionapp publish functionappname --python并在同一构建步骤中安装了依赖项pip install**。
  • 要使用Azure DevOps部署FunctionV 2,请参考我的SO线程答案3。

相关问题