연습 - Azure에서 실행되는 빌드 에이전트 만들기

완료됨

이 단원에서는 Microsoft Azure Pipelines에서 사용할 수 있는 빌드 에이전트를 구성하기 위해 Microsoft Azure에서 실행되는 가상 머신을 사용합니다. 이 모듈을 진행하는 동안 사용할 수 있는 가상 머신을 제공해 드립니다.

이 단원에서 학습할 내용은 다음과 같습니다.

  • Azure에서 빌드 에이전트 역할을 할 Ubuntu 가상 머신을 만듭니다.
  • Microsoft Azure DevOps에서 에이전트 풀을 만듭니다.
  • Azure DevOps에 에이전트를 인증할 액세스 토큰을 만듭니다.
  • Space Game 웹 사이트를 빌드하는 데 필요한 소프트웨어를 사용하여 에이전트를 구성합니다.
  • Azure DevOps에 연결하도록 에이전트를 구성합니다. 그러면 에이전트가 빌드 작업을 수신할 수 있습니다.
  • 에이전트가 Azure DevOps에 연결되어 있고 빌드 작업을 수신할 준비가 되었는지 확인합니다.

Azure에서 가상 머신을 만드는 방법은 여러 가지가 있습니다. 이 단원에서는 Cloud Shell이라고 하는 대화형 터미널을 사용하여 Ubuntu 가상 머신을 만듭니다.

VM을 구성하는 몇 가지 옵션이 있습니다.

  • Linux VM의 경우 SSH를 통해 직접 연결하고 대화형으로 시스템을 구성할 수 있습니다.
  • ARM 템플릿, Bicep 또는 기타 자동화된 프로비저닝 도구를 사용하여 배포를 자동화할 수 있습니다.
  • 여러 빌드 에이전트를 배포해야 하는 경우 모든 소프트웨어가 미리 설치되어 있는 VM 이미지를 만들면 됩니다.

대화형으로 시스템을 구성하면 프로세스가 어떻게 진행되고 무엇이 필요한지 이해할 수 있으므로 새로 시작하는 분들에게 좋은 방법입니다. 프로세스를 간소화하기 위해 여기서는 SSH를 통해 Ubuntu VM에 연결하고 셸 스크립트를 실행하여 빌드 에이전트를 설정하겠습니다.

참고

Linux 시스템에 연결하거나 구성하는 방법을 잘 모르는 경우 안내를 따르면 됩니다. Windows 빌드 에이전트에도 동일한 개념을 적용할 수 있습니다.

Linux 가상 머신 만들기

이 섹션에서는 빌드 에이전트로 사용할 Ubuntu 20.04를 실행하는 VM을 만들어 봅니다. 해당 VM은 아직 빌드 에이전트가 되도록 설정되지 않았거나 Space Game 웹 애플리케이션을 빌드하는 데 필요한 도구가 없습니다. 잠시 후 설정할 것입니다.

Azure Portal을 통해 Cloud Shell 가져오기

중요

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

  1. Azure Portal로 이동하고 로그인합니다.

  2. 메뉴에서 Cloud Shell을 선택합니다. 프롬프트가 표시되면 Bash 환경을 선택합니다.

    A screenshot of the Azure portal showing the location of the Cloud Shell menu item.

    참고 항목

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

Azure 지역 선택

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

명령을 더 간편하게 실행하려면 먼저 기본 지역을 선택합니다. 기본 지역을 지정하면 다른 지역을 지정하지 않는 한 이후의 명령은 해당 지역을 사용합니다.

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

    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
    

리소스 그룹 만들기

이 학습 모듈에 사용되는 리소스를 포함할 리소스 그룹을 만듭니다.

  • tailspin-space-game-rg라는 리소스 그룹을 만들려면 다음 az group create 명령을 실행합니다.

    az group create --name tailspin-space-game-rg
    

VM 만들기

VM을 만들려면 다음 az vm create 명령을 실행합니다.

az vm create \
    --name MyLinuxAgent \
    --resource-group tailspin-space-game-rg \
    --image canonical:0001-com-ubuntu-server-focal:20_04-lts:latest \
    --size Standard_DS2_v2 \
    --admin-username azureuser \
    --generate-ssh-keys

VM이 생성되는 데 몇 분 정도 걸릴 수 있습니다.

Standard_DS2_v2는 VM 크기를 지정합니다. VM의 크기는 프로세서 속도, 메모리 양, 초기 스토리지 양, 예상 네트워크 대역폭을 정의합니다. Microsoft 호스팅 에이전트에서 제공하는 것과 크기가 같습니다. 실제로 더 많은 컴퓨팅 성능 또는 그래픽 처리 같은 추가 기능을 제공하는 크기를 선택할 수 있습니다.

--resource-group 인수는 우리가 만들어야 하는 모든 것을 보유하고 있는 리소스 그룹을 지정합니다. 리소스 그룹을 사용하면 모든 VM, 디스크, 네트워크 인터페이스 및 하나의 단위로써 솔루션을 구성하는 기타 요소를 관리할 수 있습니다.

에이전트 풀 만들기

에이전트 풀은 빌드 에이전트를 구성합니다. 이 섹션에서는 Azure DevOps에서 에이전트 풀을 만듭니다. 나중에 에이전트를 구성할 때 에이전트가 자신을 올바른 풀에 등록할 수 있도록 에이전트 풀의 이름을 지정할 것입니다.

  1. Azure DevOps에서 Space Game - web - Agent 프로젝트로 이동합니다.

  2. 프로젝트 설정을 선택합니다.

  3. 파이프라인 아래에서 에이전트 풀을 선택합니다.

    A screenshot of the project settings in Azure DevOps showing the location of the Agent pools menu item.

  4. 풀 추가를 선택합니다.

  5. 풀 추가 창에서 다음을 수행합니다.

    1. 연결할 풀에서 새로 만들기를 선택합니다.
    2. 풀 유형에서 자체 호스트를 선택합니다.
    3. 이름MyAgentPool을 입력합니다.

    실제로는 풀에 대해 더 설명적인 이름을 선택합니다.

  6. 만들기를 실행합니다. 목록에 새 에이전트 풀이 나타납니다.

개인용 액세스 토큰 만들기

빌드 에이전트가 자신을 Azure DevOps에 등록하려면 빌드 에이전트가 자신을 인증하는 방법이 필요합니다.

이를 위해 개인용 액세스 토큰을 만들 수 있습니다. 개인용 액세스 토큰(또는 PAT)은 암호에 대한 대안입니다. PAT를 사용하면 Azure DevOps와 같은 서비스를 통해 인증할 수 있습니다.

중요

암호를 사용할 때와 마찬가지로 액세스 토큰을 안전한 곳에 보관해야 합니다. 이 섹션에서는 액세스 토큰이 셸 스크립트에 나타나지 않도록 액세스 토큰을 환경 변수로 저장합니다.

  1. Azure DevOps에서 프로필 설정을 열고 개인용 액세스 토큰을 선택합니다.

    A screenshot of Azure DevOps showing the location of the Personal access tokens menu item.

  2. 새 토큰을 선택합니다.

  3. 토큰 이름을 입력합니다(예: 빌드 에이전트).

  4. 범위 아래 하단에 있는 모든 범위 표시 링크를 선택합니다.

  5. 에이전트 풀을 찾은 다음 읽기 및 관리를 선택합니다.

  6. 만들기를 실행합니다.

  7. 안전한 곳에 토큰을 복사합니다.

    잠시 후 토큰을 사용하여 빌드 에이전트가 Azure Pipelines에 대한 액세스를 인증하도록 설정할 것입니다.

VM에 연결

이 섹션에서는 구성할 수 있도록 SSH를 통해 Linux VM에 연결합니다.

아시겠지만, Microsoft 호스팅 에이전트에는 대화형으로 로그인할 수 없습니다. 프라이빗 빌드 에이전트는 개발자 소유이므로 개발자가 원하는 대로 로그인하여 구성할 수 있습니다.

빌드 에이전트에 연결하는 기능을 사용하면 소프트웨어를 빌드하는 데 필요한 도구로 이를 구성할 수 있습니다. 또한 파이프라인 구성을 빌드할 때 발생하는 문제를 해결할 수도 있습니다.

  1. VM의 IP 주소를 가져오려면 Cloud Shell에서 az vm show를 실행합니다.

    IPADDRESS=$(az vm show \
      --name MyLinuxAgent \
      --resource-group tailspin-space-game-rg \
      --show-details \
      --query [publicIps] \
      --output tsv)
    

    이 명령은 Bash 변수 IPADDRESS에 IP 주소를 저장합니다.

  2. VM의 IP 주소를 콘솔에 출력합니다.

    echo $IPADDRESS
    
  3. VM에 대한 SSH 연결을 만듭니다. $IPADDRESS 대신 이전 단계에서 받은 IP 주소를 입력합니다. 프롬프트가 표시되면 yes를 입력하여 연결을 계속합니다.

    ssh azureuser@$IPADDRESS
    

    이제 SSH를 통해 VM에 연결되었습니다.

    앞에서 az vm create 명령을 실행할 때 --generate-ssh-keys 옵션을 제공했기 때문에 이 명령이 작동하는 것입니다. 이 옵션은 VM에 로그인할 수 있도록 SSH 키 쌍을 만듭니다.

VM에 빌드 도구 설치

이 섹션에서는 Space Game 웹 사이트를 빌드하는 데 필요한 도구를 사용하여 VM을 구성합니다.

기존 빌드 프로세스에서는 다음 도구를 사용합니다.

  • 애플리케이션을 빌드하는 데 사용되는 .NET SDK
  • 빌드 작업을 수행하는 데 사용되는 Node.js
  • Node.js용 패키지 관리자인 npm
  • JavaScript와 CSS 파일을 축소하는 데 사용되는 Node.js 패키지인 gulp

위 도구는 빌드 프로세스에 필요한 기본 도구입니다. 이를 설치하려면 GitHub에서 셸 스크립트를 다운로드하여 실행합니다.

참고 항목

빌드 프로세스에서는 Sass(.scss) 파일을 CSS(.css) 파일로 변환하는 node-sass 같은 다른 도구를 사용합니다. 그러나 Node.js는 빌드가 실행될 때 이러한 도구를 설치합니다.

먼저 Ubuntu의 패키지 관리자인 apt부터 업데이트하여 시작하겠습니다. 이 작업을 통해 패키지 리포지토리의 최신 정보를 페치할 수 있으며, 일반적으로 새 Ubuntu 시스템을 설정할 때 업데이트를 가장 먼저 진행합니다.

  1. SSH 연결에서 apt 패키지 관리자 캐시 업데이트:

    sudo apt-get update
    

    sudo는 관리자 또는 루트 권한으로 명령을 실행합니다.

  2. GitHub에서 build-tools.sh라는 셸 스크립트를 다운로드하려면 다음 curl 명령을 실행합니다.

    curl https://raw.githubusercontent.com/MicrosoftDocs/mslearn-tailspin-spacegame-web/main/.agent-tools/build-tools.sh > build-tools.sh
    
  3. 콘텐츠를 검사할 수 있도록 터미널에 스크립트 인쇄:

    cat build-tools.sh
    

    다음 결과가 표시됩니다.

    #!/bin/bash
    set -e
    
    # Select a default .NET version if one is not specified
    if [ -z "$DOTNET_VERSION" ]; then
      DOTNET_VERSION=6.0.300
    fi
    
    # Add the Node.js PPA so that we can install the latest version
    curl -sL https://deb.nodesource.com/setup_16.x | bash -
    
    # Install Node.js and jq
    apt-get install -y nodejs
    
    apt-get install -y jq
    
    # Install gulp
    npm install -g gulp
    
    # Change ownership of the .npm directory to the sudo (non-root) user
    chown -R $SUDO_USER ~/.npm
    
    # Install .NET as the sudo (non-root) user
    sudo -i -u $SUDO_USER bash << EOF
    curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin -c LTS -v $DOTNET_VERSION
    EOF
    

    이 스크립트가 Node.js, npm, gulp, .NET Core를 설치합니다.

    DOTNET_VERSION 환경 변수를 설정하여 설치할 .NET 버전을 지정할 수 있습니다. 이 변수를 설정하지 않으면 스크립트는 기존 빌드 구성에서 사용하는 버전을 설치합니다. 학습을 위해서는 이 변수를 설정하지 않습니다. 스크립트에서 기본 버전을 사용하도록 허용합니다.

  4. 스크립트를 실행 가능하게 만든 다음 스크립트를 실행합니다.

    chmod u+x build-tools.sh
    sudo ./build-tools.sh
    

    이 스크립트를 실행하는 데 몇 분 정도 걸립니다.

    이제 각 소프트웨어 구성 요소가 성공적으로 설치되었는지 확인하는 명령을 실행할 수 있습니다.

VM에 에이전트 소프트웨어 설치

이제 VM에 에이전트 소프트웨어를 설치할 차례입니다. 이 소프트웨어는 VM이 빌드 에이전트 역할을 수행하고 Azure Pipelines에서 빌드 작업을 수신할 수 있게 해줍니다.

등록 프로세스에서는 설치된 소프트웨어를 검사한 후 에이전트를 Azure Pipelines에 등록합니다. 따라서 다른 모든 소프트웨어를 설치한 후 에이전트를 설정해야 합니다. 추가 소프트웨어를 설치해야 하는 경우 에이전트를 두 번째로 설치할 수 있습니다.

이 설명서에서는 자체 호스팅 Linux 에이전트뿐 아니라 macOS와 Windows 에이전트를 수동으로 설치하는 방법을 설명합니다. 이전 섹션에서 빌드 도구를 설정한 것과 거의 동일한 방식으로 셸 스크립트를 실행하여 에이전트를 구성합니다.

Important

여기서 실행할 스크립트는 학습용입니다. 실제로 여기서 빌드하는 스크립트의 각 명령이 전체 시스템에 미치는 영향을 먼저 이해해야 합니다. 이 모듈의 마지막 부분에서는 여러분이 선택할 수 있는 옵션을 더욱 자세히 설명하는 설명서를 알려드리겠습니다.

  1. GitHub에서 build-agent.sh라는 셸 스크립트를 다운로드하려면 다음 curl 명령을 실행합니다.

    curl https://raw.githubusercontent.com/MicrosoftDocs/mslearn-tailspin-spacegame-web/main/.agent-tools/build-agent.sh > build-agent.sh
    
  2. 콘텐츠를 검사할 수 있도록 터미널에 스크립트 인쇄:

    cat build-agent.sh
    

    다음 결과가 표시됩니다.

    #!/bin/bash
    set -e
    
    # Select a default agent version if one is not specified
    if [ -z "$AZP_AGENT_VERSION" ]; then
      AZP_AGENT_VERSION=2.187.2
    fi
    
    # Verify Azure Pipelines token is set
    if [ -z "$AZP_TOKEN" ]; then
      echo 1>&2 "error: missing AZP_TOKEN environment variable"
      exit 1
    fi
    
    # Verify Azure DevOps URL is set
    if [ -z "$AZP_URL" ]; then
      echo 1>&2 "error: missing AZP_URL environment variable"
      exit 1
    fi
    
    # If a working directory was specified, create that directory
    if [ -n "$AZP_WORK" ]; then
      mkdir -p "$AZP_WORK"
    fi
    
    # Create the Downloads directory under the user's home directory
    if [ -n "$HOME/Downloads" ]; then
      mkdir -p "$HOME/Downloads"
    fi
    
    # Download the agent package
    curl https://vstsagentpackage.azureedge.net/agent/$AZP_AGENT_VERSION/vsts-agent-linux-x64-$AZP_AGENT_VERSION.tar.gz > $HOME/Downloads/vsts-agent-linux-x64-$AZP_AGENT_VERSION.tar.gz
    
    # Create the working directory for the agent service to run jobs under
    if [ -n "$AZP_WORK" ]; then
      mkdir -p "$AZP_WORK"
    fi
    
    # Create a working directory to extract the agent package to
    mkdir -p $HOME/azp/agent
    
    # Move to the working directory
    cd $HOME/azp/agent
    
    # Extract the agent package to the working directory
    tar zxvf $HOME/Downloads/vsts-agent-linux-x64-$AZP_AGENT_VERSION.tar.gz
    
    # Install the agent software
    ./bin/installdependencies.sh
    
    # Configure the agent as the sudo (non-root) user
    chown $SUDO_USER $HOME/azp/agent
    sudo -u $SUDO_USER ./config.sh --unattended \
      --agent "${AZP_AGENT_NAME:-$(hostname)}" \
      --url "$AZP_URL" \
      --auth PAT \
      --token "$AZP_TOKEN" \
      --pool "${AZP_POOL:-Default}" \
      --work "${AZP_WORK:-_work}" \
      --replace \
      --acceptTeeEula
    
    # Install and start the agent service
    ./svc.sh install
    ./svc.sh start
    

    각 줄의 작동 방식을 이해할 필요는 없지만, 이 스크립트가 하는 일에 대한 요약 정보가 제공됩니다.

    • 에이전트 패키지를 .tar.gz 파일로 다운로드하여 콘텐츠를 추출합니다.
    • 추출된 파일에서 스크립트는 다음을 수행합니다.
      • installdependencies.sh라는 셸 스크립트를 실행하여 에이전트 소프트웨어를 설치합니다.
      • config.sh라는 셸 스크립트를 실행하여 에이전트를 구성하고 Azure Pipelines에 에이전트를 등록합니다.
      • svc.sh라는 셸 스크립트를 실행하여 에이전트 서비스를 설치하고 시작합니다.

    이 스크립트는 환경 변수를 사용하여 Azure DevOps 조직에 대한 세부 정보를 제공할 수 있게 해줍니다. 다음은 요약입니다.

    Bash 변수 Description 기본값
    AZP_AGENT_VERSION 설치할 에이전트 소프트웨어 버전 마지막으로 이 모듈을 테스트하는 데 사용된 버전
    AZP_URL Azure DevOps 조직의 URL (없음)
    AZP_TOKEN 개인용 액세스 토큰 (없음)
    AZP_AGENT_NAME Azure DevOps에 표시되는 에이전트 이름 시스템의 호스트 이름
    AZP_POOL 에이전트 풀의 이름 기본값
    AZP_WORK 에이전트가 빌드 작업을 수행할 작업 디렉터리 _work

    스크립트에서 아직 설정되지 않은 변수의 기본값을 제공하지 않으면 스크립트가 오류 메시지를 인쇄하고 즉시 종료됩니다.

    이어지는 단계에서 다음 환경 변수를 설정합니다.

    • AZP_AGENT_VERSION
    • AZP_URL
    • AZP_TOKEN
    • AZP_AGENT_NAME
    • AZP_POOL

    지금은 나머지 변수를 설정하지 않은 상태로 두는 것이 좋습니다.

  3. AZP_AGENT_NAME 환경 변수를 설정하여 에이전트 이름을 지정합니다. MyLinuxAgent로 지정하는 것이 좋습니다.

    export AZP_AGENT_NAME=MyLinuxAgent
    
  4. AZP_URL 환경 변수를 설정하여 Azure DevOps 조직의 URL을 지정합니다.

    <organization>을 해당 조직으로 바꿉니다. Azure DevOps를 표시하는 브라우저 탭에서 이름을 가져올 수 있습니다.

    export AZP_URL=https://dev.azure.com/organization
    
  5. 개인용 액세스 토큰을 지정하려면 AZP_TOKEN 환경 변수를 설정합니다(이 단원의 앞부분에서 복사한 긴 토큰 값).

    <token>을 해당 토큰으로 바꿉니다.

    export AZP_TOKEN=token
    
  6. AZP_POOL 환경 변수를 설정하여 에이전트 풀의 이름을 지정합니다. 앞에서는 MyAgentPool이라는 풀을 만들었습니다.

    export AZP_POOL=MyAgentPool
    
  7. AZP_AGENT_VERSION 환경 변수를 설정하여 최신 버전의 에이전트를 지정합니다.

    export AZP_AGENT_VERSION=$(curl -s https://api.github.com/repos/microsoft/azure-pipelines-agent/releases | jq -r '.[0].tag_name' | cut -d "v" -f 2)
    

    Linux 머신의 YAML 파이프라인은 시험판인 경우에도 최신 버전의 에이전트를 사용해야 합니다. 에이전트 소프트웨어는 지속적으로 업데이트되므로 GitHub 리포지토리의 버전 정보를 curl할 수 있습니다. 이 명령은 jq를 사용하여 반환되는 JSON 문자열에서 최신 버전을 읽습니다.

  8. 에이전트 버전을 콘솔에 출력합니다. 경우에 따라 최신 버전인지 확인합니다.

    echo $AZP_AGENT_VERSION
    
  9. 스크립트를 실행 가능하게 만든 후 실행합니다.

    chmod u+x build-agent.sh
    sudo -E ./build-agent.sh
    

    sudo는 스크립트를 루트 사용자로 실행할 수 있게 해줍니다. 환경 변수를 스크립트에 사용할 수 있도록, -E 인수는 사용자가 설정한 환경 변수를 포함하여 현재 환경 변수를 유지합니다.

    스크립트가 실행되면 에이전트가 Azure DevOps에 연결하고, 에이전트 풀에 추가되고, 에이전트 연결이 테스트 되는 것을 볼 수 있습니다.

에이전트가 실행 중인지 확인

VM에 빌드 도구와 에이전트 소프트웨어를 성공적으로 설치했습니다. 확인 단계로, Azure DevOps로 이동하여 에이전트 풀의 에이전트를 확인하겠습니다.

  1. Azure DevOps에서 Space Game - web - Agent 프로젝트로 이동합니다.

  2. 프로젝트 설정을 선택합니다.

  3. 파이프라인 아래에서 에이전트 풀을 선택합니다.

  4. MyAgentPool을 선택합니다.

  5. 에이전트 탭을 선택합니다.

    에이전트가 온라인 상태이고 빌드 작업을 수락할 준비가 된 것을 볼 수 있습니다.

    A screenshot of Azure DevOps showing the status of the private agent. The agent shows as online, idle, and enabled.

    빌드 에이전트가 오프라인으로 표시되면 몇 분 정도 기다렸다가 페이지를 새로 고칩니다.

  6. MyLinuxAgent 에이전트를 선택합니다.

  7. 기능 탭을 선택합니다.

    설정하는 동안 구성 프로세스에서 빌드 에이전트의 도구 기능을 검색했습니다. 그 중 하나로 npm이 나열됩니다. 원래 빌드 구성에서는 npm을 에이전트에 설치해야 한다고 지정했습니다.

    A screenshot of Azure DevOps showing a few of the agent's capabilities. The npm capability is highlighted.

    사용할 에이전트 풀을 지정할 때 이러한 항목을 demands 섹션에 포함할 수 있습니다. 이렇게 하면 Azure Pipelines는 애플리케이션을 빌드하는 데 필요한 소프트웨어가 있는 빌드 에이전트를 선택합니다. 또한 다양한 소프트웨어 구성을 사용하여 에이전트 풀을 만들 수 있습니다. Azure Pipelines에서는 요구 사항에 따라 올바른 구성을 선택합니다.