使用 Azure Pipelines 来自动部署到 Azure Functions。 利用 Azure Pipelines,可以使用 Azure DevOps 通过持续集成 (CI) 和持续交付 (CD) 来进行生成、测试和部署。
YAML 管道是使用存储库中的 YAML 文件定义的。 步骤是管道的最小组成要素,并且可以是脚本或任务(预打包的脚本)。 了解构成管道的关键概念和组件。
你将使用 AzureFunctionApp
任务部署到 Azure Functions。 现在有两个版本的 AzureFunctionApp 任务(AzureFunctionApp@1、AzureFunctionApp@2)。
AzureFunctionApp@2
包括增强的验证支持,可降低管道因错误而失败的可能性。
请在本文顶部选择要使用的任务版本。 YAML 管道不适用于 Azure DevOps 2019 及更早版本。
注意
强烈建议使用 AzureFunctionApp@2。 仅版本 2 支持部署到使用弹性消耗计划的应用。
先决条件
Azure DevOps 组织。 如果你没有此类帐户,可免费创建一个。 如果你的团队已创建帐户,请确保你是要使用的 Azure DevOps 项目的管理员。
能够在 Microsoft 托管的代理上运行管道。 可以购买并行作业,也可以请求免费层。
如果你打算使用 GitHub 而不是 Azure Repos,则还需要一个 GitHub 存储库。 如果没有 GitHub 帐户,可以免费创建一个。
Azure 中的现有函数应用,其源代码位于受支持的存储库中。 如果你还没有 Azure Functions 代码项目,可以通过完成以下特定编程语言文章中的操作来创建一个:
将本地代码项目发布到函数应用后,请记得将其上传到 GitHub 或 Azure Repos 存储库。
生成应用
- 登录到 Azure DevOps 组织,并导航到你的项目。
- 在项目中,导航到“Pipelines”页面 。 然后选择“新建管道”。
- 对于“代码位于何处?”,请选择以下选项之一:
- GitHub:你可能会重定向到 GitHub 进行登录。 如果是这样,请输入 GitHub 凭据。 如果此连接是你的第一个 GitHub 连接,则向导还会引导你完成将 DevOps 连接到 GitHub 帐户的过程。
- Azure Repos Git:你可以立即在当前 DevOps 项目中选择存储库。
- 存储库列表显示时,请选择示例应用存储库。
- Azure Pipelines 会分析存储库,并在“配置管道”中提供可能模板的列表。 选择适合你的语言的函数应用模板。 如果未看到正确的模板,请选择“显示更多”。
- 选择“保存并运行”,再选择“直接提交到主分支”,然后再次选择“保存并运行” 。
- 开始新运行。 请等待运行完成。
YAML 生成管道示例
以下特定于语言的管道可用于生成应用。
可以使用以下示例创建用于生成 .NET 应用的 YAML 文件。
如果在生成应用时看到错误,请验证所使用的 .NET 版本是否与 Azure Functions 版本匹配。 有关详细信息,请参阅 Azure Functions 运行时版本概述。
pool:
vmImage: 'windows-latest'
steps:
- script: |
dotnet restore
dotnet build --configuration Release
- task: DotNetCoreCLI@2
inputs:
command: publish
arguments: '--configuration Release --output publish_output'
projects: '*.csproj'
publishWebProjects: false
modifyOutputPath: false
zipAfterPublish: false
- task: ArchiveFiles@2
displayName: "Archive files"
inputs:
rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output"
includeRootFolder: false
archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
artifactName: 'drop'
部署你的应用
你将部署 Azure 函数应用部署任务。 此任务需要 Azure 服务连接作为输入。 Azure 服务连接存储要从 Azure Pipelines 连接到 Azure 的凭据。
若要部署到 Azure Functions,请在 azure-pipelines.yml
文件的末尾添加以下代码片段。 默认 appType
为 Windows。 可以通过将 appType
设置为 functionAppLinux
来指定 Linux。 AzureFunctionApp 任务的 @v1 不支持部署到 Flex Consumption 应用。
trigger:
- main
variables:
# Azure service connection established during pipeline creation
azureSubscription: <Name of your Azure subscription>
appName: <Name of the function app>
# Agent VM image name
vmImageName: 'ubuntu-latest'
- task: DownloadBuildArtifacts@1 # Add this at the end of your file
inputs:
buildType: 'current'
downloadType: 'single'
artifactName: 'drop'
itemPattern: '**/*.zip'
downloadPath: '$(System.ArtifactsDirectory)'
- task: AzureFunctionApp@1
inputs:
azureSubscription: <Azure service connection>
appType: functionAppLinux # default is functionApp
appName: $(appName)
package: $(System.ArtifactsDirectory)/**/*.zip
#Uncomment the next lines to deploy to a deployment slot
#Note that deployment slots is not supported for Linux Dynamic SKU
#deployToSlotOrASE: true
#resourceGroupName: '<Resource Group Name>'
#slotName: '<Slot name>'
该代码段假定 YAML 文件中的生成步骤在代理上的 $(System.ArtifactsDirectory)
文件夹中生成 zip 存档。
部署容器
每次成功生成后,都可以自动将代码部署为容器化函数应用。 若要了解有关容器的详细信息,请参阅使用容器和 Azure Functions。
部署到容器的最简单的方法是使用容器部署上的 Azure 函数应用任务。
若要部署,在 YAML 文件的末尾添加以下代码片段:
trigger:
- main
variables:
# Container registry service connection established during pipeline creation
dockerRegistryServiceConnection: <Docker registry service connection>
imageRepository: <Name of your image repository>
containerRegistry: <Name of the Azure container registry>
dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile'
tag: '$(Build.BuildId)'
# Agent VM image name
vmImageName: 'ubuntu-latest'
- task: AzureFunctionAppContainer@1 # Add this at the end of your file
inputs:
azureSubscription: '<Azure service connection>'
appName: '<Name of the function app>'
imageName: $(containerRegistry)/$(imageRepository):$(tag)
该代码片段将 Docker 映像推送到 Azure 容器注册表。 容器部署上的 Azure 函数应用任务从指定的存储库中拉取与 BuildId
对应的相应 Docker 映像,然后部署该映像。
有关完整的端到端管道示例(包括生成容器和发布到容器注册表),请参阅此 Azure Pipelines 容器部署示例。
部署到槽
可以将函数应用配置为具有多个槽。 通过槽,你可以安全地部署应用并对其进行测试,然后再将其提供给客户。
以下 YAML 代码片段演示如何部署到过渡槽,然后交换到生产槽:
- task: AzureFunctionApp@1
inputs:
azureSubscription: <Azure service connection>
appType: functionAppLinux
appName: <Name of the Function app>
package: $(System.ArtifactsDirectory)/**/*.zip
deployToSlotOrASE: true
resourceGroupName: <Name of the resource group>
slotName: staging
- task: AzureAppServiceManage@0
inputs:
azureSubscription: <Azure service connection>
WebAppName: <name of the Function app>
ResourceGroupName: <name of resource group>
SourceSlot: staging
SwapWithProduction: true
通过 Azure CLI 创建管道
若要在 Azure 中创建生成管道,请使用 az functionapp devops-pipeline create
命令。 创建生成管道是为了生成和发布在存储库中所做的任何代码更改。 此命令生成一个新的 YAML 文件(用于定义生成和发布管道),然后将该文件提交到存储库。 此命令的先决条件取决于代码的位置。
如果代码位于 GitHub 中:
你必须对订阅具有写入权限。
你必须是 Azure DevOps 中的项目管理员。
你必须有权创建具有足够权限的 GitHub 个人访问令牌 (PAT)。 有关详细信息,请参阅 GitHub PAT 权限要求。
你必须有权将内容提交到 GitHub 存储库的主分支,这样才能提交自动生成的 YAML 文件。
如果代码位于 Azure Repos 中:
你必须对订阅具有写入权限。
你必须是 Azure DevOps 中的项目管理员。
生成应用
- 登录到 Azure DevOps 组织,并导航到你的项目。
- 在项目中,导航到“Pipelines”页面 。 然后选择“操作”以创建新的管道。
- 首先选择“GitHub”作为源代码位置,完成向导的各个步骤 。
- 可能会重定向到 GitHub 进行登录。 如果是这样,请输入 GitHub 凭据。
- 存储库列表显示时,请选择示例应用存储库。
- Azure Pipelines 将分析存储库,并推荐一个模板。 选择“保存并运行”,再选择“直接提交到主分支”,然后再次选择“保存并运行” 。
- 开始新运行。 请等待运行完成。
YAML 生成管道示例
以下特定于语言的管道可用于生成应用。
可以使用以下示例创建用于生成 .NET 应用的 YAML 文件:
pool:
vmImage: 'windows-latest'
steps:
- script: |
dotnet restore
dotnet build --configuration Release
- task: DotNetCoreCLI@2
inputs:
command: publish
arguments: '--configuration Release --output publish_output'
projects: '*.csproj'
publishWebProjects: false
modifyOutputPath: false
zipAfterPublish: false
- task: ArchiveFiles@2
displayName: "Archive files"
inputs:
rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output"
includeRootFolder: false
archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
artifactName: 'drop'
部署你的应用
你将使用 Azure 函数应用部署 v2 任务进行部署。 此任务需要 Azure 服务连接作为输入。 Azure 服务连接存储要从 Azure Pipelines 连接到 Azure 的凭据。 应创建一个使用工作负载标识联合的连接。
该任务的 v2 版本包括对 .NET、Python 和 Node 的较新应用程序堆栈的支持。 该任务包括网络预部署检查。 发生预部署问题时,部署会停止。
若要部署到 Azure Functions,请在 azure-pipelines.yml
文件的末尾添加以下代码片段。 默认 appType
为 Windows。 可以通过将 appType
设置为 functionAppLinux
来指定 Linux。 要部署到 Flex Consumption 应用,需要同时设置 appType: functionAppLinux
和 isFlexConsumption: true
。
trigger:
- main
variables:
# Azure service connection established during pipeline creation
azureSubscription: <SUBSCRIPTION_NAME>
appName: <APP_NAME>
# Agent VM image name
vmImageName: 'windows-latest'
- task: AzureFunctionApp@2 # Add this at the end of your file
inputs:
azureSubscription: <AZURE_SERVICE_CONNECTION>
appType: functionApp # this specifies a Windows-based function app
appName: $(appName)
package: $(System.ArtifactsDirectory)/**/*.zip
deploymentMethod: 'auto' # 'auto' | 'zipDeploy' | 'runFromPackage'. Required. Deployment method. Default: auto.
#Uncomment the next lines to deploy to a deployment slot
#Note that deployment slots is not supported for Linux Dynamic SKU
#deployToSlotOrASE: true
#resourceGroupName: '<RESOURCE_GROUP>'
#slotName: '<SLOT_NAME>'
后续步骤
- 查看 Azure Functions 概述。
- 查看 Azure DevOps 概述。