Exercício – Proteger sua ramificação principal

Concluído

Sua equipe está trabalhando em um modelo Bicep que já contém um site e um banco de dados. Você implantou os componentes em seu ambiente de produção. Agora, você precisa atualizar seu modelo Bicep para adicionar a fila de processamento de pedidos.

Neste exercício, você criará uma ramificação de recurso para sua alteração. Você também protegerá a ramificação principal e permitirá que as alterações sejam mescladas somente à ramificação principal após terem sido revisadas. No entanto, antes disso, verifique se o ambiente está configurado para concluir o restante deste módulo.

Durante o processo, você vai:

  • Configure um repositório GitHub para este módulo.
  • Clone o repositório para o seu computador.
  • Adicione a proteção de ramificação à ramificação principal do repositório.
  • Crie uma ramificação de recurso local para sua alteração.
  • Tente mesclar à ramificação de recursos à principal.
  • Configure um projeto do Azure DevOps para este módulo.
  • Clonar o repositório do projeto no computador.
  • Adicione políticas de ramificação à ramificação principal do repositório.
  • Crie uma ramificação de recurso local para sua alteração.
  • Tente mesclar à ramificação de recursos à principal.

Obter o repositório GitHub

Aqui, você se certifica de que o repositório GitHub está configurado para concluir o restante deste módulo. Você o configura criando um repositório com base em outro de modelo. O repositório de modelo contém os arquivos necessários para prosseguir neste módulo.

Começar com o repositório de modelo

Execute um modelo que configura seu repositório GitHub.

No site do GitHub, siga estas etapas para criar um repositório com base no modelo:

  1. Selecione Usar este modelo>Criar um repositório.

    Captura de tela da interface do GitHub que mostra o repositório de modelos, com o botão para usar o modelo atual realçado.

  2. Digite um nome para seu novo projeto, como toy-website-review.

  3. Selecione a opção Público.

    Ao criar seus repositórios, você pode querer torná-los privados. Neste módulo, você trabalhará com recursos do GitHub que funcionam somente com repositórios públicos e contas do GitHub Enterprise.

  4. Selecione Criar repositório com base no modelo.

    Captura de tela da interface do GitHub que mostra a página de criação do repositório.

Obter o projeto do Azure DevOps

Aqui, você verificará se a sua organização do Azure DevOps está preparada para concluir o restante deste módulo. Você a prepara executando um modelo que cria um projeto no Azure DevOps.

No site Gerador de Demonstração do Azure DevOps, siga estas etapas:

  1. Selecione Sign In e aceite os termos de uso.

  2. Na página Create New Project, selecione a sua organização do Azure DevOps. Insira um nome de projeto, como toy-website-review.

    Captura de tela que mostra a criação de um projeto por meio do Gerador de Demonstração do Azure DevOps.

  3. Selecione Create Project.

    O modelo leva alguns minutos para ser executado. Ele cria automaticamente um pipeline e um arquivo Bicep que você usará em exercícios posteriores.

  4. Selecione Navigate to project para acessar o seu projeto no Azure DevOps.

Clonar o repositório

Agora você tem uma cópia do repositório de modelo na sua conta. Clone este repositório localmente para começar a trabalhar nele.

  1. Selecione Código e escolha o ícone de Copiar.

    Captura de tela da interface do GitHub mostrando o novo repositório, com o botão de cópia de URL do repositório realçado.

  2. Abra o Visual Studio Code.

  3. Abra uma janela do terminal do Visual Studio Code selecionando Terminal>Novo Terminal. Geralmente, a janela é aberta na parte inferior da tela.

  4. No terminal, vá para o diretório em que você deseja clonar o repositório do GitHub no computador local. Por exemplo, para clonar o repositório para a pasta toy-website-review, execute o seguinte comando:

    cd toy-website-review
    
  5. Digite git clone, cole a URL que você copiou anteriormente e execute o comando. O comando se parece com o seguinte:

    git clone https://github.com/mygithubuser/toy-website-review.git
    
  6. Reabra o Visual Studio Code na pasta do repositório executando o seguinte comando no terminal do Visual Studio Code:

    code -r toy-website-review
    

Agora você tem um projeto em sua conta. Clone este repositório localmente para começar a trabalhar nele.

  1. Selecione Repos>Arquivos.

    Captura de tela do Azure DevOps que mostra o menu Repos, com a opção Arquivos realçada.

  2. Selecione Clonar.

    Captura de tela do Azure DevOps que mostra o repositório, com o botão Clonar realçado.

  3. Se você estiver usando o macOS, precisará de uma senha especial para clonar o repositório Git. Selecione Gerar credenciais do Git e copie o nome de usuário e a senha exibidos para um local seguro.

  4. Selecione Clonar no VS Code. Se um prompt aparecer solicitando a abertura do Visual Studio Code, selecione Abrir.

    Captura de tela do Azure DevOps que mostra as configurações do repositório, com o botão para clonagem Visual Studio Code realçado.

  5. Crie uma pasta a ser usada para o repositório e escolha Selecionar Local do Repositório.

  6. Você está usando esse repositório pela primeira vez, portanto, será solicitado que você entre.

    • Se estiver usando Windows, insira as mesmas credenciais que usou para entrar no Azure DevOps anteriormente neste exercício.

    • Se você estiver usando o macOS, insira o nome de usuário e a senha do Git que você gerou há alguns instantes.

  7. O Visual Studio Code solicita que você abra o repositório. Selecione Abrir.

    Captura de tela do Visual Studio Code que mostra um prompt para abrir o repositório clonado com o botão Abrir realçado.

Adicionar proteções de ramificação

Configure seu repositório Git para impedir envios diretos para a ramificação principal.

  1. No navegador, selecione Configurações.

  2. Selecione Ramificações.

  3. Selecione Adicionar regra de proteção de branch.

    Captura de tela do GitHub que mostra a página para adicionar regras de proteção de branch, com o botão para adicionar uma regra realçado.

  4. Na caixa de texto Padrão do nome da ramificação, insira principal.

  5. Selecione Exigir uma solicitação de pull antes de mesclar.

    Desmarque Exigir aprovações. Normalmente, você selecionaria essa opção. Mas neste exemplo você mesclará sua própria solicitação de pull e a opção Exigir aprovações impedirá isso.

  6. Selecione Não permitir ignorar as configurações acima.

    Você seleciona essa configuração como um exemplo para mostrar como git push para main falha posteriormente neste exercício. Em um ambiente de produção, talvez você não queira restringir mesclagens diretas para main para administradores ou proprietários de repositórios.

  7. Na parte inferior da página, selecione Criar.

    Captura de tela do GitHub que mostra o botão Criar.

    O GitHub pode solicitar que você entre novamente para confirmar sua identidade.

Adicionar políticas de ramificação

Configure seu repositório Git para impedir envios diretos para a ramificação principal.

  1. No navegador, acesse Repositório>Ramificações.

  2. Passe o mouse sobre a ramificação principal e selecione os três pontos.

  3. Selecione Políticas de ramificação.

    Captura de tela do Azure DevOps que mostra a lista de branches, com o menu de contexto exibido e o item de menu para políticas de branch realçados.

  4. Na janela Políticas de ramificação, altere a configuração Exigir um número mínimo de revisores para Ativado.

  5. Altere o número mínimo de revisores para 1 e selecione a opção Permitir que os solicitantes aprovem suas próprias alterações.

    Captura de tela do Azure DevOps que mostra a página de políticas do branch principal.

    Observação

    Aqui, você habilita a opção Permitir que os solicitantes aprovem suas próprias alterações. Nestes exercícios, você trabalhará por conta própria. Portanto, precisa criar e aprovar suas alterações. Mas em um ambiente de equipe real, talvez você não queira habilitar essa opção.

Criar uma ramificação de recurso local

  1. No terminal do Visual Studio Code, execute a seguinte instrução:

    git checkout -b add-orders-queue
    

    Este comando cria uma nova ramificação de recursos para você trabalhar.

  2. Abra o arquivo main.bicep na pasta deploy.

    Captura de tela do Visual Studio Code que mostra o arquivo .bicep principal na pasta de implantação.

  3. Abaixo dos parâmetros, adicione uma nova variável para o nome da fila:

    var storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS'
    var processOrderQueueName = 'processorder'
    
  4. No recurso da conta de armazenamento, adicione a fila como um recurso filho aninhado:

    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. Na definição do módulo appService, adicione os nomes da conta de armazenamento e da fila como parâmetros:

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

    Esse código permite que o aplicativo encontre a fila para a qual ele enviará mensagens.

  6. Salve o arquivo main.bicep.

  7. Abra o arquivo appService.bicep na pasta deploy/modules.

  8. Próximo à parte superior do arquivo appService.bicep, adicione novos parâmetros para os nomes da conta de armazenamento e da fila:

    @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. Atualize o recurso appServiceApp para propagar os nomes da conta de armazenamento e da fila para as variáveis de ambiente do aplicativo:

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

Confirmar e efetuar push da sua ramificação do recurso

Faça commit e efetue push das alterações no repositório GitHub executando os seguintes comandos no terminal do Visual Studio Code:

Faça commit e efetue push das alterações no repositório do Azure Repos executando os seguintes comandos no terminal do Visual Studio Code:

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

O branch de recursos é enviado para uma nova ramificação, também chamado add-orders-queue, em seu repositório remoto.

Tente mesclar a ramificação de recursos com a principal

Você aprendeu por que não é aconselhável fazer push diretamente para a ramificação principal. Aqui, você tenta dividir essa diretriz para ver como a proteção da ramificação principal impede que você envie por push acidentalmente as alterações para uma ramificação protegida.

  1. No terminal do Visual Studio Code, execute as seguintes instruções para alternar para a ramificação principal e mesclar a ramificação add-orders-queue nele:

    git checkout main
    git merge add-orders-queue
    

    O comando funcionou, mas você mesclou a ramificação add-orders-queue em sua ramificação principal apenas no repositório Git local.

  2. Execute a seguinte instrução para tentar fazer push das alterações para GitHub:

    git push
    

    Observe que o push falha com uma mensagem de erro semelhante a esta:

    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'
    

    A mensagem de erro informa que os pushes para a ramificação principal não são permitidos e que você deve usar uma solicitação de pull para atualizar a ramificação.

  3. Desfaça a mesclagem executando a seguinte instrução:

    git reset --hard HEAD~1
    

    Esse comando informa ao repositório Git local para redefinir o estado da ramificação principal para o que era antes da última confirmação ser mesclada e não para salvar as alterações. A ramificação add-orders-queue não é afetada.

Você aprendeu por que não é aconselhável fazer push diretamente para a ramificação principal. Aqui, você tenta dividir essa diretriz para ver como as políticas de ramificação impedem que você envie por push acidentalmente as alterações para uma ramificação protegida.

  1. No terminal do Visual Studio Code, execute as seguintes instruções para alternar para a ramificação principal e mesclar a ramificação add-orders-queue nele:

    git checkout main
    git merge add-orders-queue
    

    O comando funcionou, mas você mesclou a ramificação add-orders-queue em sua ramificação principal apenas no repositório Git local.

  2. Execute a seguinte instrução para tentar fazer push das alterações para Azure Repos:

    git push
    

    Observe que o push falha com uma mensagem de erro semelhante a esta:

    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'
    

    A mensagem de erro informa que os pushes para a ramificação principal não são permitidos e que você deve usar uma solicitação de pull para atualizar a ramificação.

  3. Desfaça a mesclagem executando a seguinte instrução:

    git reset --hard HEAD~1
    

    Esse comando informa ao repositório Git local para redefinir o estado da ramificação principal para o que era antes da última confirmação ser mesclada e não para salvar as alterações. A ramificação add-orders-queue não é afetada.