使用 Github Actions 进行持续交付

可以使用 GitHub Actions 工作流定义一个工作流,以便自动生成代码并将其部署到 Azure Functions 中的函数应用。

定义工作流配置的 YAML 文件 (.yml) 保留在存储库的 /.github/workflows/ 路径中。 此定义包含构成工作流的操作和参数,它们特定于函数的开发语言。 Functions 的 GitHub Actions 工作流执行以下任务,而不考虑语言:

  1. 设置环境。
  2. 生成代码项目。
  3. 将包部署到 Azure 中的函数应用。

Azure Functions 操作处理向 Azure 中现有函数应用进行的部署。

可以手动为部署创建工作流配置文件。 还可以通过以下方式之一从一组特定于语言的模板生成文件:

  • 在 Azure 门户中
  • 使用 Azure CLI
  • 从你的 GitHub 存储库

如果不想手动创建 YAML 文件,请选择文章顶部的其他方法。

先决条件

  • 具有活动订阅的 Azure 帐户。 创建帐户

  • 一个 GitHub 帐户。 如果没有该帐户,请注册免费版

  • 在 Azure 上托管的正常工作的函数应用,源代码在 GitHub 存储库中。

  • Azure CLI(进行本地开发时需要)。

生成部署凭据

由于 GitHub Actions 在部署期间使用你的发布配置文件访问函数应用,因此你首先需要获取发布配置文件并将其安全地存储为 GitHub 机密

重要

发布配置文件是一个有价值的凭据,它允许对 Azure 资源的访问。 请确保始终安全地传输和存储它。 在 GitHub 中,发布配置文件只能存储在 GitHub 机密中。

下载你的发布配置文件

若要下载函数应用的发布配置文件:

  1. 选择函数应用的“概述”页,然后选择“获取发布配置文件”

    下载发布配置文件

  2. 保存并复制该文件的内容。

添加 GitHub 机密

  1. GitHub 中,转到存储库。

  2. 转到“设置” 。

  3. 选择“机密和变量 > 操作”。

  4. 选择“新建存储库机密”。

  5. 添加名称为 AZURE_FUNCTIONAPP_PUBLISH_PROFILE 的新机密,并将值设置为发布配置文件的内容。

  6. 选择“添加机密”。

GitHub 现在可以针对 Azure 中的函数应用进行身份验证了。

通过模板创建工作流

手动创建工作流配置的最佳方式是通过官方支持的模板。

  1. 选择“Windows”或“Linux”,确保获取适用于正确操作系统的模板。

    部署到 Windows 时使用 runs-on: windows-latest

  2. 使用以下链接从 Azure Functions 操作存储库复制特定于语言的模板:

  3. 使用 Azure 中函数应用资源的名称更新 env.AZURE_FUNCTIONAPP_NAME 参数。 可以选择性地更新用于设置你的应用所使用的语言版本的参数,例如 DOTNET_VERSION 代表 C#。

  4. 将此新 YAML 文件添加到存储库的 /.github/workflows/ 路径中。

在门户中创建工作流配置

使用门户启用 GitHub Actions 时,Functions 会基于应用程序堆栈创建工作流文件,并将其提交到正确目录中的 GitHub 存储库。

门户会自动获取你的发布配置文件,并将其添加到存储库的 GitHub 机密中。

创建函数应用期间

在 Azure 门户中创建函数时,可以通过“部署”选项卡快速开始使用 GitHub Actions。 若要在创建新的函数应用时添加 GitHub Actions 工作流,请执行以下操作:

  1. Azure 门户中,选择“创建函数应用”流中的“部署”。

    Functions 菜单中的部署选项的屏幕截图。

  2. 如果你希望每个代码更新都触发到 Azure 门户的代码推送,请启用持续部署

  3. 输入你的 GitHub 组织、存储库和分支。

    GitHub 用户帐户详细信息的屏幕截图。

  4. 完成函数应用的配置。 你的 GitHub 存储库现在包含 /.github/workflows/ 中的新工作流文件。

对于现有函数应用

还可以将 GitHub Actions 添加到现有函数应用。 要将 GitHub Actions 工作流添加到现有函数应用:

  1. 在 Azure 门户中导航到函数应用。

  2. 选择“部署中心”。

  3. 在“持续部署 (CI / CD)”下,选择“GitHub”。 你会看到默认消息“使用 GitHub Actions 生成”。

  4. 输入你的 GitHub 组织、存储库和分支。

  5. 选择“预览文件”查看 github/workflows/ 中将添加到 GitHub 存储库的工作流文件。

  6. 选择“保存”,将工作流文件添加到存储库。

将工作流配置添加到存储库

可以使用 az functionapp deployment github-actions add 命令根据函数应用的正确模板生成工作流配置文件。 然后,新的 YAML 文件将存储在你提供的 GitHub 存储库中的正确位置 (/.github/workflows/),同时你的应用的发布配置文件将添加到同一存储库中的 GitHub 机密。

  1. 运行此 az functionapp 命令,替换值 githubUser/githubRepoMyResourceGroupMyFunctionapp

    az functionapp deployment github-actions add --repo "githubUser/githubRepo" -g MyResourceGroup -n MyFunctionapp --login-with-github
    

    此命令使用交互式方法检索 GitHub 帐户的个人访问令牌。

  2. 在终端窗口中,应会看到类似于以下消息的内容:

    Please navigate to https://github.com/login/device and enter the user code XXXX-XXXX to activate and retrieve your GitHub personal access token.
    
  3. 复制唯一 XXXX-XXXX 代码,浏览到 https://github.com/login/device,然后输入复制的代码。 输入代码后,应会看到类似于以下消息的内容:

    Verified GitHub repo and branch
    Getting workflow template using runtime: java
    Filling workflow template with name: func-app-123, branch: main, version: 8, slot: production, build_path: .
    Adding publish profile to GitHub
    Fetching publish profile with secrets for the app 'func-app-123'
    Creating new workflow file: .github/workflows/master_func-app-123.yml
    
  4. 转到 GitHub 存储库并选择“操作”。 验证工作流是否运行。

创建工作流配置文件

可以直接从 GitHub 存储库通过 Azure Functions 模板创建 GitHub Actions 工作流配置文件。

  1. GitHub 中,转到存储库。

  2. 选择“操作”和“新建工作流”。

  3. 搜索函数

    搜索 GitHub Actions 函数模板的屏幕截图。

  4. 在显示的由 Azure 创作的函数应用工作流中,找到与代码语言匹配的工作流,然后选择“配置”。

  5. 在新创建的 YAML 文件中,将 env.AZURE_FUNCTIONAPP_NAME 参数更新为 Azure 中函数应用资源的名称。 可以选择性地更新用于设置你的应用所使用的语言版本的参数,例如 DOTNET_VERSION 代表 C#。

  6. 验证是否正在 /.github/workflows/ 中保存新的工作流文件,然后选择“提交更改...”。

更新工作流配置

如果出于某种原因需要更新或更改现有工作流配置,只需导航到存储库中的 /.github/workflows/ 位置,打开特定的 YAML 文件,做出所需的更改,然后将更新提交到存储库即可。

示例:工作流配置文件

以下模版示例使用 functions-action 的版本 1 和 publish profile 进行身份验证。 模板取决于所选语言和部署函数应用的操作系统:

如果函数应用在 Linux 上运行,请选择“Linux”。

name: Deploy DotNet project to Azure Function App

on:
  [push]

env:
  AZURE_FUNCTIONAPP_NAME: 'your-app-name'   # set this to your function app name on Azure
  AZURE_FUNCTIONAPP_PACKAGE_PATH: '.'       # set this to the path to your function app project, defaults to the repository root
  DOTNET_VERSION: '6.0.x'                   # set this to the dotnet version to use (e.g. '2.1.x', '3.1.x', '5.0.x')

jobs:
  build-and-deploy:
    runs-on: windows-latest
    environment: dev
    steps:
    - name: 'Checkout GitHub Action'
      uses: actions/checkout@v3

    - name: Setup DotNet ${{ env.DOTNET_VERSION }} Environment
      uses: actions/setup-dotnet@v3
      with:
        dotnet-version: ${{ env.DOTNET_VERSION }}

    - name: 'Resolve Project Dependencies Using Dotnet'
      shell: pwsh
      run: |
        pushd './${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}'
        dotnet build --configuration Release --output ./output
        popd

    - name: 'Run Azure Functions Action'
      uses: Azure/functions-action@v1
      id: fa
      with:
        app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
        package: '${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}/output'
        publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}

Azure Functions 操作

Azure Functions 操作 (Azure/azure-functions) 定义你的代码如何发布到 Azure 中现有的函数应用或应用中的特定槽。

参数

所有函数应用计划都需要以下参数:

参数 说明
app-name 函数应用的名称。
package 这是要发布的项目中的位置。 默认情况下,此值设置为 .,这意味着将部署 GitHub 存储库中的所有文件和文件夹。

弹性消耗计划需要以下参数:

参数 解释
sku 使用 publish-profile 进行身份验证时,将其设置为 flexconsumption。 使用 RBAC 凭据或部署到非 Flex Consumption 计划时,Action 可以解析该值,因此不需要包含参数。
remote-build 将此项设置为 true 可在将包部署到弹性消耗应用时启用 Kudu 的生成操作。 Oryx 生成始终在弹性消耗中的远程生成期间执行;请勿在部署期间设置 scm-do-build- 或 enable-oryx-build。 默认情况下,此参数设置为 false

以下参数特定于消耗计划、弹性高级计划和应用服务(专用)计划:

参数 解释
scm-do-build-during-deployment (可选)允许 Kudu 站点(例如 https://<APP_NAME>.scm.chinacloudsites.cn/)执行预部署操作,例如远程生成。 默认情况下,这设置为 false。 如果要使用 Kudu 控制部署行为,而不是解析 GitHub 工作流中的依赖项,请将此项设置为 true。 有关详细信息,请参阅 SCM_DO_BUILD_DURING_DEPLOYMENT 设置。
enable-oryx-build (可选)允许 Kudu 站点使用 Oryx 解析项目依赖项。 默认情况下,这设置为 false。 如果要使用 Oryx 来解析依赖项而不是 GitHub 工作流,请在部署期间将 scm-do-build-during-deployment 和 enable-oryx-build 都设置为 true

所有函数应用计划的可选参数:

参数 解释
slot-name 这是要部署到的部署槽位名称。 默认情况下,此值为空,这意味着 GitHub Action 将部署到生产站点。 如果此设置指向非生产槽位,请确保 publish-profile 参数包含槽位而不是生产站点的凭据目前在弹性消耗中不受支持
publish-profile 包含你的发布配置文件的 GitHub 机密的名称。
respect-pom-xml 仅用于 Java 函数。 应用的部署工件是否需要派生自 pom.xml 文件。 部署 Java 函数应用时,应将此参数设置为 true,并将 package 设置为 .。 默认情况下,此参数设置为 false,这意味着 package 参数必须指向应用的工件位置,例如 ./target/azure-functions/
respect-funcignore GitHub Actions 是否遵循 .funcignore 文件以排除在其中定义的文件和文件夹。 如果你的存储库具有 .funcignore 文件,并且你想要使用它排除路径和文件(例如文本编辑器配置、.vscode/ 或 Python 虚拟环境 (.venv/)),请将此值设置为 true。 默认设置为 false

注意事项

使用 Azure Functions 操作时,请记住以下注意事项:

  • 使用 GitHub Actions 时,代码会通过 one deploy 部署到 Flex Consumption 计划下的应用,通过 zip deploy 部署到消耗计划Elastic Premium专用(应用服务)计划下的应用。 例外情况是 Linux 消耗计划,在该计划中,需要使用外部包 URL

  • GitHub 连接到 Azure 以进行部署所需的凭据作为机密存储在 GitHub 存储库中,并在部署中作为 secrets.<SECRET_NAME> 进行访问。

  • GitHub Action 向 Azure Functions 进行身份验证以进行部署的最简单方法是使用发布配置文件。 还可以使用服务主体进行身份验证。 若要了解详细信息,请参阅此 GitHub Actions 存储库

  • 设置环境和运行生成的操作通过模板生成,并且特定于语言。

  • 模板使用 env 元素来定义你的生成和部署所特有的设置。

后续步骤