你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

通过 Azure Pipelines 进行持续交付

使用 Azure Pipelines 来自动部署到 Azure Functions。 利用 Azure Pipelines,可以使用 Azure DevOps 通过持续集成 (CI) 和持续交付 (CD) 来进行生成、测试和部署。

YAML 管道是使用存储库中的 YAML 文件定义的。 步骤是管道最小的生成块,并且可以是脚本或任务(预打包的脚本)。 了解构成管道的关键概念和组件

YAML 管道不适用于 Azure DevOps 2019 及更早版本。

先决条件

  • GitHub 帐户,可在其中创建存储库。 如果你没有此类帐户,可免费创建一个

  • Azure DevOps 组织。 如果你没有此类帐户,可免费创建一个。 如果你的团队已创建帐户,请确保你是要使用的 Azure DevOps 项目的管理员。

  • 能够在 Microsoft 托管的代理上运行管道。 可以购买并行作业,也可以请求免费层。

创建函数应用

这是将 Azure Pipelines 与 Azure Functions 结合使用的分布指南。

如果 GitHub 中已有要部署的应用,则可以尝试为该代码创建管道。

若要改为使用示例代码,请为此 GitHub 存储库创建分支:

    https://github.com/microsoft/devops-project-samples/tree/master/dotnet/aspnetcore/functionApp

生成应用

  1. 登录到 Azure DevOps 组织,并导航到你的项目。
  2. 在项目中,导航到“Pipelines”页面 。 然后选择“操作”以创建新的管道。
  3. 首先选择“GitHub”作为源代码位置,完成向导的各个步骤 。
  4. 可能会重定向到 GitHub 进行登录。 如果是这样,请输入 GitHub 凭据。
  5. 存储库列表显示时,请选择示例应用存储库。
  6. Azure Pipelines 将分析存储库,并推荐一个模板。 选择“保存并运行”,再选择“直接提交到主分支”,然后再次选择“保存并运行” 。
  7. 开始新运行。 请等待运行完成。

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 函数应用部署任务。 此任务需要 Azure 服务连接作为输入。 Azure 服务连接存储要从 Azure Pipelines 连接到 Azure 的凭据。

若要部署到 Azure Functions,请在 azure-pipelines.yml 文件的末尾添加以下代码片段。 默认 appType 为 Windows。 可以通过将 appType 设置为 functionAppLinux 来指定 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: 'ubuntu-latest'

- task: AzureFunctionApp@1 # Add this at the end of your file
  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。 若要详细了解容器,请参阅在 Linux 上使用自定义容器创建函数

使用用于容器的 Azure 函数应用任务进行部署

部署到容器的最简单的方法是使用容器部署上的 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 映像,然后部署该映像。

部署到槽

可以将函数应用配置为具有多个槽。 通过槽,你可以安全地部署应用并对其进行测试,然后再将其提供给客户。

以下 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 中的项目管理员。

后续步骤