你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
使用工作流将静态站点部署到 Azure 存储帐户以开始使用 GitHub Actions。 设置 GitHub Actions 工作流后,当更改站点代码时,站点会从 GitHub 自动部署到 Azure。
注意
如果你使用的是 Azure Static Web Apps,则无需手动设置 GitHub Actions 工作流。 Azure Static Web Apps 会自动为你创建 GitHub Actions 工作流。
先决条件
Azure 订阅和 GitHub 帐户。
- 具有活动订阅的 Azure 帐户。 免费创建帐户。
- 具有静态站点代码的 GitHub 存储库。 如果没有 GitHub 帐户,可以免费注册。
- 托管在 Azure 存储中的工作静态网站。 了解如何在 Azure 存储中托管静态网站。 若要遵循此示例,还应部署 Azure CDN。
备注
通常使用内容分发网络 (CDN) 来降低全球用户的延迟,并减少存储帐户的事务数。 将静态内容部署到基于云的存储服务可以降低对可能非常昂贵的计算实例的需求。 有关详细信息,请参阅“静态内容托管模式”。
生成部署凭据
若要凭借 OIDC 使用 Azure 登录操作,需要在 Microsoft Entra 应用程序或用户分配的托管标识上配置联合标识凭据。
选项 1:Microsoft Entra 应用程序
- 通过 Azure 门户、Azure CLI 或 Azure PowerShell 创建具有服务主体的 Microsoft Entra 应用程序。
- 复制客户端 ID、订阅 ID 和目录(租户)ID 的值,以便在 GitHub Actions 工作流中稍后使用。
- 由 Azure 门户、Azure CLI 或 azure PowerShell 为服务主体分配适当的角色。
- 在 Microsoft Entra 应用程序上配置联合标识凭据,以信任 GitHub Actions 颁发的令牌到 GitHub 存储库。
选项 2:用户分配的托管标识
- 创建用户分配的托管标识。
- 复制客户端 ID、订阅 ID 和目录(租户)ID 的值,以便在 GitHub Actions 工作流中稍后使用。
- 为用户分配的托管标识分配适当的角色。
- 在用户分配的托管标识上配置联合标识凭据,以信任 GitHub Actions 颁发给 GitHub 存储库的令牌。
配置 GitHub 机密
需要向登录操作提供应用程序的“客户端 ID”、“目录(租户) ID”和“订阅 ID”。 这些值可直接在工作流中提供,或可存储在 GitHub 机密中并在工作流中引用。 将这些值保存为 GitHub 机密是更安全的选择。
在 GitHub 中,转到存储库。
选择“安全性”>“机密和变量”>“操作”。
选择“新建存储库机密”。
注意
若要增强公共存储库中的工作流安全性,请使用环境机密而不是存储库机密。 如果环境需要批准,作业在所需的审查者批准之前不能访问环境机密。
为
AZURE_CLIENT_ID
、AZURE_TENANT_ID
和AZURE_SUBSCRIPTION_ID
创建机密。 从 GitHub 机密的 Microsoft Entra 应用程序或用户分配的托管标识复制这些值:GitHub 机密 Microsoft Entra 应用程序或用户分配的托管标识 AZURE_CLIENT_ID 客户端 ID AZURE_SUBSCRIPTION_ID 订阅 ID AZURE_TENANT_ID 目录(租户)ID 注意
出于安全原因,我们建议使用 GitHub 机密,而不是将值直接传递到工作流。
添加工作流
转到 GitHub 存储库的“操作”。
选择“自己设置工作流”。
删除工作流文件
on:
部分后面的所有内容。 例如,剩下的工作流可能如下所示。name: CI with OpenID Connect on: push: branches: [ main ]
添加权限部分。
name: CI with OpenID Connect on: push: branches: [ main ] permissions: id-token: write contents: read
添加签出和登录操作。 这些操作将签出你的站点代码,并使用之前创建的 GitHub 机密向 Azure 进行身份验证。
name: CI with OpenID Connect on: push: branches: [ main ] permissions: id-token: write contents: read jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: azure/login@v2 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
利用 Azure CLI 操作将代码上传到 blob 存储,并清除 CDN 终结点。 对于
az storage blob upload-batch
,将占位符替换为存储帐户的名称。 脚本将上传到$web
容器。 对于az cdn endpoint purge
,将占位符替换为 CDN 配置文件名称、CDN 终结点名称和资源组。 若要加快 CDN 清除的速度,可以将--no-wait
选项添加到az cdn endpoint purge
。 若要增强安全性,还可以在存储帐户密钥中添加--account-key
选项。- name: Upload to blob storage uses: azure/CLI@v1 with: inlineScript: | az storage blob upload-batch --account-name <STORAGE_ACCOUNT_NAME> --auth-mode key -d '$web' -s . - name: Purge CDN endpoint uses: azure/CLI@v1 with: inlineScript: | az cdn endpoint purge --content-paths "/*" --profile-name "CDN_PROFILE_NAME" --name "CDN_ENDPOINT" --resource-group "RESOURCE_GROUP"
通过添加注销 Azure 的操作来完成工作流。 下面是已完成的工作流。 文件将显示在存储库的
.github/workflows
文件夹中。name: CI with OpenID Connect on: push: branches: [ main ] permissions: id-token: write contents: read jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: azure/login@v2 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - name: Upload to blob storage uses: azure/CLI@v1 with: inlineScript: | az storage blob upload-batch --account-name <STORAGE_ACCOUNT_NAME> --auth-mode key -d '$web' -s . - name: Purge CDN endpoint uses: azure/CLI@v1 with: inlineScript: | az cdn endpoint purge --content-paths "/*" --profile-name "CDN_PROFILE_NAME" --name "CDN_ENDPOINT" --resource-group "RESOURCE_GROUP" # Azure logout - name: logout run: | az logout if: always()
查看部署
转到 GitHub 存储库的“操作”。
打开第一个结果,查看工作流运行的详细日志。
清理资源
如果不再需要静态网站和 GitHub 存储库,请删除资源组和 GitHub 存储库,以清理部署的资源。