练习 - 设置环境

已完成

重要

需要自己的 Azure 订阅才能运行此练习,这可能会产生费用。 如果还没有 Azure 订阅,请在开始前创建一个免费帐户

在开始处理玩具公司的网站工作流之前,需要配置环境。 在本单元中,确保已设置好 Azure 和 GitHub 环境,以完成本模块的剩余操作。

为了达成这些目标,你需要:

  • 设置此模块的 GitHub 存储库。
  • 将项目的存储库克隆到计算机。
  • 在 Microsoft Entra ID 中创建两个工作负载标识。
  • 在 Azure 中创建两个资源组。
  • 在 GitHub 中创建两个机密和环境。

获取 GitHub 存储库

在这里,请确保已设置 GitHub 存储库以完成此模块的剩余部分。 可根据模板存储库创建新的存储库来进行设置。 模板存储库包含开始学习此模块所需的文件。

本学习路径中的模块是循序渐进的。 出于学习目的,每个模块都有一个关联的 GitHub 模板存储库。

提示

即使你已完成学习路径中的上一个模块,也请按照这些说明创建新存储库,并确保为其提供一个新名称。

从模板存储库开始

运行用于设置 GitHub 存储库的模板。

在 GitHub 站点上,按照以下步骤从模板创建存储库:

  1. 选择“使用此模板”>“创建新存储库”。

    GitHub 界面的屏幕截图,其中显示了模板存储库,突出显示了“使用此模板”按钮。

  2. 记下 GitHub 用户名或组织的名称。 在该示例中,GitHub 用户名为 mygithubuser。 很快会用到此名称。

  3. 输入新项目的名称,如“toy-website-environments”。

  4. 选择“公共”选项。

    创建自己的存储库时,可以将其设为专用。 在此模块中,你将使用 GitHub 的某些功能,这些功能仅适用于公用存储库和 GitHub Enterprise 帐户。

  5. 选择“从模板创建存储库”。

    GitHub 界面的屏幕截图,其中显示了存储库创建页面。

重要

本模块的最后一个练习包含重要的清理步骤。 即使未完成此模块,也务必要按照清理步骤操作。

克隆存储库

现在,你在自己的帐户中有一个模板存储库的副本。 接下来,在本地克隆此存储库,以便开始在其中工作。

  1. 选择“代码”,然后选择复制图标。

    GitHub 界面的屏幕截图,其中显示了新的存储库,并突出显示了存储库 URL 的复制按钮。

  2. 打开 Visual Studio Code。

  3. 选择“终端”>“新建终端”,打开 Visual Studio Code 终端窗口。 此窗口通常会在屏幕底部打开。

  4. 在终端中,导航到要在本地计算机上克隆 GitHub 存储库的目录。 例如,若要将存储库克隆到 toy-website-environments 文件夹,请运行以下命令:

    cd toy-website-environments
    
  5. 键入 git clone 并粘贴之前复制的 URL,如下所示:

    git clone https://github.com/mygithubuser/toy-website-environments.git
    
  6. 通过在 Visual Studio Code 终端运行以下命令,在存储库文件夹中重新打开 Visual Studio Code:

    code -r toy-website-environments
    

登录 Azure

若要使用 Azure 中的资源组,请从 Visual Studio Code 终端登录到 Azure 帐户。 请确保已安装 Azure CLI 工具。

  1. 在“终端”菜单中,选择“新终端”。 终端窗口通常在屏幕的下半部分打开。

    默认 shell 通常是 pwsh,如终端窗口右侧所示。

    Visual Studio Code 终端窗口的屏幕截图,其中 pwsh 显示为 shell 选项。

  2. 选择“启动配置文件”下拉列表,然后选择“Azure Cloud Shell (Bash)”。

    Visual Studio Code 终端窗口的屏幕截图。显示终端 shell 下拉列表和 Azure Cloud Shell (Bash) 菜单项。

    此时会打开新的 shell。

使用 Azure CLI 登录到 Azure

  1. 在 Visual Studio Code 终端中,运行以下命令以登录到 Azure:

    az login
    
  2. 在打开的浏览器中,登录到 Azure 帐户。

若要使用 Azure 中的资源组,请从 Visual Studio Code 终端登录到 Azure 帐户。 确保已安装 Azure PowerShell

  1. 在“终端”菜单中,选择“新终端”。 终端窗口通常在屏幕的下半部分打开。

    默认 shell 通常是 pwsh,如终端窗口右侧所示。

    Visual Studio Code 终端窗口的屏幕截图,其中 pwsh 显示为 shell 选项。

  2. 选择“启动配置文件”下拉列表,然后选择“Azure Cloud Shell (PowerShell)”。

    Visual Studio Code 终端窗口的屏幕截图。显示终端 shell 下拉列表和 Azure Cloud Shell (PowerShell) 菜单项。

    此时会打开新的 shell。

使用 Azure PowerShell 登录到 Azure

  1. 在 Visual Studio Code 终端中,运行以下命令以登录到 Azure:

    Connect-AzAccount
    
  2. 在打开的浏览器中,登录到 Azure 帐户。

创建两个工作负载标识

接下来,在 Microsoft Entra ID 中创建两个工作负载标识:一个用于测试环境,另一个用于生产环境。

要创建工作负载标识,Azure CLI 命令使用 jq 从 JSON 输出分析数据。 如果还没有安装 jq,可以使用 Azure Cloud Shell 中的 Bash 创建工作负载标识、资源组和角色分配,并准备 GitHub 机密。

  1. 运行以下代码,为 GitHub 用户名和存储库名称定义变量。 确保将 mygithubuser 替换为你的 GitHub 用户名,在本练习前面指出了这一点。 另外,请确保指定正确的 GitHub 存储库名称。

    githubOrganizationName='mygithubuser'
    githubRepositoryName='toy-website-environments'
    
  2. 创建用于部署到测试环境的工作负载标识。 工作负载标识需要两个联合凭据:一个凭据是在工作流运行验证作业时使用的,因为此作业未与 GitHub 环境关联。 当工作流运行针对测试 GitHub 环境运行的部署作业时,将使用第二个凭据。

    testApplicationRegistrationDetails=$(az ad app create --display-name 'toy-website-environments-test')
    testApplicationRegistrationObjectId=$(echo $testApplicationRegistrationDetails | jq -r '.id')
    testApplicationRegistrationAppId=$(echo $testApplicationRegistrationDetails | jq -r '.appId')
    
    az ad app federated-credential create \
       --id $testApplicationRegistrationObjectId \
       --parameters "{\"name\":\"toy-website-environments-test\",\"issuer\":\"https://token.actions.githubusercontent.com\",\"subject\":\"repo:${githubOrganizationName}/${githubRepositoryName}:environment:Test\",\"audiences\":[\"api://AzureADTokenExchange\"]}"
    
    az ad app federated-credential create \
       --id $testApplicationRegistrationObjectId \
       --parameters "{\"name\":\"toy-website-environments-test-branch\",\"issuer\":\"https://token.actions.githubusercontent.com\",\"subject\":\"repo:${githubOrganizationName}/${githubRepositoryName}:ref:refs/heads/main\",\"audiences\":[\"api://AzureADTokenExchange\"]}"
    
  3. 运行以下代码,该代码为生产环境创建类似的工作负载标识和联合凭据:

    productionApplicationRegistrationDetails=$(az ad app create --display-name 'toy-website-environments-production')
    productionApplicationRegistrationObjectId=$(echo $productionApplicationRegistrationDetails | jq -r '.id')
    productionApplicationRegistrationAppId=$(echo $productionApplicationRegistrationDetails | jq -r '.appId')
    
    az ad app federated-credential create \
       --id $productionApplicationRegistrationObjectId \
       --parameters "{\"name\":\"toy-website-environments-production\",\"issuer\":\"https://token.actions.githubusercontent.com\",\"subject\":\"repo:${githubOrganizationName}/${githubRepositoryName}:environment:Production\",\"audiences\":[\"api://AzureADTokenExchange\"]}"
    
    az ad app federated-credential create \
       --id $productionApplicationRegistrationObjectId \
       --parameters "{\"name\":\"toy-website-environments-production-branch\",\"issuer\":\"https://token.actions.githubusercontent.com\",\"subject\":\"repo:${githubOrganizationName}/${githubRepositoryName}:ref:refs/heads/main\",\"audiences\":[\"api://AzureADTokenExchange\"]}"
    
  1. 运行以下代码,为 GitHub 用户名和存储库名称定义变量。 确保将 mygithubuser 替换为你的 GitHub 用户名,在本练习前面指出了这一点。 另外,请确保指定正确的 GitHub 存储库名称。

    $githubOrganizationName = 'mygithubuser'
    $githubRepositoryName = 'toy-website-environments'
    
  2. 运行以下代码,该代码为测试环境创建工作负载标识,并将其与 GitHub 存储库关联:

    $testApplicationRegistration = New-AzADApplication -DisplayName 'toy-website-environments-test'
    New-AzADAppFederatedCredential `
       -Name 'toy-website-environments-test' `
       -ApplicationObjectId $testApplicationRegistration.Id `
       -Issuer 'https://token.actions.githubusercontent.com' `
       -Audience 'api://AzureADTokenExchange' `
       -Subject "repo:$($githubOrganizationName)/$($githubRepositoryName):environment:Test"
    New-AzADAppFederatedCredential `
       -Name 'toy-website-environments-test-branch' `
       -ApplicationObjectId $testApplicationRegistration.Id `
       -Issuer 'https://token.actions.githubusercontent.com' `
       -Audience 'api://AzureADTokenExchange' `
       -Subject "repo:$($githubOrganizationName)/$($githubRepositoryName):ref:refs/heads/main"
    
  3. 运行以下代码,该代码在生产环境中遵循类似的过程:

    $productionApplicationRegistration = New-AzADApplication -DisplayName 'toy-website-environments-production'
    New-AzADAppFederatedCredential `
       -Name 'toy-website-environments-production' `
       -ApplicationObjectId $productionApplicationRegistration.Id `
       -Issuer 'https://token.actions.githubusercontent.com' `
       -Audience 'api://AzureADTokenExchange' `
       -Subject "repo:$($githubOrganizationName)/$($githubRepositoryName):environment:Production"
    New-AzADAppFederatedCredential `
       -Name 'toy-website-environments-production-branch' `
       -ApplicationObjectId $productionApplicationRegistration.Id `
       -Issuer 'https://token.actions.githubusercontent.com' `
       -Audience 'api://AzureADTokenExchange' `
       -Subject "repo:$($githubOrganizationName)/$($githubRepositoryName):ref:refs/heads/main"
    

在 Azure 中创建两个资源组并授予工作负载标识访问权限

接下来,为每个环境创建一个资源组。 此过程还会向相应的工作负载标识授予资源组的“参与者”角色,从而使工作流可部署到资源组。

  1. 若要创建测试环境的资源组并向其授予工作负载标识访问权限,请在 Visual Studio Code 终端中运行以下 Azure CLI 命令:

    testResourceGroupResourceId=$(az group create --name ToyWebsiteTest --location eastus --query id --output tsv)
    
    az ad sp create --id $testApplicationRegistrationObjectId
    az role assignment create \
       --assignee $testApplicationRegistrationAppId \
       --role Contributor \
       --scope $testResourceGroupResourceId
    
  2. 运行类似的过程以创建生产环境的资源组:

    productionResourceGroupResourceId=$(az group create --name ToyWebsiteProduction --location eastus --query id --output tsv)
    
    az ad sp create --id $productionApplicationRegistrationObjectId
    az role assignment create \
       --assignee $productionApplicationRegistrationAppId \
       --role Contributor \
       --scope $productionResourceGroupResourceId
    
  1. 若要创建测试环境的资源组并向其授予工作负载标识访问,请在 Visual Studio Code 终端中运行以下 Azure PowerShell 命令:

    $testResourceGroup = New-AzResourceGroup -Name ToyWebsiteTest -Location eastus
    
    New-AzADServicePrincipal -AppId $($testApplicationRegistration.AppId)
    New-AzRoleAssignment `
       -ApplicationId $($testApplicationRegistration.AppId) `
       -RoleDefinitionName Contributor `
       -Scope $($testResourceGroup.ResourceId)
    
  2. 运行类似的过程以创建生产环境的资源组:

    $productionResourceGroup = New-AzResourceGroup -Name ToyWebsiteProduction -Location eastus
    
    New-AzADServicePrincipal -AppId $($productionApplicationRegistration.AppId)
    New-AzRoleAssignment `
       -ApplicationId $($productionApplicationRegistration.AppId) `
       -RoleDefinitionName Contributor `
       -Scope $($productionResourceGroup.ResourceId)
    

准备 GitHub 机密

运行以下代码以显示创建为 GitHub 机密所需的值:

echo "AZURE_CLIENT_ID_TEST: $testApplicationRegistrationAppId"
echo "AZURE_CLIENT_ID_PRODUCTION: $productionApplicationRegistrationAppId"
echo "AZURE_TENANT_ID: $(az account show --query tenantId --output tsv)"
echo "AZURE_SUBSCRIPTION_ID: $(az account show --query id --output tsv)"
$azureContext = Get-AzContext
Write-Host "AZURE_CLIENT_ID_TEST: $($testApplicationRegistration.AppId)"
Write-Host "AZURE_CLIENT_ID_PRODUCTION: $($productionApplicationRegistration.AppId)"
Write-Host "AZURE_TENANT_ID: $($azureContext.Tenant.Id)"
Write-Host "AZURE_SUBSCRIPTION_ID: $($azureContext.Subscription.Id)"

创建 GitHub 机密

已经创建了两个工作负载标识和将在其中部署它们的资源组。 接下来,在 GitHub Actions 中创建机密。

  1. 在浏览器中,导航到 GitHub 存储库。

  2. 选择“设置”>“机密和变量”>“操作”。

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

    GitHub 界面的屏幕截图,其中显示了“机密”页,并突出显示了“创建存储库机密”按钮。

  4. 将机密命名为 AZURE_CLIENT_ID_TEST。

  5. 在“值”字段中,粘贴终端输出第一行中的 GUID。 不要在值中包含 AZURE_CLIENT_ID_TEST、冒号或任何空格。

  6. 选择“添加机密”。

    GitHub 界面的屏幕截图,其中显示了“新建机密”页,填写了名称和值,并突出显示了“添加机密”按钮。

  7. 重复此过程,为 AZURE_CLIENT_ID_PRODUCTION、AZURE_TENANT_ID 和 AZURE_SUBSCRIPTION_ID 创建机密,从终端输出中的相应字段复制值。

  8. 验证机密列表现在是否显示所有四个机密。

    显示机密列表的 GitHub 界面的屏幕截图,包括测试机密和生产机密。

在 GitHub 中创建环境

  1. 在浏览器中,转到“设置”>“环境”。

  2. 选择“新建环境”。

    GitHub 界面的屏幕截图,其中显示了“环境”页和用于创建环境的按钮。

  3. 输入“测试”作为环境名称。

    名为“测试”的新环境的 GitHub 页的屏幕截图,包含“配置环境”按钮。

  4. 选择“配置环境”。

  5. 选择“环境”以返回到环境列表。

    名为“测试”的新环境的 GitHub 页的屏幕截图,包含“环境”链接。

  6. 重复该过程以创建另一个名为“生产”的环境。

    保持生产环境配置页面打开。

将保护规则添加到生产环境

  1. 选择“必需审阅者”。

  2. 在“搜索用户或团队”文本框中,键入你自己的 GitHub 用户名并选择你自己。

    GitHub 界面的屏幕截图,显示用于添加必需审阅者的页面,包含“已完成的详细信息”和“保存保护规则”按钮。

  3. 选择“保存保护规则”。

  4. 选择“环境”以退出配置。