可以使用 GitHub Actions 工作流定义一个工作流,以便自动生成代码并将其部署到 Azure Functions 中的函数应用。
定义工作流配置的 YAML 文件 (.yml) 保留在存储库的 /.github/workflows/
路径中。 此定义包含构成工作流的操作和参数,它们特定于函数的开发语言。 Functions 的 GitHub Actions 工作流执行以下任务,而不考虑语言:
- 设置环境。
- 生成代码项目。
- 将包部署到 Azure 中的函数应用。
Azure Functions 操作处理向 Azure 中现有函数应用进行的部署。
可以手动为部署创建工作流配置文件。 还可以通过以下方式之一从一组特定于语言的模板生成文件:
- 在 Azure 门户中
- 使用 Azure CLI
- 从你的 GitHub 存储库
如果不想手动创建 YAML 文件,请选择文章顶部的其他方法。
先决条件
生成部署凭据
由于 GitHub Actions 在部署期间使用你的发布配置文件访问函数应用,因此你首先需要获取发布配置文件并将其安全地存储为 GitHub 机密。
重要
发布配置文件是一个有价值的凭据,它允许对 Azure 资源的访问。 请确保始终安全地传输和存储它。 在 GitHub 中,发布配置文件只能存储在 GitHub 机密中。
下载你的发布配置文件
若要下载函数应用的发布配置文件:
选择函数应用的“概述”页,然后选择“获取发布配置文件”。
保存并复制该文件的内容。
添加 GitHub 机密
在 GitHub 中,转到存储库。
转到“设置” 。
选择“机密和变量 > 操作”。
选择“新建存储库机密”。
添加名称为 AZURE_FUNCTIONAPP_PUBLISH_PROFILE
的新机密,并将值设置为发布配置文件的内容。
选择“添加机密”。
GitHub 现在可以针对 Azure 中的函数应用进行身份验证了。
通过模板创建工作流
手动创建工作流配置的最佳方式是通过官方支持的模板。
选择“Windows”或“Linux”,确保获取适用于正确操作系统的模板。
部署到 Windows 时使用 runs-on: windows-latest
。
部署到 Linux 时使用 runs-on: ubuntu-latest
。
使用以下链接从 Azure Functions 操作存储库复制特定于语言的模板:
Windows 不支持 Python 函数。 请改为选择 Linux。
使用 Azure 中函数应用资源的名称更新 env.AZURE_FUNCTIONAPP_NAME
参数。 可以选择性地更新用于设置你的应用所使用的语言版本的参数,例如 DOTNET_VERSION
代表 C#。
将此新 YAML 文件添加到存储库的 /.github/workflows/
路径中。
在门户中创建工作流配置
使用门户启用 GitHub Actions 时,Functions 会基于应用程序堆栈创建工作流文件,并将其提交到正确目录中的 GitHub 存储库。
门户会自动获取你的发布配置文件,并将其添加到存储库的 GitHub 机密中。
创建函数应用期间
在 Azure 门户中创建函数时,可以通过“部署”选项卡快速开始使用 GitHub Actions。 若要在创建新的函数应用时添加 GitHub Actions 工作流,请执行以下操作:
在 Azure 门户中,选择“创建函数应用”流中的“部署”。
如果你希望每个代码更新都触发到 Azure 门户的代码推送,请启用持续部署。
输入你的 GitHub 组织、存储库和分支。
完成函数应用的配置。 你的 GitHub 存储库现在包含 /.github/workflows/
中的新工作流文件。
对于现有函数应用
还可以将 GitHub Actions 添加到现有函数应用。 要将 GitHub Actions 工作流添加到现有函数应用:
在 Azure 门户中导航到函数应用。
选择“部署中心”。
在“持续部署 (CI / CD)”下,选择“GitHub”。 你会看到默认消息“使用 GitHub Actions 生成”。
输入你的 GitHub 组织、存储库和分支。
选择“预览文件”查看 github/workflows/
中将添加到 GitHub 存储库的工作流文件。
选择“保存”,将工作流文件添加到存储库。
将工作流配置添加到存储库
可以使用 az functionapp deployment github-actions add
命令根据函数应用的正确模板生成工作流配置文件。 然后,新的 YAML 文件将存储在你提供的 GitHub 存储库中的正确位置 (/.github/workflows/
),同时你的应用的发布配置文件将添加到同一存储库中的 GitHub 机密。
运行此 az functionapp
命令,替换值 githubUser/githubRepo
、MyResourceGroup
和 MyFunctionapp
:
az functionapp deployment github-actions add --repo "githubUser/githubRepo" -g MyResourceGroup -n MyFunctionapp --login-with-github
此命令使用交互式方法检索 GitHub 帐户的个人访问令牌。
在终端窗口中,应会看到类似于以下消息的内容:
Please navigate to https://github.com/login/device and enter the user code XXXX-XXXX to activate and retrieve your GitHub personal access token.
复制唯一 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
转到 GitHub 存储库并选择“操作”。 验证工作流是否运行。
创建工作流配置文件
可以直接从 GitHub 存储库通过 Azure Functions 模板创建 GitHub Actions 工作流配置文件。
在 GitHub 中,转到存储库。
选择“操作”和“新建工作流”。
搜索函数。
在显示的由 Azure 创作的函数应用工作流中,找到与代码语言匹配的工作流,然后选择“配置”。
在新创建的 YAML 文件中,将 env.AZURE_FUNCTIONAPP_NAME
参数更新为 Azure 中函数应用资源的名称。 可以选择性地更新用于设置你的应用所使用的语言版本的参数,例如 DOTNET_VERSION
代表 C#。
验证是否正在 /.github/workflows/
中保存新的工作流文件,然后选择“提交更改...”。
更新工作流配置
如果出于某种原因需要更新或更改现有工作流配置,只需导航到存储库中的 /.github/workflows/
位置,打开特定的 YAML 文件,做出所需的更改,然后将更新提交到存储库即可。
示例:工作流配置文件
以下模版示例使用 functions-action
的版本 1 和 publish profile
进行身份验证。 模板取决于所选语言和部署函数应用的操作系统:
如果函数应用在 Linux 上运行,请选择“Linux”。
如果函数应用在 Windows 上运行,请选择“Windows”。
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 }}
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: ubuntu-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: bash
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 }}
name: Deploy Java project to Azure Function App
on:
[push]
env:
AZURE_FUNCTIONAPP_NAME: 'your-app-name' # set this to your function app name on Azure
POM_XML_DIRECTORY: '.' # set this to the directory which contains pom.xml file
JAVA_VERSION: '8' # set this to the java version to use (e.g. '8', '11', '17')
jobs:
build-and-deploy:
runs-on: windows-latest
environment: dev
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v3
- name: Setup Java Sdk ${{ env.JAVA_VERSION }}
uses: actions/setup-java@v1
with:
java-version: ${{ env.JAVA_VERSION }}
- name: 'Restore Project Dependencies Using Mvn'
shell: pwsh
run: |
pushd './${{ env.POM_XML_DIRECTORY }}'
mvn clean package
popd
- name: 'Run Azure Functions Action'
uses: Azure/functions-action@v1
id: fa
with:
app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
package: '${{ env.POM_XML_DIRECTORY }}' # if there are multiple function apps in same project, then this path will be like './${{ env.POM_XML_DIRECTORY }}/target/azure-functions/${{ env.POM_FUNCTIONAPP_NAME }'
publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}
respect-pom-xml: true
name: Deploy Java project to Azure Function App
on:
[push]
env:
AZURE_FUNCTIONAPP_NAME: 'your-app-name' # set this to your function app name on Azure
POM_XML_DIRECTORY: '.' # set this to the directory which contains pom.xml file
JAVA_VERSION: '8' # set this to the java version to use (e.g. '8', '11', '17')
jobs:
build-and-deploy:
runs-on: ubuntu-latest
environment: dev
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v3
- name: Setup Java Sdk ${{ env.JAVA_VERSION }}
uses: actions/setup-java@v1
with:
java-version: ${{ env.JAVA_VERSION }}
- name: 'Restore Project Dependencies Using Mvn'
shell: bash
run: |
pushd './${{ env.POM_XML_DIRECTORY }}'
mvn clean package
popd
- name: 'Run Azure Functions Action'
uses: Azure/functions-action@v1
id: fa
with:
app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
package: '${{ env.POM_XML_DIRECTORY }}' # if there are multiple function apps in same project, then this path will be like './${{ env.POM_XML_DIRECTORY }}/target/azure-functions/${{ env.POM_FUNCTIONAPP_NAME }'
publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}
respect-pom-xml: true
name: Deploy Node.js 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
NODE_VERSION: '16.x' # set this to the node version to use (e.g. '8.x', '10.x', '12.x')
jobs:
build-and-deploy:
runs-on: windows-latest
environment: dev
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v3
- name: Setup Node ${{ env.NODE_VERSION }} Environment
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
- name: 'Resolve Project Dependencies Using Npm'
shell: pwsh
run: |
pushd './${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}'
npm install
npm run build --if-present
npm run test --if-present
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 }}
publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}
name: Deploy Node.js 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
NODE_VERSION: '16.x' # set this to the node version to use (e.g. '8.x', '10.x', '12.x')
jobs:
build-and-deploy:
runs-on: ubuntu-latest
environment: dev
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v3
- name: Setup Node ${{ env.NODE_VERSION }} Environment
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
- name: 'Resolve Project Dependencies Using Npm'
shell: bash
run: |
pushd './${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}'
npm install
npm run build --if-present
npm run test --if-present
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 }}
publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}
Windows 不支持 Python 函数。 请改为选择 Linux。
name: Deploy Python 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
PYTHON_VERSION: '3.9' # set this to the python version to use (e.g. '3.6', '3.7', '3.8')
jobs:
build-and-deploy:
runs-on: ubuntu-latest
environment: dev
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v3
- name: Setup Python ${{ env.PYTHON_VERSION }} Environment
uses: actions/setup-python@v4
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: 'Resolve Project Dependencies Using Pip'
shell: bash
run: |
pushd './${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}'
python -m pip install --upgrade pip
pip install -r requirements.txt --target=".python_packages/lib/site-packages"
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 }}
publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}
scm-do-build-during-deployment: true
enable-oryx-build: true
name: Deploy PowerShell 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
jobs:
build-and-deploy:
runs-on: windows-latest
environment: dev
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v3
- 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 }}
publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}
name: Deploy PowerShell 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
jobs:
build-and-deploy:
runs-on: ubuntu-latest
environment: dev
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v3
- 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 }}
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 操作时,请记住以下注意事项:
后续步骤