연습 - Azure DevOps 환경 설정

완료됨

이 단원에서는 Azure DevOps 조직이 이 모듈의 나머지 부분을 완료하도록 설정합니다. 또한 배포 대상인 Azure App Service 환경을 만듭니다.

목표를 달성하기 위해 다음을 수행합니다.

  • Azure DevOps에서 Azure 구독에 연결할 수 있는지 확인하기 위해 사용자를 추가합니다.
  • 이 모듈의 Azure DevOps 프로젝트를 설정합니다.
  • Azure Boards에서 이 모듈의 작업 항목을 Doing 열로 이동합니다.
  • 파이프라인에 변경 내용을 푸시할 수 있도록 프로젝트가 로컬로 설정되어 있는지 확인합니다.
  • Azure Cloud Shell에서 Azure CLI를 사용하여 Azure App Service 및 Azure Functions 앱을 만듭니다.
  • App Service 및 Azure Functions 인스턴스의 이름을 정의하는 파이프라인 변수를 만듭니다.
  • Azure Pipelines가 Azure 구독에 안전하게 액세스할 수 있게 지원하는 서비스 연결을 만듭니다.

Azure DevOps에 사용자 추가

이 모듈을 완료하려면 자체 Azure 구독이 필요합니다. Azure 평가판을 시작할 수 있습니다.

Azure DevOps로 작업하기 위해 Azure 구독이 필요하지는 않지만, 이 연습에서는 Azure DevOps를 사용하여 Azure 구독에 있는 Azure 리소스에 배포합니다. 프로세스를 간소화하려면 동일한 Microsoft 계정을 사용하여 Azure 구독과 Azure DevOps 조직에 모두 로그인합니다.

중요

다른 계정으로 로그인하는 경우 Azure에 로그인하는 데 사용하는 Microsoft 계정으로 DevOps 조직에 사용자를 추가해야 합니다. 자세한 내용은 조직 또는 프로젝트에 사용자 추가를 참조하세요. 사용자를 추가하는 경우 기본 액세스 수준을 선택합니다.

그런 다음 Azure DevOps에서 로그아웃하고 새 사용자 계정으로 로그인합니다. Azure 구독에 로그인하는 데 사용하는 Microsoft 계정을 사용합니다.

Azure DevOps 프로젝트 가져오기

여기서는 Azure DevOps 조직이 이 모듈의 나머지 부분을 완료하도록 설정합니다. Azure DevOps에서 프로젝트를 만드는 템플릿을 실행하면 됩니다.

이 학습 경로의 모듈은 DevOps 여정에서 Tailspin 웹 팀을 추적하는 전체 진행 과정을 구성하고 있습니다. 학습 목적을 위해 각 모듈에는 자체 Azure DevOps 프로젝트가 있습니다.

템플릿 실행

  1. 다음과 같이 Azure DevOps 조직을 설정하는 템플릿을 실행합니다.

  2. Azure DevOps 데모 생성기 사이트에서 로그인을 선택합니다. 메시지가 표시되면 사용 약관에 동의합니다. 새 프로젝트 만들기 페이지가 나타납니다.

  3. 새 프로젝트 만들기 페이지에서 Space Game - web - Azure Functions 같은 프로젝트 이름을 입력한 다음, 조직 선택에 대해 Azure 구독에 사용하는 조직을 선택합니다.

    프로젝트를 만드는 방법을 보여 주는 Azure DevOps Demo Generator 스크린샷.

  4. 다음 섹션에서 예, 이 리포지토리를 포크하겠습니다.를 선택하고 권한 부여를 선택합니다.

    창이 표시되면 GitHub 계정에 대한 액세스 권한을 부여합니다.

    중요

    템플릿이 GitHub 리포지토리에 연결되도록 하려면 이 포크 옵션을 사용하도록 설정해야 합니다. Space Game 웹 사이트 프로젝트를 이미 포크한 경우에도 이 옵션을 선택합니다. 템플릿에서 기존 포크를 사용합니다.

  5. Create Project를 선택합니다.

    템플릿을 실행하는 데 몇 분 정도 걸립니다.

  6. 프로젝트가 성공적으로 프로비저닝되면 프로젝트로 이동을 선택하여 Azure DevOps의 프로젝트로 이동합니다.

중요

이 모듈의 Azure DevOps 환경 정리 페이지에는 이 모듈을 완료하지 않더라도 반드시 완료해야 할 중요한 단계가 포함되어 있습니다. 환경을 정리하면 사용 가능한 빌드 시간을 늘릴 수 있습니다.

프로젝트의 표시 유형 설정

처음에는 GitHub의 Space Game 리포지토리 포크가 퍼블릭으로 설정되고 Azure DevOps 템플릿에서 만든 프로젝트는 프라이빗으로 설정됩니다. GitHub의 퍼블릭 리포지토리에는 누구나 액세스할 수 있으며, 프라이빗 리포지토리는 사용자와 공유하도록 선택한 사용자만 액세스할 수 있습니다. 마찬가지로 Azure DevOps에서 퍼블릭 프로젝트는 인증되지 않은 사용자에게 읽기 전용 액세스를 제공하는 반면, 프라이빗 프로젝트는 사용자에게 액세스 권한을 부여하고 서비스에 액세스하기 위해 인증을 받아야 합니다.

현재로서는 이 모듈의 목적을 위해 이러한 설정을 수정할 필요가 없습니다. 그러나 개인 프로젝트의 경우 다른 사용자에게 부여하려는 표시 유형 및 액세스를 결정해야 합니다. 예를 들어 프로젝트가 오픈 소스인 경우 GitHub 리포지토리와 Azure DevOps 프로젝트를 모두 퍼블릭 상태로 만들지 선택할 수 있습니다. 프로젝트가 재산적 가치를 가지는 경우 일반적으로 GitHub 리포지토리와 Azure DevOps 프로젝트를 모두 프라이빗 상태로 설정할 수 있습니다.

나중에 프로젝트에 가장 적합한 옵션을 결정하는 데 도움이 되는 다음과 같은 리소스를 찾을 수 있습니다.

작업 항목을 할당하고 이를 실행 중 상태로 이동

여기서는 Azure Boards에서 작업 항목을 자신에게 할당하고 작업 항목 상태를 실행 중으로 설정합니다. 실제로 개발자와 해당 팀은 각 ‘스프린트’를 시작하거나 반복 작업을 수행할 때 작업 항목을 만듭니다.

이 연습에서는 작업할 검사 목록을 만듭니다. 이 목록은 다른 팀 구성원에게 현재 수행 중인 작업과 남아 있는 작업량을 보여 줍니다. 또한 작업 항목은 WIP(진행 중인 작업) 제한을 적용하여 팀이 한 번에 너무 많은 작업을 수행하지 않도록 하는 데 도움이 됩니다.

  1. Azure DevOps에서 Boards 범주로 이동한 다음, 메뉴에서 Boards를 선택합니다.

    Boards 메뉴의 위치를 보여 주는 Azure DevOps

  2. 제목을 선택하여 Azure Functions 앱으로 순위표 API 리팩터링 작업 항목을 엽니다. 이 작업 항목을 자신에게 할당하고 저장 후 닫기를 선택합니다.

  3. 카드의 하단에 있는 아래쪽 화살표를 선택하고 실행 중 또는 카드를 선택하고 실행 중 열로 끌어서 놓습니다.

    아래쪽 화살표의 위치를 강조 표시한 작업 항목 카드의 스크린샷

  4. 작업 항목이 To Do 열에서 실행 중 열로 이동합니다.

    실행 중 열에 있는 작업 항목 카드를 강조 표시한 Azure Boards의 스크린샷

이 모듈의 끝부분에서 작업을 완료한 후 카드를 Done 열로 이동합니다.

Azure App Service 및 Azure Functions 환경 만들기

여기서는 사이트 및 API의 새 버전을 배포하는 데 필요한 App Service 및 Azure Functions 앱을 만듭니다.

Azure Pipelines를 사용하여 릴리스 파이프라인 만들기 학습 모듈에서는 Azure Portal을 통해 App Service를 가져왔습니다. 포털은 Azure에서 사용할 수 있는 항목을 검색하거나 기본 작업을 수행하는 데 좋은 방법이지만, App Service와 같은 구성 요소를 가져오는 것은 번거로울 수 있습니다.

이 모듈에서는 Azure CLI를 사용하여 App Service 인스턴스를 가져옵니다. 터미널에서 또는 Visual Studio Code를 통해 Azure CLI에 액세스할 수 있습니다. 여기서는 Azure Cloud Shell에서 Azure CLI에 액세스하겠습니다. 이 브라우저 기반 셸 환경은 클라우드에서 호스트됩니다. Cloud Shell에서 Azure CLI는 Azure 구독과 함께 사용하도록 구성됩니다.

중요

이 모듈의 연습을 완료하려면 자체 Azure 구독이 필요합니다.

Azure Portal을 통해 Cloud Shell 가져오기

  1. Azure Portal에 로그인합니다.

  2. 페이지 머리글의 전역 컨트롤에서 Cloud Shell을 선택합니다.

    Cloud Shell 메뉴 항목의 위치를 보여 주는 Azure Portal 스크린샷

    터미널이 열리고 Azure Cloud Shell에 연결됩니다.

  3. 필요한 경우 터미널 메뉴에서 Bash를 선택합니다.

    참고

    Cloud Shell에서 생성한 파일을 유지하려면 Cloud Shell에 Azure Storage 리소스가 필요합니다. Cloud Shell을 처음 열면 리소스 그룹, 스토리지 계정 및 Azure Files 공유를 만들라는 프롬프트가 표시됩니다. 해당 설정은 이후의 모든 Cloud Shell 세션에 자동으로 사용됩니다.

Azure 지역 선택

‘지역’은 지리적 위치 내에 있는 하나 이상의 Azure 데이터 센터입니다. 미국 동부, 미국 서부, 북유럽이 그 예입니다. App Service 인스턴스를 비롯한 모든 Azure 리소스에는 지역이 할당됩니다.

명령을 더 간편하게 실행하기 위해 먼저 기본 지역을 설정하겠습니다. 기본 지역을 지정하면 다른 지역을 지정할 때까지 명령에 해당 지역이 사용됩니다.

  1. Cloud Shell에서 다음 az account list-locations 명령을 실행하여 Azure 구독에서 사용할 수 있는 지역을 나열합니다.

    az account list-locations \
      --query "[].{Name: name, DisplayName: displayName}" \
      --output table
    
  2. 출력의 Name 열에서, 가까운 지역을 선택합니다. 예를 들어 eastasia 또는 westus2를 선택합니다.

  3. az configure를 실행하여 기본 지역을 설정합니다. <REGION>을 선택한 지역의 이름으로 바꿉니다.

    az configure --defaults location=<REGION>
    

    이 예에서는 westus2를 기본 지역으로 설정합니다.

    az configure --defaults location=westus2
    

Bash 변수 만들기

여기에서는 Bash 변수를 만들어 설정 프로세스의 편의성을 높이고 오류를 줄일 수 있도록 합니다. 공유 텍스트 문자열에 변수를 사용하면 실수로 인한 오타를 방지할 수 있습니다.

  1. Cloud Shell에서 난수를 생성합니다. 이 난수는 다음 단계에서 특정 서비스에 대해 전역적으로 고유한 이름을 만드는 데 사용됩니다.

    resourceSuffix=$RANDOM
    
  2. App Service, Azure Functions, 스토리지 계정에 대해 전역적으로 고유한 이름 3개를 만듭니다. 이러한 명령은 Bash에 인라인 구문을 사용하여 변수를 확인하도록 지시하는 큰따옴표를 사용합니다.

    webName="tailspin-space-game-web-${resourceSuffix}"
    leaderboardName="tailspin-space-game-leaderboard-${resourceSuffix}"
    storageName="tailspinspacegame${resourceSuffix}"
    
  3. 리소스 그룹 및 서비스 플랜의 이름을 저장할 Bash 변수를 2개 더 만듭니다.

    rgName='tailspin-space-game-rg'
    planName='tailspin-space-game-asp'
    

필요한 Azure 리소스 만들기

이 솔루션에는 배포를 위해 만들게 될 몇 가지 Azure 리소스가 필요합니다.

참고

이 연습에서는 인터넷에서 사이트에 액세스할 수 있도록 기본 네트워크 설정을 사용합니다. 실제로 자신과 자신의 팀만 액세스할 수 있는 네트워크에 웹 사이트를 배치하도록 Azure 가상 네트워크를 구성할 수 있습니다. 나중에 사용자가 웹 사이트를 사용할 수 있도록 가상 네트워크를 다시 구성할 수 있습니다.

  1. 다음과 같이 az group create 명령을 실행하여 앞에서 정의된 이름을 사용하여 리소스 그룹을 만듭니다.

    az group create --name $rgName
    
  2. 다음 az appservice plan create 명령을 실행하여 이전 작업에서 정의된 이름을 사용하여 App Service 요금제를 만듭니다.

    az appservice plan create \
      --name $planName \
      --resource-group $rgName \
      --sku B1 \
      --is-linux
    

    --sku 매개 변수는 B1 플랜을 지정합니다. B1 플랜은 기본 계층에서 실행됩니다. --is-linux 매개 변수는 Linux 작업자(이벤트 및 작업 예약에 사용되는 스레드)를 지정합니다.

    중요

    Azure 구독에서 B1 SKU를 사용할 수 없는 경우 S1(표준)과 같은 다른 플랜을 선택합니다.

  3. 다음 az webapp create 명령을 실행하여 App Service 인스턴스를 만듭니다.

    az webapp create \
      --name $webName \
      --resource-group $rgName \
      --plan $planName \
      --runtime "DOTNETCORE|6.0"
    
  4. Azure Functions에는 배포를 위한 스토리지 계정이 필요합니다. 다음 az storage account create 명령을 실행하여 스토리지 계정을 만듭니다.

    az storage account create \
      --name $storageName \
      --resource-group $rgName \
      --sku Standard_LRS
    
  5. 다음과 같이 az functionapp create 명령을 실행하여 Azure Functions 앱 인스턴스를 만듭니다. <region>을 원하는 지역으로 바꿉니다.

    az functionapp create \
      --name $leaderboardName \
      --resource-group $rgName \
      --storage-account $storageName \
      --functions-version 4 \
      --consumption-plan-location <region>
    
  6. 다음 az webapp list 명령을 실행하여 호스트 이름 및 App Service 인스턴트 상태를 나열합니다.

    az webapp list \
      --resource-group $rgName \
      --query "[].{hostName: defaultHostName, state: state}" \
      --output table
    

    실행 중인 서비스의 호스트 이름을 기록해 둡니다. 이는 다음과 유사해야 하지만, 난수 식별자는 다릅니다. 나중에 작업을 확인할 때 웹 호스트 이름이 필요합니다.

    HostName                                        State
    ----------------------------------------------  -------
    tailspin-space-game-web-4692.azurewebsites.net  Running
    
  7. 다음과 같이 az functionapp list 명령을 실행하여 Azure Functions 인스턴스의 호스트 이름 및 상태를 나열합니다.

    az functionapp list \
      --resource-group $rgName \
      --query "[].{hostName: defaultHostName, state: state}" \
      --output table
    

    실행 중인 서비스의 호스트 이름을 기록해 둡니다. 이는 다음과 유사해야 하지만, 난수 식별자는 다릅니다. 나중에 작업을 확인할 때 순위표 호스트 이름이 필요합니다.

    HostName                                                State
    ------------------------------------------------------  -------
    tailspin-space-game-leaderboard-4692.azurewebsites.net  Running
    
  8. 두 호스트 이름을 나중에 쉽게 액세스할 수 있는 위치에 복사합니다.

  9. 선택적 단계로, 브라우저를 열고 호스트 이름을 입력하여 실행 중인지 확인합니다. 기본 홈페이지가 표시됩니다.

중요

이 모듈의 Azure DevOps 환경 정리 페이지에는 중요한 정리 단계가 포함되어 있습니다. 또한 정리를 통해 이 모듈을 완료한 후 Azure 리소스에 대한 요금이 청구되지 않도록 할 수 있습니다. 정리 단계는 이 모듈을 완료하지 않은 경우에도 수행해야 합니다.

Azure Pipelines에서 파이프라인 변수 만들기

Azure Pipelines를 사용하여 릴리스 파이프라인 만들기 모듈에서는 App Service에 웹앱 이름을 저장하는 변수를 파이프라인에 추가했습니다. 여기서도 똑같이 합니다. 또한 Azure Functions 인스턴스의 순위표 앱 이름을 추가합니다.

파이프라인 구성에서 해당 이름을 하드 코딩할 수 있지만 이름을 변수로 정의하면 구성을 더 많이 재사용할 수 있습니다. 또한 인스턴스의 이름이 변경되는 경우 구성을 수정하지 않고도 변수를 업데이트하고 파이프라인을 트리거할 수 있습니다.

프로젝트에 변수 그룹을 추가해 보겠습니다.

  1. Azure DevOps에서 Space Game - web - Azure Functions 프로젝트가 열려 있어야 합니다.

  2. 메뉴에서 Pipelines를 선택한 다음, Pipelines 아래에서 라이브러리를 선택합니다. 라이브러리 창이 나타납니다.

    Pipelines 아래의 라이브러리 옵션을 강조 표시한 Azure DevOps 메뉴의 스크린샷

  3. 명령 모음 또는 창 가운데에서 변수 그룹을 선택합니다. 새 변수 그룹 페이지가 나타납니다.

  4. 변수 그룹 이름으로 Release를 입력합니다.

  5. 변수에서 추가를 선택합니다.

  6. 변수 이름에 WebAppName을 입력합니다. 웹앱용으로 만든 App Service 인스턴스의 이름(예: tailspin-space-game-web-4692)을 값으로 입력합니다.

    중요

    전체 호스트 이름이 아닌 App Service 인스턴스의 이름을 설정합니다. 예를 들어 이 연습에서 tailspin-space-game-web-4692는 호스트 이름 tailspin-space-game-web-4692.azurewebsites.net의 인스턴스 부분입니다.

  7. LeaderboardAppName이라는 또 다른 변수를 순위표 인스턴스의 값(예: tailspin-space-game-leaderboard-4692)과 함께 추가합니다.

  8. tailspin-space-game-rg 값을 사용하여 ResourceGroupName이라는 마지막 변수를 추가합니다.

  9. 페이지 상단에 있는 명령 모음에서 저장을 선택하여 Release 변수 그룹을 파이프라인에 저장합니다.

    변수 그룹의 변수는 다음과 유사해야 합니다.

    변수 그룹을 보여 주는 Azure Pipelines 스크린샷입니다. 이 그룹에는 세 개의 변수가 포함되어 있습니다.

스파이크 환경 만들기

이전 모듈에서는 개발, 테스트, 스테이징 환경을 만들었습니다. 여기서도 똑같이 합니다. 이번에는 스파이크라고 하는 환경을 만듭니다.

  1. Azure DevOps 메뉴의 Pipelines 아래에서 환경을 선택합니다.

    환경 메뉴 옵션의 위치를 보여 주는 Azure Pipelines 스크린샷.

  2. 환경 만들기를 선택합니다. 새 환경 창이 나타납니다.

  3. 이름spike를 입력합니다.

  4. 나머지 필드는 기본값으로 둡니다.

  5. 만들기를 선택합니다.

서비스 연결 만들기

여기서는 Azure Pipelines가 Azure 구독에 액세스할 수 있도록 지원하는 서비스 연결을 만듭니다. Azure Pipelines는 해당 서비스 연결을 사용하여 웹 사이트를 App Service에 배포합니다. 이전 모듈에서 유사한 서비스 연결을 만들었습니다.

중요

동일한 Microsoft 계정으로 Azure Portal과 Azure DevOps 모두에 로그인했는지 확인합니다.

  1. Azure DevOps의 Space Game - web - Azure Functions 파이프라인 프로젝트에 있는 메뉴 아래에서 프로젝트 설정을 선택합니다. 프로젝트 세부 정보 창이 나타납니다.

  2. Pipelines 아래에서 서비스 연결을 선택합니다.

  3. 서비스 연결 페이지에서 새 서비스 연결을 선택하고, 새 서비스 연결 창에서 Azure Resource Manager를 선택하고 다음을 선택합니다.

  4. 새 서비스 연결 창에서 [서비스 주체(자동)]를 선택하고 [다음]을 선택합니다.

  5. 새 Azure 서비스 연결 창에서 다음 설정을 선택하거나 입력합니다.

    필드
    범위 수준 구독
    Subscription Azure 구독 선택
    리소스 그룹 tailspin-space-game-rg
    서비스 연결 이름 Resource Manager - Tailspin - Space Game

    프로세스 중에 Microsoft 계정에 로그인하라는 프롬프트가 표시될 수 있습니다.

  6. Grant access permission to all pipelines가 선택되어 있는지 확인합니다.

  7. 저장을 선택합니다.

Azure DevOps가 테스트 연결을 수행하여 Azure 구독에 연결할 수 있는지 확인합니다. Azure DevOps가 연결할 수 없는 경우 다시 로그인할 수 있습니다.