你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
教程:使用 GitHub Actions 部署到应用服务自定义容器并连接到数据库
本教程逐步介绍如何设置一个 GitHub Actions 工作流,以使用 Azure SQL 数据库后端部署容器化的 ASP.NET Core 应用程序。 完成后,你便拥有了一个在 Azure 中运行并连接到 SQL 数据库的 ASP.NET 应用。 首先,你将使用 ARM 模板 GitHub Actions 工作流创建 Azure资源。
在本教程中,你将了解如何执行以下操作:
- 使用 GitHub Actions 工作流通过 Azure 资源管理器模板(ARM 模板)将资源添加到 Azure
- 使用 GitHub Actions 工作流生成包含最新 Web 应用更改的容器
如果没有 Azure 订阅,请在开始之前创建一个 Azure 免费帐户。
先决条件
若要完成本教程,你需要:
- 具有活动订阅的 Azure 帐户。 免费创建帐户。
- 一个 GitHub 帐户。 如果没有该帐户,请注册免费版。
- GitHub 存储库,用于存储资源管理器模板和工作流文件。 若要创建一个存储库,请参阅创建新存储库。
下载示例
在 Azure 示例存储库中创建示例项目的分支。
https://github.com/Azure-Samples/dotnetcore-containerized-sqldb-ghactions/
创建资源组
在 https://shell.azure.com 上打开 Azure Cloud Shell。 或者,可以使用 Azure CLI(如果已在本地安装)。 (有关 Cloud Shell 的详细信息,请参阅“Cloud Shell 概述”。)
az group create --name {resource-group-name} --location {resource-group-location}
生成部署凭据
OpenID Connect 是一种使用短期令牌的身份验证方法。 使用 GitHub Actions 设置 OpenID Connect 的过程会更复杂,能提供更强的安全性。
如果当前没有应用程序,请注册一个可以访问资源的新 Microsoft Entra ID 应用程序和服务主体。
az ad app create --display-name myApp
此命令将输出 JSON,其中
appId
为你的client-id
。id
是APPLICATION-OBJECT-ID
,它将用于通过图形 API 调用创建联合凭据。 保存该值,稍后将其用作AZURE_CLIENT_ID
GitHub 机密。创建服务主体。 将
$appID
替换为 JSON 输出中的 appId。此命令使用服务主体
id
生成 JSON 输出。 服务主体id
用作下一步az role assignment create
命令中--assignee-object-id
参数的值。复制 JSON 输出中的
appOwnerOrganizationId
,以在稍后用作AZURE_TENANT_ID
的 GitHub 机密。az ad sp create --id $appId
为服务主体创建新的角色分配。 默认情况下,角色分配将绑定到默认订阅。 将
$subscriptionId
替换为你的订阅 ID,将$resourceGroupName
替换为你的资源组名称,将$servicePrincipalId
替换为新创建的服务主体 ID。az role assignment create --role contributor --subscription $subscriptionId --assignee-object-id $servicePrincipalId --assignee-principal-type ServicePrincipal --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroupName
运行以下命令,为 Microsoft Entra ID 应用程序创建新的联合标识凭据。
- 将
APPLICATION-OBJECT-ID
替换为 Microsoft Entra ID 应用程序的 objectId(在创建应用时生成)。 - 为
CREDENTIAL-NAME
设置一个值供以后引用。 - 设置
subject
。 此项的值由 GitHub 根据工作流定义:- GitHub Actions 环境中的作业:
repo:< Organization/Repository >:environment:< Name >
- 对于未绑定到环境的作业,请根据用于触发工作流的 ref 路径包括分支/标记的 ref 路径:
repo:< Organization/Repository >:ref:< ref path>
。 例如repo:n-username/ node_express:ref:refs/heads/my-branch
或repo:n-username/ node_express:ref:refs/tags/my-tag
。 - 对于由拉取请求事件触发的工作流:
repo:< Organization/Repository >:pull_request
。
- GitHub Actions 环境中的作业:
az ad app federated-credential create --id <APPLICATION-OBJECT-ID> --parameters credential.json ("credential.json" contains the following content) { "name": "<CREDENTIAL-NAME>", "issuer": "https://token.actions.githubusercontent.com", "subject": "repo:octo-org/octo-repo:environment:Production", "description": "Testing", "audiences": [ "api://AzureADTokenExchange" ] }
- 将
若要了解如何在 Azure 门户中创建 Active Directory 应用程序、服务主体和联合凭据,请参阅连接 GitHub 和 Azure。
配置 GitHub 机密以进行身份验证
需要向登录操作提供应用程序的“客户端 ID”、“租户 ID”和“订阅 ID”。 这些值可直接在工作流中提供,或可存储在 GitHub 机密中并在工作流中引用。 将这些值保存为 GitHub 机密是更安全的选择。
在 GitHub 中,转到存储库。
转到导航菜单中的“设置”。
选择“安全性”>“机密和变量”>“操作”。
选择“新建存储库机密”。
为
AZURE_CLIENT_ID
、AZURE_TENANT_ID
和AZURE_SUBSCRIPTION_ID
创建机密。 将 Microsoft Entra 应用程序中的这些值用于 GitHub 机密:GitHub 机密 Microsoft Entra 应用程序 AZURE_CLIENT_ID 应用程序(客户端)ID AZURE_TENANT_ID 目录(租户)ID AZURE_SUBSCRIPTION_ID 订阅 ID 通过选择“添加机密”来保存每个机密。
添加 SQL Server 机密
在存储库中为 SQL_SERVER_ADMIN_PASSWORD
创建新机密。 此机密可以是符合 Azure 密码安全标准的任何密码。 以后你不再可以访问此密码,因此请将其另行保存。
创建 Azure 资源
“创建 Azure 资源”工作流运行一个 ARM 模板以将资源部署到 Azure。 该工作流:
- 通过签出操作签出源代码。
- 通过 Azure 登录操作登录到 Azure,并收集环境和 Azure 资源的信息。
- 通过 Azure 资源管理器部署操作部署资源。
若要运行“创建 Azure 资源”工作流,请执行以下操作:
打开存储库内
.github/workflows
中的azuredeploy.yaml
文件。将
AZURE_RESOURCE_GROUP
的值更新为你的资源组名称。将
WEB_APP_NAME
和SQL_SERVER_NAME
的值更新为 Web 应用名称和 SQL Server 名称。转到“操作”并选择“运行工作流” 。
通过检查“操作”页上是否显示了绿色打勾标记来确认操作是否成功运行。
添加容器注册表和 SQL 机密
在 Azure 门户中,打开资源组中新建的 Azure 容器注册表。
转到“访问密钥”,然后复制用户名和密码值。
在存储库中为
ACR_USERNAME
和ACR_PASSWORD
密码创建新的 GitHub 机密。在 Azure 门户中,打开你的 SQL 数据库。 打开“连接字符串”并复制值。
为
SQL_CONNECTION_STRING
创建新机密。 将{your_password}
替换为你的SQL_SERVER_ADMIN_PASSWORD
。
生成、推送和部署映像
生成、推送和部署工作流生成一个包含最新应用更改的容器,将该容器推送到 Azure 容器注册表,并将 Web 应用程序过渡槽更新为指向所推送的最新容器。 该工作流包含生成和部署作业:
- 生成作业通过签出操作签出源代码。 然后,该作业使用 Docker 登录操作和自定义脚本向 Azure 容器注册表进行身份验证,生成容器映像,并将其部署到 Azure 容器注册表。
- 部署作业通过 Azure 登录操作登录到 Azure,并收集环境和 Azure 资源的信息。 然后,该作业通过 Azure 应用服务设置操作更新 Web 应用设置,并通过 Azure Web 部署操作部署到应用服务过渡槽。 最后,该作业运行自定义脚本来更新 SQL 数据库,并从过渡槽交换到生产槽。
若要运行生成、推送和部署工作流,请执行以下操作:
打开存储库内
.github/workflows
中的build-deploy.yaml
文件。确认
AZURE_RESOURCE_GROUP
和WEB_APP_NAME
的环境变量是否与azuredeploy.yaml
中的环境变量相匹配。将
ACR_LOGIN_SERVER
值更新为你的 Azure 容器注册表登录服务器。