Ćwiczenie — ochrona głównej gałęzi

Ukończone

Twój zespół pracuje nad szablonem Bicep, który zawiera już witrynę internetową i bazę danych. Składniki zostały wdrożone do środowiska produkcyjnego. Teraz musisz zaktualizować szablon Bicep, aby dodać kolejkę przetwarzania zamówień.

W tym ćwiczeniu utworzysz gałąź funkcjonalności dla zmiany. Będziesz również chronić gałąź główną i zezwalać na scalanie zmian do gałęzi głównej dopiero po ich przejrzeniu. Przed tym należy jednak upewnić się, że środowisko zostało skonfigurowane w celu ukończenia pozostałej części tego modułu.

Podczas tego procesu wykonasz następujące czynności:

  • Skonfiguruj repozytorium GitHub dla tego modułu.
  • Sklonuj repozytorium na komputer.
  • Dodaj zabezpieczenia dla głównej gałęzi repozytorium.
  • Utwórz lokalną gałąź funkcji dla zmiany.
  • Spróbuj scalić gałąź funkcji z gałęzią główną.
  • Skonfiguruj projekt usługi Azure DevOps dla tego modułu.
  • Sklonuj repozytorium projektu na komputer.
  • Dodaj polityki gałęzi do głównej gałęzi repozytorium.
  • Utwórz lokalną gałąź funkcjonalności dla swoich zmian.
  • Spróbuj połączyć gałąź funkcjonalności z gałęzią główną.

Pobierz repozytorium GitHub

W tym miejscu upewnij się, że repozytorium GitHub zostało skonfigurowane w celu ukończenia pozostałej części tego modułu. Konfigurujesz je, tworząc nowe repozytorium na podstawie repozytorium szablonów. Repozytorium szablonów zawiera pliki potrzebne do rozpoczęcia pracy z tym modułem.

Rozpoczynanie od repozytorium szablonów

Uruchom szablon, który konfiguruje repozytorium GitHub.

W witrynie usługi GitHub wykonaj następujące kroki, aby utworzyć repozytorium na podstawie szablonu:

  1. Wybierz pozycję Użyj tego szablonu>Utwórz nowe repozytorium.

    Zrzut ekranu interfejsu usługi GitHub przedstawiający repozytorium szablonu z wyróżnionym przyciskiem użycia bieżącego szablonu.

  2. Wprowadź nazwę nowego projektu, na przykład toy-website-review.

  3. Wybierz opcję Public.

    Podczas tworzenia własnych repozytoriów warto utworzyć je jako prywatne. W tym module będziesz pracować z funkcjami usługi GitHub, które działają tylko z repozytoriami publicznymi i kontami GitHub Enterprise.

  4. Wybierz pozycję Utwórz repozytorium na podstawie szablonu.

    Zrzut ekranu interfejsu usługi GitHub przedstawiający stronę tworzenia repozytorium.

Pobieranie projektu usługi Azure DevOps

W tym miejscu upewnij się, że twoja organizacja usługi Azure DevOps została skonfigurowana w celu ukończenia pozostałej części tego modułu. Konfigurujesz go, uruchamiając szablon, który tworzy projekt w usłudze Azure DevOps.

Uruchamianie szablonu

W witrynie Azure DevOps Demo Generator wykonaj następujące kroki:

  1. Wybierz zaloguj się i zaakceptuj warunki użytkowania.

  2. Na stronie Utwórz nowy projekt wybierz organizację usługi Azure DevOps. Następnie wprowadź nazwę projektu, na przykład toy-website-review.

    Zrzut ekranu przedstawiający tworzenie projektu za pomocą generatora demonstracyjnego usługi Azure DevOps.

  3. Wybierz pozycję Utwórz projekt.

    Uruchomienie szablonu zajmuje kilka chwil. Automatycznie tworzy proces i plik Bicep, które będą używane w kolejnych ćwiczeniach.

  4. Wybierz pozycję , aby przejść do projektu w usłudze Azure DevOps.

Klonowanie repozytorium

Masz teraz kopię repozytorium szablonów na własnym koncie. Sklonuj to repozytorium lokalnie, aby rozpocząć pracę w nim.

  1. Wybierz opcję Code, a następnie wybierz ikonę Copy.

    Zrzut ekranu przedstawiający interfejs usługi GitHub przedstawiający nowe repozytorium z wyróżnionym przyciskiem kopiowania repozytorium U R L.

  2. Otwórz program Visual Studio Code.

  3. Otwórz okno terminalu programu Visual Studio Code, wybierając pozycję Terminal>New Terminal. Okno jest zwykle otwierane w dolnej części ekranu.

  4. W terminalu przejdź do katalogu, w którym chcesz sklonować repozytorium GitHub na komputerze lokalnym. Aby na przykład sklonować repozytorium do folderu toy-website-review, uruchom następujące polecenie:

    cd toy-website-review
    
  5. Wpisz git clone i wklej skopiowany wcześniej adres URL, a następnie uruchom polecenie . Polecenie wygląda następująco:

    git clone https://github.com/mygithubuser/toy-website-review.git
    
  6. Otwórz ponownie program Visual Studio Code w folderze repozytorium, uruchamiając następujące polecenie w terminalu programu Visual Studio Code:

    code -r toy-website-review
    

Masz teraz projekt na swoim koncie. Sklonuj to repozytorium lokalnie, aby rozpocząć pracę w nim.

  1. Wybierz pozycję Repozytoria plików>.

    zrzut ekranu usługi Azure DevOps przedstawiający menu Repozytoria z wyróżnioną pozycją Pliki.

  2. Wybierz Klonuj.

    Zrzut ekranu przedstawiający repozytorium usługi Azure DevOps z wyróżnionym przyciskiem Klonuj.

  3. Jeśli używasz systemu macOS, potrzebujesz specjalnego hasła, aby sklonować repozytorium Git. Wybierz pozycję Wygeneruj poświadczenia usługi Git i skopiuj wyświetloną nazwę użytkownika i hasło w bezpiecznym miejscu.

  4. Wybierz pozycję Clone (Klonuj) w programie VS Code. Jeśli zostanie wyświetlony monit o zezwolenie programowi Visual Studio Code na otwarcie, wybierz pozycję Otwórz.

    Zrzut ekranu usługi Azure DevOps przedstawiający ustawienia repozytorium z wyróżnionym przyciskiem klonowania w programie Visual Studio Code.

  5. Utwórz folder do użycia dla repozytorium, a następnie wybierz pozycję Wybierz lokalizację repozytorium.

  6. Używasz tego repozytorium po raz pierwszy, więc zostanie wyświetlony monit o zalogowanie się.

    • Jeśli używasz systemu Windows, wprowadź te same poświadczenia, które były używane do logowania się do usługi Azure DevOps wcześniej w tym ćwiczeniu.

    • Jeśli używasz systemu macOS, wprowadź nazwę użytkownika i hasło usługi Git wygenerowane kilka chwil temu.

  7. Program Visual Studio Code monituje o otwarcie repozytorium. Wybierz Otwórz.

    Zrzut ekranu programu Visual Studio Code przedstawiający monit o otwarcie sklonowanego repozytorium z wyróżnionym przyciskiem Otwórz.

Dodawanie ochrony gałęzi

Skonfiguruj repozytorium Git, aby zapobiec bezpośrednim pushom do gałęzi głównej.

  1. W przeglądarce wybierz Ustawienia.

  2. Wybierz pozycję Gałęzie.

  3. Wybierz pozycję Dodaj regułę ochrony gałęzi.

    Zrzut ekranu witryny GitHub przedstawiający stronę dodawania reguł ochrony gałęzi z wyróżnionym przyciskiem dodawania reguły.

  4. W polu tekstowym Wzorzec nazwy gałęzi wprowadź main.

  5. Wybierz pozycję Wymagaj żądania ściągnięcia przed scaleniem.

    Wyczyść Wymagaj zatwierdzeń. Zwykle należy wybrać tę opcję. Jednak w tym przykładzie scalisz własny pull request, a opcja Wymagaj zatwierdzeń uniemożliwia ci to.

  6. Wybierz pozycję Nie zezwalaj na pomijanie powyższych ustawień.

    To ustawienie wybierasz jako przykład, aby pokazać, jak przejście z git push do main kończy się niepowodzeniem w dalszej części tego ćwiczenia. W środowisku produkcyjnym możesz nie chcieć ograniczać bezpośredniego scalania tylko do main dla administratorów lub właścicieli repozytoriów.

  7. W dolnej części strony wybierz Utwórz.

    Zrzut ekranu witryny GitHub przedstawiający przycisk Utwórz.

    Usługa GitHub może poprosić Cię o ponowne zalogowanie się w celu potwierdzenia tożsamości.

Dodaj zasady gałęzi

Skonfiguruj repozytorium Git, aby zapobiec bezpośrednim przesyłom do gałęzi głównej.

  1. W przeglądarce wejdź do Repozytoria>gałęzie.

  2. Najedź kursorem na główną gałąź i wybierz trzy kropki.

  3. Wybierz Zasady gałęzi.

    Zrzut ekranu usługi Azure DevOps przedstawiający listę gałęzi z wyświetlonym menu kontekstowym i wyróżnionym elementem menu zasad gałęzi.

  4. W oknie Zasady gałęzi zmień ustawienie Wymagaj minimalnej liczby recenzentów ustawić wartość W.

  5. Zmień minimalną liczbę recenzentów na 1, a następnie wybierz opcję Zezwalaj żądaniom na zatwierdzanie własnych zmian.

    Zrzut ekranu usługi Azure DevOps przedstawiający stronę zasad gałęzi dla głównej gałęzi.

    Notatka

    Tutaj włączasz opcję Zezwalaj wnioskodawcom na zatwierdzanie własnych zmian. W tych ćwiczeniach pracujesz samodzielnie, więc musisz utworzyć i zatwierdzić swoje zmiany. Jednak w rzeczywistym środowisku zespołowym możesz nie chcieć włączyć tej opcji.

Tworzenie lokalnej gałęzi funkcji

  1. W terminalu programu Visual Studio Code uruchom następującą instrukcję:

    git checkout -b add-orders-queue
    

    To polecenie tworzy nową gałąź funkcjonalności, z której będziesz pracować.

  2. Otwórz plik main.bicep w folderze deploy.

    Zrzut ekranu programu Visual Studio Code przedstawiający główny plik .bicep w folderze deploy.

  3. Poniżej parametrów dodaj nową zmienną dla nazwy kolejki:

    var storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS'
    var processOrderQueueName = 'processorder'
    
  4. W ramach zasobu konta magazynowego dodaj kolejkę jako zagnieżdżony zasób podrzędny.

    resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-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. W definicji modułu appService dodaj nazwy konta przechowywania i kolejki jako parametry.

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

    Ten kod umożliwia aplikacji znalezienie kolejki, w której będą wysyłane komunikaty.

  6. Zapisz plik main.bicep.

  7. Otwórz plik appService.bicep w folderze deploy/modules.

  8. W górnej części pliku appService.bicep dodaj nowe parametry dla konta magazynu i nazw kolejek:

    @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. Zaktualizuj zasób appServiceApp, aby przekazać nazwy konta przechowywania i kolejki do zmiennych środowiskowych aplikacji.

    resource appServiceApp 'Microsoft.Web/sites@2024-04-01' = {
      name: appServiceAppName
      location: location
      properties: {
        serverFarmId: appServicePlan.id
        httpsOnly: true
        siteConfig: {
          appSettings: [
            {
              name: 'StorageAccountName'
              value: storageAccountName
            }
            {
              name: 'ProcessOrderQueueName'
              value: processOrderQueueName
            }
          ]
        }
      }
    }
    

Zatwierdź i wypchnij gałąź funkcji

Zatwierdź zmiany i wypchnij je do repozytorium GitHub, uruchamiając następujące polecenia w terminalu programu Visual Studio Code:

Zatwierdź zmiany i wypchnij je do repozytorium usługi Azure Repos, uruchamiając następujące polecenia w terminalu programu Visual Studio Code:

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

Gałąź funkcjonalna jest wypychana do nowej gałęzi, również nazwanej add-orders-queue, w twoim repozytorium zdalnym.

Spróbuj scalić gałąź funkcji z gałęzią główną

Już wiesz, dlaczego nie zaleca się przesyłania bezpośrednio do gałęzi głównej. W tym miejscu spróbujesz złamać tę zasadę, aby zobaczyć, jak zabezpieczenia głównej gałęzi uniemożliwiają przypadkowe wypychanie zmian do chronionej gałęzi.

  1. W terminalu programu Visual Studio Code uruchom następujące instrukcje, aby przełączyć się do gałęzi głównej i scalić gałąź add-orders-queue z gałęzią.

    git checkout main
    git merge add-orders-queue
    

    Polecenie działało, ale scaliliśmy gałęzi add-orders-queue z gałęzią główną tylko w lokalnym repozytorium Git lokalnym.

  2. Uruchom następującą instrukcję, aby spróbować wypchnąć zmiany do usługi GitHub:

    git push
    

    Zwróć uwagę, że próba wypchnięcia kończy się niepowodzeniem z komunikatem o błędzie, który wygląda następująco:

    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'
    

    Komunikat o błędzie informuje o tym, że wypychania do gałęzi głównej nie są dozwolone i że należy użyć żądania ściągnięcia w celu zaktualizowania gałęzi.

  3. Cofnij scalanie, uruchamiając następującą instrukcję:

    git reset --hard HEAD~1
    

    To polecenie informuje lokalne repozytorium Git o zresetowaniu stanu gałęzi głównej do tego, co było przed scaleniem ostatniego zatwierdzenia, a nie zapisywania zmian. Gałąź add-orders-queue nie jest dotknięta.

Już wiesz, dlaczego nie zaleca się przekazywania bezpośrednio do gałęzi głównej. W tym miejscu spróbujesz złamać te wytyczne, aby zobaczyć, jak zasady gałęzi uniemożliwiają przypadkowe przesyłanie zmian do chronionej gałęzi.

  1. W terminalu programu Visual Studio Code uruchom następujące instrukcje, aby przełączyć się na gałąź główną i scalić z nią gałąź add-orders-queue .

    git checkout main
    git merge add-orders-queue
    

    Polecenie działało, ale scaliliśmy gałęzi add-orders-queue z gałęzią główną tylko w lokalnym repozytorium Git.

  2. Uruchom następującą instrukcję, aby spróbować wypchnąć zmiany do usługi Azure Repos:

    git push
    

    Zauważ, że Twój push kończy się niepowodzeniem z komunikatem o błędzie, który wygląda podobnie do tego:

    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'
    

    Komunikat o błędzie informuje o tym, że wypychania do gałęzi głównej nie są dozwolone i że należy użyć żądania ściągnięcia w celu zaktualizowania gałęzi.

  3. Cofnij scalanie, uruchamiając następującą instrukcję:

    git reset --hard HEAD~1
    

    To polecenie nakazuje lokalnemu repozytorium Git zresetowanie stanu gałęzi głównej do tego, co było przed scaleniem ostatniego zatwierdzenia, i nie zapisuje twoich zmian. Gałąź add-orders-queue nie jest dotknięta.