你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure 存储中使用 GitHub Actions 工作流以部署静态网站

使用工作流将静态站点部署到 Azure 存储帐户以开始使用 GitHub Actions。 设置 GitHub Actions 工作流后,当更改站点代码时,站点会从 GitHub 自动部署到 Azure。

注意

如果你使用的是 Azure Static Web Apps,则无需手动设置 GitHub Actions 工作流。 Azure Static Web Apps 会自动为你创建 GitHub Actions 工作流。

先决条件

Azure 订阅和 GitHub 帐户。

备注

通常使用内容分发网络 (CDN) 来降低全球用户的延迟,并减少存储帐户的事务数。 将静态内容部署到基于云的存储服务可以降低对可能非常昂贵的计算实例的需求。 有关详细信息,请参阅“静态内容托管模式”。

生成部署凭据

若要凭借 OIDC 使用 Azure 登录操作,需要在 Microsoft Entra 应用程序或用户分配的托管标识上配置联合标识凭据。

选项 1:Microsoft Entra 应用程序

选项 2:用户分配的托管标识

配置 GitHub 机密

需要向登录操作提供应用程序的“客户端 ID”、“目录(租户) ID”和“订阅 ID”。 这些值可直接在工作流中提供,或可存储在 GitHub 机密中并在工作流中引用。 将这些值保存为 GitHub 机密是更安全的选择。

  1. GitHub 中,转到存储库。

  2. 选择“安全性”>“机密和变量”>“操作”。

    添加机密的屏幕截图

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

    注意

    若要增强公共存储库中的工作流安全性,请使用环境机密而不是存储库机密。 如果环境需要批准,作业在所需的审查者批准之前不能访问环境机密。

  4. AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_SUBSCRIPTION_ID 创建机密。 从 GitHub 机密的 Microsoft Entra 应用程序或用户分配的托管标识复制这些值:

    GitHub 机密 Microsoft Entra 应用程序或用户分配的托管标识
    AZURE_CLIENT_ID 客户端 ID
    AZURE_SUBSCRIPTION_ID 订阅 ID
    AZURE_TENANT_ID 目录(租户)ID

    注意

    出于安全原因,我们建议使用 GitHub 机密,而不是将值直接传递到工作流。

添加工作流

  1. 转到 GitHub 存储库的“操作”。

    GitHub Actions 菜单项

  2. 选择“自己设置工作流”。

  3. 删除工作流文件 on: 部分后面的所有内容。 例如,剩下的工作流可能如下所示。

    name: CI with OpenID Connect
    
    on:
        push:
            branches: [ main ]
    
  4. 添加权限部分。

    name: CI with OpenID Connect
    
    on:
        push:
            branches: [ main ]
    
    permissions:
          id-token: write
          contents: read
    
  5. 添加签出和登录操作。 这些操作将签出你的站点代码,并使用之前创建的 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 }}
    
  6. 利用 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"
    
  7. 通过添加注销 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()
    

查看部署

  1. 转到 GitHub 存储库的“操作”。

  2. 打开第一个结果,查看工作流运行的详细日志。

    GitHub 操作运行的日志

清理资源

如果不再需要静态网站和 GitHub 存储库,请删除资源组和 GitHub 存储库,以清理部署的资源。

后续步骤