练习 - 保护主分支
你的团队正在处理一个已包含网站和数据库的 Bicep 模板。 你已将组件部署到生产环境。 现在,你需要更新 Bicep 模板,以添加订单处理队列。
在本练习中,你将为所做的更改创建一个功能分支。 你还将保护主分支,只允许在评审后将更改合并到主分支。 但在此之前,需要确保已设置好环境,以完成本模块的其余部分。
在此过程中,你将:
- 设置此模块的 GitHub 存储库。
- 将存储库克隆到你的计算机。
- 将分支保护添加到存储库的主分支。
- 为更改创建本地功能分支。
- 尝试将功能分支合并到主分支中。
- 设置一个 Azure DevOps 项目供本模块使用。
- 将项目的存储库克隆到计算机。
- 将分支策略添加到存储库的主分支中。
- 为更改创建本地功能分支。
- 尝试将功能分支合并到主分支中。
获取 GitHub 存储库
在这里,请确保已设置 GitHub 存储库以完成本模块的其余部分。 可根据模板存储库创建新的存储库来进行设置。 模板存储库包含开始学习本模块所需的文件。
从模板存储库开始
运行用于设置 GitHub 存储库的模板。
在 GitHub 站点上,按照以下步骤从模板创建存储库:
选择“使用此模板”>“创建新存储库”。
输入新项目的名称,如“toy-website-review”。
选择“公共”选项。
创建自己的存储库时,可以将其设为专用。 在本模块中,你将使用 GitHub 的功能,这些功能仅适用于公用存储库和 GitHub Enterprise 帐户。
选择“从模板创建存储库”。
获取 Azure DevOps 项目
在这里,需确保 Azure DevOps 组织已设置好,可完成本模块的其余操作。 你可运行在 Azure DevOps 中创建项目的模板来进行设置。
在 Azure DevOps 演示生成器站点上,按照下列步骤操作:
选择“Sign In”并接受使用条款。
在“Create New Project”页面上,选择 Azure DevOps 组织。 然后输入项目名称,如“toy-website-review”。
选择“创建项目”。
模板需要一些时间来运行。 它会自动创建一个管道和 Bicep 文件,供你在接下来的练习中使用。
选择“导航到项目”,转到你在 Azure DevOps 中的项目。
克隆存储库
现在,你在自己的帐户中有一个模板存储库的副本。 在本地克隆此存储库,你就可以开始工作了。
选择“代码”,然后选择“复制”图标。
打开 Visual Studio Code。
选择“终端”>“新建终端”,打开 Visual Studio Code 终端窗口。 此窗口通常会在屏幕底部打开。
在终端中,转到要在本地计算机上克隆 GitHub 存储库的目录。 例如,若要将存储库克隆到“toy-website-review”文件夹,请运行以下命令:
cd toy-website-review
键入
git clone
并粘贴之前复制的 URL,然后运行命令。 命令如下所示:git clone https://github.com/mygithubuser/toy-website-review.git
通过在 Visual Studio Code 终端运行以下命令,在存储库文件夹中重新打开 Visual Studio Code:
code -r toy-website-review
现在,你在自己的帐户中有一个项目。 在本地克隆此存储库,你就可以开始工作了。
选择“Repos”>“文件”。
选择“克隆”。
如果使用的是 macOS,则需要提供特定密码才能克隆 Git 存储库。 选择“生成 Git 凭据”,然后将显示的用户名和密码复制到安全的位置。
选择“在 VS Code 中克隆”。 如果系统提示你允许打开 Visual Studio Code,请选择“打开”。
创建用于存储库的文件夹,然后选择“选择存储库位置”。
这是你第一次使用此存储库,因此系统会提示你登录。
如果使用的是 Windows,请输入你在本练习前面用于登录 Azure DevOps 的相同凭据。
如果使用的是 macOS,请输入刚才生成的 Git 用户名和密码。
Visual Studio Code 会提示你打开存储库。 选择“打开” 。
添加分支保护
配置 Git 存储库以防止直接推送到主分支。
在浏览器中,选择“设置”。
选择“分支”。
选择“添加分支保护规则”。
在“分支名称模式”文本框中,输入“main”。
选中“在合并前需要拉取请求”。
清除“需要审批”框。 正常情况下,需要选中此选项。 但在本例中,你要合并自己的拉取请求,而“需要审批”选项会阻止你执行此操作。
选择“不允许绕过上述设置”。
选择此设置作为示例,以在本练习的后面部分展示
git push
到main
的操作的失败情况。 在生产环境中,你可能不希望将管理员或存储库所有者的直接合并限制为main
。在页面底部,选择“创建”。
GitHub 可能会要求你再次登录以确认你的身份。
添加分支策略
配置 Git 存储库以防止直接推送到主分支。
在浏览器中,转到“存储库”>“分支”。
将鼠标悬停在 main 分支上,然后选择三个点图标。
选择“分支策略”。
在“分支策略”窗口中,将“需要最少数量的审阅者”设置更改为“开”。
将最少数量的审阅者更改为“1”,然后选中“允许请求者审批自己的更改”选项。
注意
在这里,你启用了“允许请求者审批自己的更改”选项。 在这些练习中,你是自己在工作,因此你需要完成创建和审批更改。 但在实际的团队环境中,你可能不需要启用此选项。
创建本地功能分支
在 Visual Studio Code 终端中,运行以下语句:
git checkout -b add-orders-queue
此命令将创建一个新功能分支供你使用。
打开 deploy 文件夹中的 main.bicep 文件。
在参数下方,为队列名称添加一个新变量:
var storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS' var processOrderQueueName = 'processorder'
在存储帐户资源中,添加队列作为嵌套子资源:
resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = { name: storageAccountName location: location sku: { name: storageAccountSkuName } kind: 'StorageV2' properties: { accessTier: 'Hot' } resource queueServices 'queueServices' existing = { name: 'default' resource processOrderQueue 'queues' = { name: processOrderQueueName } } }
在
appService
模块定义中,添加存储帐户和队列名称作为参数:module appService 'modules/appService.bicep' = { name: 'appService' params: { location: location appServiceAppName: appServiceAppName storageAccountName: storageAccount.name processOrderQueueName: storageAccount::queueServices::processOrderQueue.name environmentType: environmentType } }
此代码使应用程序能够找到它要发送消息的队列。
保存 main.bicep 文件。
打开 deploy/modules 文件夹中的 appService.bicep 文件。
在 appService.bicep 文件顶部附近,为存储帐户和队列名称添加新参数:
@description('The Azure region into which the resources should be deployed.') param location string @description('The name of the App Service app to deploy. This name must be globally unique.') param appServiceAppName string @description('The name of the storage account to deploy. This name must be globally unique.') param storageAccountName string @description('The name of the queue to deploy for processing orders.') param processOrderQueueName string @description('The type of the environment. This must be nonprod or prod.') @allowed([ 'nonprod' 'prod' ]) param environmentType string
更新
appServiceApp
资源以将存储帐户和队列名称传播到应用程序的环境变量:resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = { name: appServiceAppName location: location properties: { serverFarmId: appServicePlan.id httpsOnly: true siteConfig: { appSettings: [ { name: 'StorageAccountName' value: storageAccountName } { name: 'ProcessOrderQueueName' value: processOrderQueueName } ] } } }
提交和推送功能分支
通过在 Visual Studio Code 终端中运行以下命令,提交更改并将其推送到 GitHub 存储库:
通过在 Visual Studio Code 终端中运行以下命令,提交更改并将其推送到 Azure Repos 存储库:
git add .
git commit -m "Add orders queue and associated configuration"
git push --set-upstream origin add-orders-queue
功能分支被推送到远程存储库中同样名为 add-orders-queue 的新分支。
尝试将功能分支合并到主分支
你已经了解为什么不建议直接推送到主分支。 在这里,你可以尝试打破这一准则,看看主分支的保护如何防止你意外地将更改推送到受保护的分支。
在 Visual Studio Code 终端中,运行以下语句,切换到主分支,并将 add-orders-queue 分支合并到该分支中:
git checkout main git merge add-orders-queue
命令成功了,但你将 add-orders-queue 分支仅合并到了本地 Git 存储库中的主分支。
运行以下语句,尝试将更改推送到 GitHub:
git push
请注意,推送失败,并显示如下所示的错误消息:
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0 remote: error: GH006: Protected branch update failed for refs/heads/main. remote: error: Changes must be made through a pull request. To https://github.com/mygithubuser/toy-website-review.git ! [remote rejected] main -> main (protected branch hook declined) error: failed to push some refs to 'https://github.com/mygithubuser/toy-website-review.git'
错误消息指出不允许推送到主分支,必须使用拉取请求来更新分支。
通过运行以下语句撤消合并:
git reset --hard HEAD~1
此命令指示本地 Git 存储库将主分支的状态重置为上次提交合并之前的状态,而不是保存更改。 add-orders-queue 分支不受影响。
你已经了解为什么不建议直接推送到主分支。 在这里,你可以尝试打破这一准则,看看分支策略如何防止你意外地将更改推送到受保护的分支。
在 Visual Studio Code 终端中,运行以下语句,切换到主分支,并将 add-orders-queue 分支合并到该分支:
git checkout main git merge add-orders-queue
命令成功了,但你将 add-orders-queue 分支仅合并到了本地 Git 存储库中的主分支。
运行以下语句,尝试将更改推送到 Azure Repos:
git push
请注意,推送失败,并显示如下所示的错误消息:
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0 To https://dev.azure.com/mytoycompany/toy-website-review/_git/toy-website-review ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.) error: failed to push some refs to 'https://dev.azure.com/mytoycompany/toy-website-review/_git/toy-website-review'
错误消息指出不允许推送到主分支,必须使用拉取请求来更新分支。
通过运行以下语句撤消合并:
git reset --hard HEAD~1
此命令指示本地 Git 存储库将主分支的状态重置为上次提交合并之前的状态,而不是保存更改。 add-orders-queue 分支不受影响。