使用YAML部署Azure Function至FunctionApp槽时Zip文件找不到问题
问题
使用C#开发Azure Function,通过流水线实现构建→测试→发布代码→用Bicep搭建各环境基础设施→将发布的Function代码部署到对应Function App的流程,但部署时出现Zip文件找不到的错误:
##[error]Error: No package found with specified pattern: /home/vsts/work/1/a/*.zip
日志显示发布的Zip文件在/home/vsts/work/1/s目录下,但部署任务在/1/a目录查找。以下是发布和部署阶段的YAML配置:
发布阶段YAML
- task: DotNetCoreCLI@2 displayName: "dotnet publish" inputs: command: publish arguments: '--configuration Release --output publish_output' projects: 'src/**/*.csproj' publishWebProjects: false modifyOutputPath: false zipAfterPublish: false - task: ArchiveFiles@2 displayName: "Archive files (into zip)" inputs: rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output" includeRootFolder: false archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip" - task: PublishBuildArtifacts@1 displayName: "Publish build artifacts" inputs: PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
部署阶段YAML
- task: AzureFunctionApp@1 # Add this at the end of your file displayName: 'Deploy Function code to FunctionApp Slot' inputs: azureSubscription: 'ServiceConnection' appType: functionAppLinux # default is functionApp appName: 'f2404dev-app' package: '$(System.ArtifactsDirectory)/**/*.zip'
解决方案
问题核心是发布构件的配置不完整,以及部署阶段未正确处理构件的下载路径:
发布构件时需明确指定构件名称
PublishBuildArtifacts@1任务默认会将构件发布到名为drop的集合中,若不指定artifactName,后续部署阶段查找时容易出现路径匹配问题。修改发布阶段的PublishBuildArtifacts@1任务,添加明确的构件名称:- task: PublishBuildArtifacts@1 displayName: "Publish build artifacts" inputs: PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip' artifactName: 'function-build' # 指定唯一构件名称,避免混淆部署阶段需先下载构件再引用
若发布阶段和部署阶段不在同一个作业(Job)中,必须先添加下载构件的任务,将发布的Zip包拉取到部署作业的本地目录。修改部署阶段的配置:- task: DownloadBuildArtifacts@0 displayName: 'Download build artifacts' inputs: buildType: 'current' downloadType: 'single' artifactName: 'function-build' # 和发布阶段指定的名称一致 downloadPath: '$(System.ArtifactsDirectory)' - task: AzureFunctionApp@1 displayName: 'Deploy Function code to FunctionApp Slot' inputs: azureSubscription: 'ServiceConnection' appType: functionAppLinux appName: 'f2404dev-app' package: '$(System.ArtifactsDirectory)/function-build/**/*.zip' # 精确指向下载后的Zip包路径可选:简化Zip包生成流程
可以直接利用DotNetCoreCLI@2的内置功能生成Zip包,省去ArchiveFiles@2的步骤,减少出错点:- task: DotNetCoreCLI@2 displayName: "dotnet publish and zip" inputs: command: publish arguments: '--configuration Release --output publish_output' projects: 'src/**/*.csproj' publishWebProjects: false modifyOutputPath: false zipAfterPublish: true # 自动生成Zip包 - task: PublishBuildArtifacts@1 displayName: "Publish build artifacts" inputs: PathtoPublish: '$(System.DefaultWorkingDirectory)/publish_output/*.zip' # 直接引用自动生成的Zip包 artifactName: 'function-build'
内容的提问来源于stack exchange,提问作者Anders Juul
相关产品推荐
相关产品推荐

