使用 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. 选择函数应用的“概述”页,然后选择“获取发布配置文件”

    Download publish profile

  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 门户中,选择“创建函数应用”流中的“部署”。

    Screenshot of Deployment option in Functions menu.

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

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

    Screenshot of GitHub user account details.

  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. 搜索函数

    Screenshot of search for GitHub Actions functions templates.

  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 (必需)函数应用的名称。
slot-name (可选)要部署到其中的特定部署槽的名称。 该槽必须已经存在于函数应用中。 如果未指定,代码将部署到活动槽。
publish-profile (可选)包含你的发布配置文件的 GitHub 机密的名称。

以下参数也受支持,但仅在特定情况下使用:

参数 说明
package (可选)设置存储库中要从其发布的子路径。 默认情况下,此值设置为 .,这意味着将部署 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
scm-do-build-during-deployment (可选)应用服务部署站点 (Kudu) 是否执行预部署操作。 可在 https://<APP_NAME>.scm.chinacloudsites.cn/ 找到函数应用的部署站点。 如果需要控制 Kudu 中的部署,而不是解析 GitHub Actions 工作流中的依赖项,请将此设置更改为 true。 默认值为 false。 有关详细信息,请参阅 SCM_DO_BUILD_DURING_DEPLOYMENT 设置。
enable-oryx-build (可选)Kudu 部署站点是否使用 Oryx 解析项目依赖项。 如果要使用 Oryx 通过使用远程生成而不是 GitHub Actions 工作流来解析项目依赖项,请将其设置为 truetrue 时,还应将 scm-do-build-during-deployment 设置为 true。 默认值为 false

注意事项

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

  • 使用 GitHub Actions 时,将使用 Azure Functions 的 Zip 部署将代码部署到函数应用。

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

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

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

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

后续步骤