如何使用 Azure DevOps CI/CD 部署多个 Azure Functions

How can I use Azure DevOps CI/CD to deploy multiple Azure Functions

我正在 .NET 6 和 Visual Studio 2022 中做一个包含多个 Azure Functions 的项目,我想通过 Azure Pipelines 将我的函数部署到 Azure。我在 Azure DevOps 中获得了存储库,到目前为止,我已经能够成功设置一个 Pipeline YAML 文件,如下所示:

trigger:
- main

pool:
  vmImage: windows-2022

steps:

- task: UseDotNet@2
  displayName: 'Install .NET Core sdk 6.x'
  inputs:
    version: 6.x
    includePreviewVersions: true

- task: DotNetCoreCLI@2
  inputs:
    command: 'restore'
    projects: '**/*.csproj'
    feedsToUse: 'select'
    vstsFeed: *Hidden*

- task: DotNetCoreCLI@2
  inputs:
    command: 'build'
    projects: '**/*.csproj'
    arguments: '--output $(Build.BinariesDirectory)/publish_output --configuration Release'

- task: ArchiveFiles@2
  inputs:
    rootFolderOrFile: '$(Build.BinariesDirectory)/publish_output'
    includeRootFolder: false
    archiveType: 'zip'
    archiveFile: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip'
    replaceExistingArchive: true

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

- task: AzureKeyVault@2
  inputs:
    azureSubscription: *Hidden*
    KeyVaultName: *Hidden*'
    SecretsFilter: '*'
    RunAsPreJob: true

回购看起来像这样:

每个文件夹都包含一个 Azure Function,因此有一个 .csproj 文件(共享文件夹除外,它们只是 class 库),在我的 Azure Releases 中,我希望每个 Azure Function 都有一个,但我不知道如何实现,任何人对此有一些经验并可以分享你会怎么做?也许还有另一种方法可以实现这一点?

示例:

  1. VS 项目中的 Azure 函数名为 func-x-x
  2. 进行更改并提交到 repo
  3. 触发管道并发布到在 Azure 中创建的具有相同名称的 Azure 函数

一般来说,我认为您想在发布管道中执行此操作,而不是构建管道。您已经在使用 PublishBuildArtifacts@1 任务发布构建工件。您现在可以设置一个发布管道来使用这些已发布的工件并将其发布到您的环境中。您也可以将其设置为自动按照您描述的方式进行设置。

发布管道的 UI 不是基于 yaml,因此您可能会发现它更易于管理。

既然你提到了

Triggers pipeline and make a release to created Azure Function in Azure with same name

我认为您想将每个 azure 函数部署到不同的函数应用程序。

例如,如果您有一个包含 3 个函数应用程序的解决方案:

然后你可以使用下面的 YAML 来实现你想要的。

pool:
  name: Azure Pipelines
  demands:
  - msbuild
  - visualstudio

steps:
- task: NuGetToolInstaller@1
  displayName: 'Use NuGet 4.4.1'
  inputs:
    versionSpec: 4.4.1

- task: NuGetCommand@2
  displayName: 'NuGet restore'

- task: VSBuild@1
  displayName: 'Build solution **\*.sln'


- task: ArchiveFiles@2
  displayName: 'Archive $(System.DefaultWorkingDirectory)\FunctionDeployedByDevOps\bin\Debug\netcoreapp3.1\*'
  inputs:
    rootFolderOrFile: '$(System.DefaultWorkingDirectory)\FunctionDeployedByDevOps\bin\Debug\netcoreapp3.1\*'
    archiveFile: '$(System.DefaultWorkingDirectory)\FunctionDeployedByDevOps\bin\Debug\netcoreapp3.1$(Build.BuildId).zip'

- task: AzureFunctionApp@1
  displayName: 'Azure Function App Deploy: FunctionDeployedByDevOps'
  inputs:
    azureSubscription: 'testbowman_in_AAD'
    appType: functionApp
    appName: FunctionDeployedByDevOps
    package: '$(System.DefaultWorkingDirectory)\FunctionDeployedByDevOps\bin\Debug\netcoreapp3.1$(Build.BuildId).zip'

- task: ArchiveFiles@2
  displayName: 'Archive $(System.DefaultWorkingDirectory)\FDBD2\bin\Debug\netcoreapp3.1\*'
  inputs:
    rootFolderOrFile: '$(System.DefaultWorkingDirectory)\FDBD2\bin\Debug\netcoreapp3.1\*'
    archiveFile: '$(System.DefaultWorkingDirectory)\FDBD2\bin\Debug\netcoreapp3.1$(Build.BuildId).zip'

- task: AzureFunctionApp@1
  displayName: 'Azure Function App Deploy: FDBD2'
  inputs:
    azureSubscription: 'testbowman_in_AAD'
    appType: functionApp
    appName: FDBD2
    package: '$(System.DefaultWorkingDirectory)\FDBD2\bin\Debug\netcoreapp3.1$(Build.BuildId).zip'

- task: ArchiveFiles@2
  displayName: 'Archive $(System.DefaultWorkingDirectory)\FDBD3\bin\Debug\netcoreapp3.1\*'
  inputs:
    rootFolderOrFile: '$(System.DefaultWorkingDirectory)\FDBD3\bin\Debug\netcoreapp3.1\*'
    archiveFile: '$(System.DefaultWorkingDirectory)\FDBD3\bin\Debug\netcoreapp3.1$(Build.BuildId).zip'

- task: AzureFunctionApp@1
  displayName: 'Azure Function App Deploy: FDBD3'
  inputs:
    azureSubscription: 'testbowman_in_AAD'
    appType: functionApp
    appName: FDBD3
    package: '$(System.DefaultWorkingDirectory)\FDBD3\bin\Debug\netcoreapp3.1$(Build.BuildId).zip'

顺便说一句,如果没有特殊需要,可以在一个函数应用下包含多个函数,这样只需要部署一次。

如果您使用的是 Visual Studio,请右键单击您的项目,然后 select 添加 -> 新函数:

如果您有更多疑虑,请告诉我。