연습 - 기본 분기 보호

완료됨

팀은 이미 웹 사이트 및 데이터베이스가 포함된 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-website-review)을 입력합니다.

    Azure DevOps 데모 생성기를 통해 프로젝트를 만드는 방법을 보여 주는 스크린샷

  3. Create Project를 선택합니다.

    템플릿을 실행하는 데 몇 분 정도 걸립니다. 이후 연습에서 사용할 파이프라인 및 Bicep 파일을 자동으로 만듭니다.

  4. Navigate to project를 선택하여 Azure DevOps의 해당 프로젝트로 이동합니다.

리포지토리 복제

이제 사용자 계정에 템플릿 리포지토리의 복사본이 있습니다. 작업을 시작할 수 있도록 이 리포지토리를 로컬로 복제합니다.

  1. 코드를 선택하고 복사 아이콘을 선택합니다.

    리포지토리 URL 복사 단추가 강조 표시된 새 리포지토리를 보여주는 GitHub 인터페이스의 스크린샷

  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를 열 수 있도록 허용하라는 메시지가 표시되면 열기를 선택하세요.

    Visual Studio Code의 복제 단추가 강조 표시된, 리포지토리 설정을 보여 주는 Azure DevOps 스크린샷

  5. 리포지토리에 사용할 폴더를 만들고 리포지토리 위치 선택을 선택합니다.

  6. 처음으로 이 리포지토리를 사용하는 것이므로 로그인하라는 메시지가 표시됩니다.

    • Windows를 사용하는 경우 이 연습의 앞부분에서 Azure DevOps 로그인할 때 사용한 것과 동일한 자격 증명을 입력합니다.

    • macOS를 사용하는 경우 방금 전에 생성한 Git 사용자 이름 및 암호를 입력합니다.

  7. Visual Studio Code가 리포지토리를 열라는 메시지를 표시합니다. 열기를 선택합니다.

    복제된 리포지토리를 열라는 메시지가 표시되고 열기 단추가 강조 표시된 Visual Studio Code의 스크린샷

분기 보호 추가

기본 분기로 직접 푸시를 방지하도록 Git 리포지토리를 구성합니다.

  1. 브라우저에서 설정을 선택합니다.

  2. 분기를 선택합니다.

  3. 분기 보호 규칙 추가를 선택합니다.

    강조 표시된 규칙을 추가하는 단추를 사용하여 분기 보호 규칙을 추가하는 페이지를 보여주는 GitHub의 스크린샷

  4. 분기 이름 패턴 텍스트 상자에 기본을 입력합니다.

  5. 병합 전 끌어오기 요청 검토 필요를 선택합니다.

    승인 필요를 선택 취소합니다. 일반적으로는 이 옵션을 선택합니다. 그러나 이 예제에서는 자신의 끌어오기 요청을 병합해야 하는데 승인 필요 옵션을 사용하면 이렇게 할 수 없습니다.

  6. 위의 설정 무시를 허용하지 않음을 선택합니다.

    이후 연습에서 git pushmain에 대해 어떻게 실패하는지 보여주는 예제로 이 설정을 선택합니다. 프로덕션 환경에서는 관리자 또는 리포지토리 소유자에 대해 직접 병합을 main으로 제한하지 않는 것이 좋을 수 있습니다.

  7. 페이지 맨 아래에서 만들기를 선택합니다.

    만들기 단추를 보여주는 GitHub의 스크린샷

    GitHub ID에서 ID를 확인하기 위해 다시 로그인하도록 요청할 수 있습니다.

분기 정책 추가

기본 분기로 직접 푸시를 방지하도록 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’ 파일을 엽니다.

    배포 폴더에 기본 dot bicep 파일을 보여주는 Visual Studio Code의 스크린샷

  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 터미널에서 다음 명령을 실행하여 변경 내용을 커밋하고 Azure Repos 리포지토리에 푸시합니다.

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 분기는 영향을 받지 않습니다.