練習 - 保護您的主要分支

已完成

您的團隊正在進行 Bicep 範本的工作,其中已包含網站與資料庫。 您已開發生產環境的元件。 現在,您需要更新您的 Bicep 範本,已新增訂單處理佇列。

在此練習中,您將建立您所做變更的功能分支。 您也會保護您的主要分支,並且僅允許在檢閱變更後,將其合併至主要分支。 但是在那之前,您需要確保已設定您的環境,才能完成此課程模組的剩餘部分。

在此過程中,您將會:

  • 設定適用於此課程模組的 GitHub 存放庫。
  • 將該存放庫複製到您的電腦。
  • 在您的存放庫主要分支新增分支保護措施。
  • 建立您所做變更的本地功能分支。
  • 嘗試將功能分支合併至主要分支。
  • 設定本課程模組的 Azure DevOps 專案。
  • 將專案的存放庫複製到電腦。
  • 在存放庫主要分支新增分支原則。
  • 建立您所做變更的本地功能分支。
  • 嘗試將功能分支合併至主要分支。

取得 GitHub 存放庫

在此,您需要確保已設定 GitHub 存放庫,才能完成此模組的剩餘部分。 您可以根據範本存放庫建立新的存放庫,以完成設定。 範本存放庫包含您開始進行此模組所需的檔案。

從範本存放庫開始進行

執行可設定您的 GitHub 存放庫的範本。

在 GitHub 網站上,按照下列步驟操作以從範本建立存放庫:

  1. 選取 [使用此範本]>[建立新的存放庫]。

    GitHub 介面的螢幕擷取畫面,其中顯示範本存放庫,且已醒目提示使用目前範本的按鈕。

  2. 輸入新專案的名稱,例如 toy-website-review

  3. 選取 [公開] 選項。

    建立自己的存放庫時,建議您將其設為私人。 在此課程模組中,您將使用僅可與公開存放庫和 GitHub Enterprise 帳戶一同運作的 GitHub 功能。

  4. 選取 [從範本建立存放庫]

    GitHub 介面的螢幕擷取畫面,其中顯示存放庫建立頁面。

取得 Azure DevOps 專案

您必須設定 Azure DevOps 組織,以完成本課程模組的其餘部分。 您在 Azure DevOps 中執行建立專案的範本,以設定組織。

在 Azure DevOps Demo Generator 網站上,按照下列步驟操作:

  1. 選取 [登入] 並接受使用條款。

  2. 在 [建立新專案] 頁面上,選取 Azure DevOps 組織。 接著輸入專案名稱,例如 toy-review-website

    螢幕擷取畫面顯示透過 Azure DevOps 示範產生器建立專案。

  3. 選取 [建立專案]

    執行範本需要花一些時間。 這會自動建立管線和 Bicep 檔案,以供您在之後的練習使用。

  4. 選取 [瀏覽至專案],前往您在 Azure DevOps 中的專案。

複製存放庫

現在,您已在自己的帳戶中擁有範本存放庫的複本。 將此存放庫複製到本地,以開始進行。

  1. 選取 [程式碼],然後選取 [複製] 圖示。

    顯示新存放庫的 GitHub 介面螢幕擷取畫面,其中已醒目提示存放庫的 URL 複製按鈕。

  2. 打開 Visual Studio Code。

  3. 透過選取 [終端機]>[新增終端機],開啟一個 Visual Studio Code 終端機視窗。 該視窗通常會在畫面底部開啟。

  4. 在終端中,前往要在本機電腦上複製 GitHub 存放庫的目錄。 舉例來說,若要將存放庫複製到 toy-website-review 資料夾,請執行下裂命令:

    cd toy-website-review
    
  5. 輸入 git clone 然後貼上先前複製的 URL,然後執行命令。 命令看起來像這樣:

    git clone https://github.com/mygithubuser/toy-website-review.git
    
  6. 在 Visual Studio Code 終端機中執行下列命令,以在存放庫資料夾中重新開啟 Visual Studio Code:

    code -r toy-website-review
    

現在,您在自己的帳戶中已擁有專案。 將此存放庫複製到本地,以開始進行。

  1. 選取 [存放庫] > [檔案]

    Azure DevOps 的螢幕擷取畫面,其中顯示 [存放庫] 功能表並醒目提示 [檔案]。

  2. 選取 [複製]。

    Azure DevOps 螢幕擷取畫面,其中顯示存放庫並醒目提示 [複製] 按鈕。

  3. 如果您使用 macOS,則需要特殊的密碼才能複製 Git 存放庫。 選取 [產生 Git 認證],然後將顯示的使用者名稱和密碼複製到安全的場所。

  4. 選取 [在 VS Code 中複製]。 如果系統提示您允許開啟 Visual Studio Code,請選取 [開啟]

    Azure DevOps 的螢幕擷取畫面,其中顯示存放庫設定並醒目提示在 Visual Studio Cod 中複製的按鈕。

  5. 建立資料夾作為存放庫,然後選擇 [選取存放庫位置]

  6. 因為您是第一次使用此存放庫,所以系統會提示您登入。

    • 若您正在使用 Windows,請輸入您稍早在本練習中用來登入 Azure DevOps 的相同認證。

    • 如果您使用 macOS,請輸入您稍早所產生的 Git 使用者名稱和密碼。

  7. Visual Studio Code 會提示您開啟存放庫。 選取開啟

    Visual Studio Code 的螢幕擷取畫面,其中顯示開啟已複製存放庫的提示並醒目提示 [開啟] 按鈕。

新增分支保護措施

設定 Git 存放庫以避免直接推送至主要分支。

  1. 在瀏覽器中,選取 [設定]

  2. 選取 [分支]

  3. 選取 [新增分支保護規則]

    GitHub 的螢幕擷取畫面,顯示新增分支保護規則的頁面,其中已醒目提示新增規則的按鈕。

  4. 分支名稱模式文字方塊中,輸入 main

  5. 選取 [合併前要求提取請求]

    清除 [需要核准]。 通常您會選取此選項。 但在此範例中,您將合併自己的提取請求,而 [需要核准] 選項會防止您這麼做。

  6. 選取 [不允許略過上述設定]

    您可以選取此設定作為範例,稍後在此練習中顯示 git pushmain 如何會失敗。 在實際執行環境中,您可能不想將直接合併限制為 main 管理員或存放庫擁有者。

  7. 在頁面底部附近,選取 [建立]

    GitHub 的螢幕擷取畫面,其中顯示 [建立] 按鈕。

    GitHub 可能會要求您重新登入以確認身分。

新增分支原則

設定 Git 存放庫以避免直接推送至主要分支。

  1. 在瀏覽器中,前往 [存放庫]> [分支]

  2. 將游標懸停在主要分支上,然後選取三個點。

  3. 選取分支原則

    顯示分支清單的 Azure DevOps 螢幕擷取畫面,其中顯示捷徑功能表,且已醒目提示分支原則的功能表項目。

  4. 分支原則視窗中,將需要最少數目的檢閱者設定變更為開啟

  5. 將檢閱者的最少數目變更為 1,然後選取允許要求者核准自己所做的變更選項。

    Azure DevOps 的螢幕擷取畫面,其中顯示主要分支的分支原則頁面。

    注意

    在此,您會啟用允許要求者核准自己所做的變更選項。 在這些練習中,您將獨自進行練習,因此您需要建立和核准自己所做的變更。 但在真實團隊環境中,您可能不想啟用此選項。

建立本地功能分支

  1. 在 Visual Studio Code 終端中,執行下列陳述式:

    git checkout -b add-orders-queue
    

    此命令會建立可供您工作的新功能分支。

  2. deploy 資料夾中開啟 main.bicep 檔案。

    Visual Studio Code 的螢幕擷取畫面,顯示部署資料夾中的主要點 bicep 檔案。

  3. 在參數下,新增佇列名稱的新變數:

    var storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS'
    var processOrderQueueName = 'processorder'
    
  4. 在儲存體帳戶資源中,將佇列新增為巢狀子資源:

    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
        }
      }
    }
    
  5. appService 模組定義中,將儲存體帳戶和佇列名稱新增為參數:

    module appService 'modules/appService.bicep' = {
      name: 'appService'
      params: {
        location: location
        appServiceAppName: appServiceAppName
        storageAccountName: storageAccount.name
        processOrderQueueName: storageAccount::queueServices::processOrderQueue.name
        environmentType: environmentType
      }
    }
    

    此程式碼可讓應用程式尋找會傳送訊息的佇列。

  6. 儲存 main.bicep 檔案。

  7. deploy/modules 資料夾中開啟 appService.bicep 檔案。

  8. 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
    
  9. 更新 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 終端中執行下列命令,以認可您所做的變更,並將其推送至您的 GutHub 存放庫:

git add .
git commit -m "Add orders queue and associated configuration"
git push --set-upstream origin add-orders-queue

功能分支會推送至新分支,並且在您的遠端存放庫中命名為 add-orders-queue

嘗試合併功能分支至主要分支

您已了解為何不建議您直接推送至主要分支。 在此,您會嘗試打破這條指引,親眼見識主要分支的保護措施如何防止您意外將變更推送至受到保護的分支。

  1. 在 Visual Studio Code 終端中,執行下列陳述式,以切換至主要分支並將 add-orders-queue 分支合併至主要分支:

    git checkout main
    git merge add-orders-queue
    

    命令如期運作,但您僅在本地 Git 存放庫中將 add-orders-queue 分支合併至主要分支。

  2. 執行下列陳述式,以嘗試將您所做的變更推送至 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'
    

    錯誤訊息會告訴您不允許推送至主要分支,且您必須使用提取要求來更新分支。

  3. 執行下列陳述式以復原合併:

    git reset --hard HEAD~1
    

    此命令會使您的本地 Git 存放庫將主要分支狀態重設為上次認可合併之前的狀態,並且不要儲存您所做的變更。 add-orders-queue 分支不受影響。

您已了解為何不建議您直接推送至主要分支。 在此,您會嘗試打破這條指引,親眼見識主要分支的原則如何防止您意外將變更推送至受到保護的分支。

  1. 在 Visual Studio Code 終端中,執行下列陳述式,以切換至主要分支並將 add-orders-queue 分支合併至主要分支:

    git checkout main
    git merge add-orders-queue
    

    命令如期運作,但您僅在本地 Git 存放庫中將 add-orders-queue 分支合併至主要分支。

  2. 執行下列陳述式以嘗試將變更推送至 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'
    

    錯誤訊息會告訴您不允許推送至主要分支,且您必須使用提取要求來更新分支。

  3. 執行下列陳述式以復原合併:

    git reset --hard HEAD~1
    

    此命令會使您的本地 Git 存放庫將主要分支狀態重設為上次認可合併之前的狀態,並且不要儲存您所做的變更。 add-orders-queue 分支不受影響。