部署Net Core 3.1 webapp项目和Azure Function App项目的管道

部署Net Core 3.1 webapp项目和Azure Function App项目的管道,azure,azure-devops,yaml,azure-functions,azure-pipelines,Azure,Azure Devops,Yaml,Azure Functions,Azure Pipelines,在我当前的解决方案中,我有两个项目:一个netcore3.1mvc项目和一个Azure函数应用程序项目。两者都托管在Azure中,但位于不同的资源中(AppService中的Webapp,Function App项目有自己的Function App资源) -SolutionName |_ WebApp Project |_ WebApp.AzureFunction project 在我当前的Azure DevOps管道中,我仅为webapp定义了一个构建和部署。我如何添加一个步骤,只使用A

在我当前的解决方案中,我有两个项目:一个
netcore3.1mvc
项目和一个
Azure函数应用程序
项目。两者都托管在Azure中,但位于不同的资源中(AppService中的Webapp,Function App项目有自己的Function App资源)

-SolutionName
 |_ WebApp Project
 |_ WebApp.AzureFunction project
在我当前的Azure DevOps管道中,我仅为webapp定义了一个构建和部署。我如何添加一个步骤,只使用Azure Function App并将其部署到其各自的资源中

编辑:根据下面的答案,我编辑了yaml。管道成功,但azure函数的zip为空

我当前的yaml文件如下所示:

# vm-image, variables, building of webapp removed for brevity.           
steps:
- task: DotNetCoreCLI@2
  displayName: 'Build Project Azure Function: WebApplicationTest.AzFunction'
  inputs:
    projects: 'WebApplicationTest.AzFunction.PipelineTest/*.csproj'
    arguments: '--output $(System.DefaultWorkingDirectory)/publish_output --configuration Release'
    zipAfterPublish: false

- task: ArchiveFiles@2
  displayName: 'Archive Azure Function'
  inputs:
    rootFolderDirectory: '$(System.DefaultWorkingDirectory)/publish_output/'
    includeRootFolder: false
    ArchiveFile: '$(Build.ArtifactStagingDirectory)/functions/azfunction.zip'
    replaceExistingArchive: true

- task: PublishBuildArtifacts@1
  displayName: 'Publish Azure Function: WebApplicationTest.AzFunction.PipelineTest'
  inputs:
    pathtoPublish: '$(Build.ArtifactStagingDirectory)/functions'
    ArtifactName: 'functions'

#Deploy different artifact to different resources

# Deploy webapp step removed for brevity.

- task: AzureFunctionApp@1
  displayName: Deploy to Azure Function
  inputs:
    azureSubscription: $(azureSubscription)
    appType: functionApp
    appName: 'WebApplicationTest-AzFunction-PipelineTest'
    package: '$(Pipeline.Workspace)/**/azfunction.zip'
我认为它需要另一个步骤,然后从
$(Build.ArtifactStagingDirectory)
包中获取Azure Function App项目,并将其部署到我的Function App资源中。最好的方法是什么

我如何添加一个只需Azure Function应用程序并将其部署到其各自资源的步骤

我们可以为这两个项目构建和生成不同的工件

我们可以指定要构建的项目的完整路径,并生成具有不同名称的工件,以便部署到透视资源

例如,我在代码中添加了注释以帮助理解我的理想:

- task: DotNetCoreCLI@2
  inputs:
    command: 'restore'

#build the Web App, MVC project, and generate the artifact MVC.zip under the path $(Build.ArtifactStagingDirectory)/MVC
- task: DotNetCoreCLI@2
  displayName: 'dotnet publish for MVC'
  inputs:
    command: 'publish'
    publishWebProjects: false
    projects: 'MVC/MVC/*.csproj'
    arguments: '--configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)/MVC'

- task: PublishBuildArtifacts@1
  inputs:
    pathtoPublish: '$(Build.ArtifactStagingDirectory)/MVC' 
    artifactName: 'MVC'

#build the Azure function App, AzureFunctionApp project, and generate the artifact function.zip under the path $(Build.ArtifactStagingDirectory)/function

- task: DotNetCoreCLI@2
  displayName: 'Build project for azure function'
  inputs:
    projects: MVC/AzureFunctionApp/AzureFunctionApp.csproj
    arguments: '--output publish_output --configuration Release'

- task: ArchiveFiles@2
  displayName: 'Archive files'
  inputs:
    rootFolderOrFile: 'publish_output/'
    includeRootFolder: false 
    archiveFile: '$(Build.ArtifactStagingDirectory)/function/function.zip'

- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact: Function'
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)/function'
    ArtifactName: Function

#Deploy different artifact to different resources

- task: AzureRmWebAppDeployment@4
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: 'Subscription Name'
    appType: 'webApp'
    WebAppName: 'WebApp Name'
    package: '$(Build.ArtifactStagingDirectory)/**/MVC.zip'
    enableCustomDeployment: true
    DeploymentType: 'webDeploy'

- task: AzureFunctionApp@1
  displayName: Azure Function App Deploy
  inputs:
    azureSubscription: $(azureSubscription)
    appType: functionApp
    appName: $(appName)
    package: $(System.ArtifactsDirectory)/**/function.zip
测试结果:


为什么不使用两个管道?将所有内容都放在一个管道中不是更容易吗?如果我的项目有更多功能应用程序,那么每次添加一个应用程序时,我都需要一个额外的管道。从维护角度看,这似乎不是一个好的解决方案。Thnx,我现在正在尝试这一点。
参数:'--output publish中的
输出是什么_输出
参考?@CMorgan,即指定生成的输出结果,它可以是其他路径,只是为了方便我们了解
ArchiveFiles
任务中的文件源路径。好的,但是,我的zip文件是空的。似乎恢复并编译为.dll很好(1个dll文件),但我不知道它在做什么。我只看到我发布的zip是空的,存档步骤说它扫描了0个文件,没有添加新数据,从磁盘读取了0个文件。发布函数步骤发布到D:\a\1\s\Publish\u output\bin\AzFunction.dll。存档步骤中的rootFolderDirectory是“$(System.DefaultWorkingDirectory)/publish_output/”。我更新了主帖子。@CMorgan,我将路径更改为
$(System.DefaultWorkingDirectory)/发布\u输出/
,但无法再现您的问题,请共享任务DotNetCoreCLI build for azure function和ArchiveFiles任务的调试日志。我会在我这边检查。顺便说一句,您可以通过OneDrive共享它,并提供完整的调试日志。它现在可以正常工作。工件已正确准备和下载,并部署到正确的资源在Azure中。非常感谢您的时间和耐心。我仍然不清楚所有预定义变量之间的差异,但现在它似乎也适用于
'$(System.DefaultWorkingDirectory)/publish\u output'