Esercizio - Proteggere il ramo principale

Completato

Il team sta lavorando a un modello Bicep che contiene già un sito Web e un database. Sono stati distribuiti i componenti nell'ambiente di produzione. È ora necessario aggiornare il modello Bicep per aggiungere la coda di elaborazione degli ordini.

In questo esercizio si creerà un ramo di funzionalità per la modifica. È anche possibile proteggere il ramo principale e consentire l'unione delle modifiche al ramo principale solo dopo che sono state esaminate. Prima è però necessario assicurarsi che l'ambiente sia configurato per completare il resto di questo modulo.

Durante il processo, si eseguiranno queste operazioni:

  • Configurare un repository GitHub per questo modulo.
  • Clonare il repository nel computer.
  • Aggiungere la protezione del ramo al ramo principale del repository.
  • Creare un ramo di funzionalità locale per la modifica.
  • Provare a unire il ramo di funzionalità in quello principale.
  • Configurare un progetto Azure DevOps per questo modulo.
  • Clonare il repository del progetto nel computer.
  • Aggiungere i criteri del ramo al ramo principale del repository.
  • Creare un ramo di funzionalità locale per la modifica.
  • Provare a unire il ramo di funzionalità in quello principale.

Ottenere il repository GitHub

In questa sezione ci si assicurerà che il repository GitHub sia configurato per completare il resto del modulo. Per configurarlo, creare un nuovo repository basato su un repository di modelli. Il repository di modelli contiene i file necessari per iniziare con questo modulo.

Iniziare dal repository dei modelli

Eseguire un modello che configura il repository GitHub.

Nel sito GitHub seguire questa procedura per creare un repository dal modello:

  1. Selezionare Usa questo modello>Crea un nuovo repository.

    Screenshot dell'interfaccia di GitHub che mostra il repository del modello, con evidenziato il pulsante per l'uso del modello corrente.

  2. Immettere un nome per il nuovo progetto, ad esempio toy-website-review.

  3. Selezionare l'opzione Public (Pubblico).

    Quando si creano repository personalizzati, è possibile renderli privati. In questo modulo si useranno funzionalità di GitHub che funzionano solo con repository pubblici e con account GitHub Enterprise.

  4. Selezionare Create repository from template (Crea repository da modello).

    Screenshot dell'interfaccia di GitHub che mostra la pagina di creazione del repository.

Ottenere il progetto Azure DevOps

In questa sezione, ci si assicura che l'organizzazione Azure DevOps sia pronta per completare il resto del modulo. Per la configurazione, eseguire un modello per la creazione di un progetto in Azure DevOps.

Nel sito Demo Generator di Azure DevOps seguire questa procedura:

  1. Selezionare Accedi e accettare le condizioni d’uso.

  2. Nella pagina Crea nuovo progetto selezionare l'organizzazione Azure DevOps. Immettere quindi un nome del progetto, ad esempio toy-website-review.

    Screenshot che mostra la creazione di un progetto tramite Azure DevOps Demo Generator.

  3. Selezionare Crea progetto.

    L'esecuzione del modello richiede qualche secondo. Così facendo si crea automaticamente una pipeline e un file Bicep che verranno usati negli esercizi successivi.

  4. Selezionare Passa al progetto per passare al progetto in Azure DevOps.

Clonare il repository

Ora si dispone di una copia del repository di modelli nel proprio account. Clonare questo repository in locale in modo da poter iniziare a usarlo.

  1. Selezionare Codice, quindi selezionare l'icona di copia.

    Screenshot dell'interfaccia di GitHub che mostra il nuovo repository con il pulsante di copia dell'URL del repository evidenziato.

  2. Aprire Visual Studio Code.

  3. Aprire una finestra del terminale di Visual Studio Code selezionando Terminale>Nuovo terminale. La finestra si apre in genere nella parte inferiore della schermata.

  4. Nel terminale passare alla directory nel computer locale, in cui si vuole clonare il repository GitHub. Ad esempio, per clonare il repository nella cartella toy-website-review, eseguire il comando seguente:

    cd toy-website-review
    
  5. Digitare git clone e incollare l'URL copiato in precedenza e quindi eseguire il comando. Il comando è simile al seguente:

    git clone https://github.com/mygithubuser/toy-website-review.git
    
  6. Riaprire Visual Studio Code nella cartella del repository eseguendo il comando seguente nel terminale di Visual Studio Code:

    code -r toy-website-review
    

Ora nell'account è presente un progetto. Clonare questo repository in locale in modo da poter iniziare a usarlo.

  1. Selezionare Repos>File.

    Screenshot di Azure DevOps che mostra il menu Repos con l'opzione File evidenziata.

  2. Selezionare Clona.

    Screenshot di Azure DevOps che mostra il repository con il pulsante Clona evidenziato.

  3. Se si usa macOS, è necessaria una password speciale per clonare il repository Git. Selezionare Genera credenziali Git e copiare il nome utente e la password visualizzati in una posizione sicura.

  4. Selezionare Clona in VS Code. Se viene richiesto di consentire l'apertura di Visual Studio Code, selezionare Apri.

    Screenshot di Azure DevOps che mostra le impostazioni del repository, con evidenziato il pulsante per la clonazione in Visual Studio Code.

  5. Creare una cartella da usare per il repository e quindi scegliere Seleziona il Percorso del Repository.

  6. Poiché si usa questo repository per la prima volta, viene chiesto di accedere.

    • Se si usa Windows, immettere le stesse credenziali usate per accedere ad Azure DevOps in questo esercizio.

    • Se si usa macOS, immettere il nome utente e la password Git generati qualche istante fa.

  7. Visual Studio Code richiede di aprire il repository. Selezionare Apri.

    Screenshot di Visual Studio Code che mostra la richiesta di aprire il repository clonato con il pulsante Apri evidenziato.

Aggiungere protezioni dei rami

Configurare il repository Git per impedire push diretti al ramo principale.

  1. Nel browser selezionare Impostazioni.

  2. Selezionare Rami.

  3. Selezionare Aggiungi regola di protezione ramo.

    Screenshot di GitHub che mostra la pagina per l'aggiunta delle regole di protezione dei rami, con evidenziato il pulsante per l'aggiunta di una regola.

  4. Nella casella di testo Modello nome ramo immettere main.

  5. Selezionare Require a pull request before merging (Richiedi una richiesta pull prima del merge).

    Deselezionare Require approvals (Richiedi approvazioni). In genere, è consigliabile selezionare questa opzione. In questo esempio, tuttavia, si esegue il merge della richiesta pull personalizzata e l'opzione Require approvals impedisce di farlo.

  6. Seleziona Non consentire il bypass delle impostazioni precedenti.

    Questa impostazione viene selezionata come esempio per mostrare come git push non riesce main più avanti in questo esercizio. In un ambiente di produzione potrebbe non essere necessario limitare i merge diretti a main per gli amministratori o i proprietari di repository.

  7. Nella parte inferiore della pagina selezionare Crea.

    Screenshot di GitHub che mostra il pulsante Create.

    GitHub potrebbe chiedere di eseguire di nuovo l'accesso per confermare l'identità.

Aggiungere criteri ramo

Configurare il repository Git per impedire push diretti al ramo principale.

  1. Nel browser passare a Repos>Rami.

  2. Passare il puntatore del mouse sul ramo principale e selezionare i tre punti.

  3. Selezionare Criteri ramo.

    Screenshot di Azure DevOps che mostra l'elenco di rami, con visualizzato il menu contestuale e la voce di menu per i criteri dei rami evidenziata.

  4. Nella finestra Criteri ramo modificare l'impostazione Richiedi un numero minimo di revisori su Attiva.

  5. Modificare il numero minimo di revisori su 1 e selezionare l'opzione Consenti ai richiedenti di approvare le proprie modifiche.

    Screenshot di Azure DevOps che mostra la pagina dei criteri dei rami per il ramo principale.

    Nota

    In questo caso, si abilita l'opzione Consenti ai richiedenti di approvare le proprie modifiche. In questi esercizi si sta lavorando autonomamente, quindi è necessario creare e approvare le modifiche. Tuttavia, in un ambiente del team reale, potrebbe non essere necessario abilitare questa opzione.

Creare un ramo di funzionalità locale

  1. Nel terminale di Visual Studio Code eseguire il comando seguente:

    git checkout -b add-orders-queue
    

    Questo comando crea un nuovo ramo di funzionalità da cui lavorare.

  2. Aprire il file main.bicep nella cartella deploy.

    Screenshot di Visual Studio Code che mostra il file con estensione Bicep principale nella cartella di distribuzione.

  3. Sotto i parametri aggiungere una nuova variabile per il nome della coda:

    var storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS'
    var processOrderQueueName = 'processorder'
    
  4. All'interno della risorsa dell'account di archiviazione aggiungere la coda come risorsa figlio annidata:

    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. Nella definizione del modulo appService aggiungere l'account di archiviazione e i nomi delle code come parametri:

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

    Questo codice consente all'applicazione di trovare la coda in cui invierà messaggi.

  6. Salvare il file main.bicep.

  7. Aprire il file appService.bicep nella cartella deploy/modules.

  8. Nella parte superiore del file appService.bicep aggiungere nuovi parametri per l'account di archiviazione e i nomi delle code:

    @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. Aggiornare la risorsa appServiceApp per propagare i nomi dell'account di archiviazione e delle code alle variabili di ambiente dell'applicazione:

    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
            }
          ]
        }
      }
    }
    

Eseguire il commit e il push del ramo di funzionalità

Eseguire il commit e il push delle modifiche nel repository GitHub eseguendo i comandi seguenti nel terminale di Visual Studio Code:

Eseguire il commit e il push delle modifiche nel repository Azure Repos eseguendo i comandi seguenti nel terminale di Visual Studio Code:

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

Viene eseguito il push del ramo di funzionalità in un nuovo ramo, denominato anche add-orders-queue, nel repository remoto.

Provare a eseguire il merge del ramo di funzionalità con quello principale

Si è appreso perché non è consigliabile eseguire il push direttamente nel ramo principale. In questo caso, si tenta di violare tale linea guida in modo da vedere come la protezione del ramo principale impedisce di eseguire accidentalmente il push delle modifiche in un ramo protetto.

  1. Nel terminale Visual Studio Code eseguire le istruzioni seguenti per passare al ramo principale e unire il ramo add-orders-queue in esso:

    git checkout main
    git merge add-orders-queue
    

    Il comando ha funzionato, ma il merge del ramo add-orders-queue nel ramo principale è stato eseguito solo nel repository Git locale.

  2. Eseguire l'istruzione seguente per provare a eseguire il push delle modifiche in GitHub:

    git push
    

    Nota che il push ha esito negativo con un messaggio di errore come questo:

    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'
    

    Il messaggio di errore indica che i push al ramo principale non sono consentiti e che è necessario usare una richiesta pull per aggiornare il ramo.

  3. Annullare il merge eseguendo l'istruzione seguente:

    git reset --hard HEAD~1
    

    Questo comando indica al repository Git locale di reimpostare lo stato del ramo principale a quello che era prima del merge dell'ultimo commit e di non salvare le modifiche. Il ramo add-orders-queue non è interessato.

Si è appreso perché non è consigliabile eseguire il push direttamente nel ramo principale. In questo caso, si tenta di violare tale linea guida in modo da vedere come i criteri del ramo impediscono di eseguire accidentalmente il push delle modifiche in un ramo protetto.

  1. Nel terminale Visual Studio Code eseguire le istruzioni seguenti per passare al ramo principale e unire il ramo add-orders-queue a esso:

    git checkout main
    git merge add-orders-queue
    

    Il comando ha funzionato, ma il merge del ramo add-orders-queue nel ramo principale è stato eseguito solo nel repository Git locale.

  2. Eseguire l'istruzione seguente per provare a eseguire il push delle modifiche in Azure Repos:

    git push
    

    Nota che il push ha esito negativo con un messaggio di errore come questo:

    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'
    

    Il messaggio di errore indica che i push al ramo principale non sono consentiti e che è necessario usare una richiesta pull per aggiornare il ramo.

  3. Annullare il merge eseguendo l'istruzione seguente:

    git reset --hard HEAD~1
    

    Questo comando indica al repository Git locale di reimpostare lo stato del ramo principale a quello che era prima del merge dell'ultimo commit e di non salvare le modifiche. Il ramo add-orders-queue non è interessato.