你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
使用 Azure Pipelines 自动将代码项目部署到 Azure 中的函数应用。 利用 Azure Pipelines,可以使用 Azure DevOps 通过持续集成 (CI) 和持续交付 (CD) 来进行生成、测试和部署。
YAML 管道是使用存储库中的 YAML 文件定义的。 步骤是管道的最小组成要素,并且可以是脚本或任务(预打包的脚本)。 了解构成管道的关键概念和组件。
您使用 AzureFunctionApp 任务来部署代码。 现在有两个版本的AzureFunctionApp,它们在此表中进行比较:
| 比较/版本 | AzureFunctionApp@2 | AzureFunctionApp@1 |
|---|---|---|
| 支持 弹性消耗计划 | ✔ | ❌ |
| 包括增强的验证支持* | ✔ | ❌ |
| 何时使用... | 建议用于新应用部署 | 维护旧版部署 |
* 增强的验证支持使得管道由于错误而不太可能失败。
请在本文顶部选择要使用的任务版本。
注意
从 AzureFunctionApp@1 升级到 AzureFunctionApp@2 访问新功能和长期支持。
Prerequisites
Azure DevOps 组织。 如果没有帐户,可以免费创建一个帐户。 如果你的团队已创建帐户,请确保你是要使用的 Azure DevOps 项目的管理员。
能够在 Microsoft 托管的代理上运行管道。 可以购买并行作业,也可以请求免费层。
如果你打算使用 GitHub 而不是 Azure Repos,则还需要一个 GitHub 存储库。 如果没有 GitHub 帐户,可以免费创建一个。
Azure 中的现有函数应用,其源代码位于受支持的存储库中。 如果你还没有 Azure Functions 代码项目,可以通过完成以下特定编程语言文章中的操作来创建一个:
将本地代码项目发布到函数应用后,请记得将其上传到 GitHub 或 Azure Repos 存储库。
生成应用
- 登录到 Azure DevOps 组织,并导航到你的项目。
- 在项目中,导航到“Pipelines”页面。 然后选择“操作”以创建新的管道。
- 首先选择“GitHub”作为源代码位置,完成向导的各个步骤。
- 可能会重定向到 GitHub 进行登录。 如果是这样,请输入 GitHub 凭据。
- 存储库列表显示时,请选择示例应用存储库。
- Azure Pipelines 将分析存储库,并推荐一个模板。 选择“保存并运行”,再选择“直接提交到主分支”,然后再次选择“保存并运行”。
- 开始新运行。 请等待运行完成。
YAML 生成管道示例
以下特定于语言的管道可用于生成应用。
可以使用以下示例创建用于生成 .NET 应用的 YAML 文件:
pool:
vmImage: 'windows-latest'
steps:
- task: UseDotNet@2
displayName: 'Install .NET 8.0 SDK'
inputs:
packageType: 'sdk'
version: '8.0.x'
installationPath: $(Agent.ToolsDirectory)/dotnet
- script: |
dotnet restore
dotnet build --configuration Release
- task: DotNetCoreCLI@2
displayName: 'dotnet publish'
inputs:
command: publish
arguments: '--configuration Release --output $(System.DefaultWorkingDirectory)/publish_output'
projects: 'csharp/*.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 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:
- task: UseDotNet@2
displayName: 'Install .NET 8.0 SDK'
inputs:
packageType: 'sdk'
version: '8.0.x'
installationPath: $(Agent.ToolsDirectory)/dotnet
- script: |
dotnet restore
dotnet build --configuration Release
- task: DotNetCoreCLI@2
displayName: 'dotnet publish'
inputs:
command: publish
arguments: '--configuration Release --output $(System.DefaultWorkingDirectory)/publish_output'
projects: 'csharp/*.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 的凭据。 应创建一个使用工作负载标识联合的连接。
若要部署到 Azure Functions,请在文件末尾 azure-pipelines.yml 添加此代码片段,具体取决于应用是在 Linux 还是 Windows 上运行:
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: 'windows-latest'
- task: AzureFunctionApp@2 # Add this at the end of your file
inputs:
azureSubscription: <Name of your Azure subscription>
appType: functionApp # this specifies a Windows-based function app
appName: $(appName)
package: $(System.DefaultWorkingDirectory)/build$(Build.BuildId).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>'
默认值 appType 为 Windows (functionApp)。 可以通过将 appType 设置为 functionAppLinux 来指定 Linux。
Flex 消耗应用在 Linux 上运行,必须同时设置 appType: functionAppLinux 和 isFlexConsumption: true。
该代码段假定 YAML 文件中的生成步骤在代理上的 $(System.ArtifactsDirectory) 文件夹中生成 zip 存档。
使用 Azure 函数应用部署任务进行部署 。 此任务需要 Azure 服务连接作为输入。 Azure 服务连接存储要从 Azure Pipelines 连接到 Azure 的凭据。
重要
不支持使用 AzureFunctionApp 任务的 @v1 部署到 Flex 消耗应用。
若要部署到 Azure Functions,请在文件末尾 azure-pipelines.yml 添加此代码片段:
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: $(azureSubscription)
appType: functionAppLinux # default is functionApp
appName: $(appName)
package: $(System.ArtifactsDirectory)/**/*.zip
这段代码片段将 appType 设置为 functionAppLinux,这是在部署到运行于 Linux 的应用程序时所需要的。 默认值 appType 为 Windows (functionApp)。
该示例假定 YAML 文件中的生成步骤在代理的文件夹中生成 zip 存档 $(System.ArtifactsDirectory) 。
部署容器
小窍门
建议在 Azure 容器应用中使用 Azure Functions 支持,以便在自定义 Linux 容器中托管函数应用。 有关详细信息,请参阅 Azure 容器应用上的 Azure Functions 概述。
部署容器化函数应用时,使用的部署任务取决于特定的托管环境。
可以使用 Azure 容器应用部署 任务(AzureContainerApps)将函数应用映像部署到针对 Azure Functions 优化的 Azure 容器应用实例。
此代码部署 .NET 8 隔离进程模型函数应用的基础映像:
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
steps:
- task: AzureContainerApps@1
inputs:
azureSubscription: <Name of your Azure subscription>
imageToDeploy: 'mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0'
containerAppName: <Name of your container app>
resourceGroup: <Name of the resource group>
理想情况下,你将在管道中生成自己的自定义容器,而不是使用基本映像,如以下示例所示。 有关详细信息,请参阅 从 Azure Pipelines 部署到 Azure 容器应用。
部署到槽
重要
Flex 消耗计划目前不支持槽位。 Linux 应用在消耗计划中运行时也不支持槽位,并且对这些应用的支持会在将来停用。
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: 'windows-latest'
- task: AzureFunctionApp@2 # Add this at the end of your file
inputs:
azureSubscription: <Name of your Azure subscription>
appType: functionApp # this specifies a Windows-based function app
appName: $(appName)
package: $(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip
deploymentMethod: 'auto' # 'auto' | 'zipDeploy' | 'runFromPackage'. Required. Deployment method. Default: auto.
deployToSlotOrASE: true
resourceGroupName: '<RESOURCE_GROUP>'
slotName: '<SLOT_NAME>'
可以将函数应用配置为具有多个槽。 通过槽,你可以安全地部署应用并对其进行测试,然后再将其提供给客户。
以下 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
使用部署槽位时,还可以添加以下任务,以在部署过程中执行槽位交换。
- task: AzureAppServiceManage@0
inputs:
azureSubscription: <AZURE_SERVICE_CONNECTION>
WebAppName: <APP_NAME>
ResourceGroupName: <RESOURCE_GROUP>
SourceSlot: <SLOT_NAME>
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 Functions 概述。
- 查看 Azure DevOps 概述。