다음을 통해 공유


환경에서 Linux VM에 배포

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

가상 머신을 Azure Pipelines 환경 내에서 리소스로 추가하고 배포 대상을 지정할 수 있습니다. CI/CD(연속 통합 및 지속적인 배포) 워크플로의 경우 환경의 배포 기록은 트리거 커밋으로 다시 각 VM에 대한 추적 가능성을 제공합니다.

이 문서에서는 환경의 여러 Linux VM(가상 머신) 리소스 에 배포하기 위해 Azure DevOps 파이프라인을 설정하는 방법을 보여 줍니다. 이러한 지침은 JavaScript 또는 Java 앱을 빌드하고 배포하지만 웹 배포 패키지를 게시하는 모든 앱에 맞게 조정할 수 있습니다.

배포 작업의 대상이 되는 환경 및 리소스에 대한 자세한 내용은 jobs.deployment.environment YAML 스키마 정의를 참조하세요. 배포 작업에 대한 자세한 내용은 jobs.deployment 정의를 참조하세요.

필수 조건

또한 JavaScript 또는 Node.js 앱의 경우:

중요한

  • 앱을 배포하려면 대상 환경 VM 리소스에 필요한 모든 소프트웨어, 종속성, 권한 및 로그인이 설치 및 구성되어야 합니다.
  • GitHub 소스 코드를 사용하려면 GitHub 서비스 연결이 필요합니다. 또한 GitHub는 로그인, Azure Pipelines GitHub 앱 설치 또는 Azure Pipelines 권한을 부여하라는 메시지를 표시할 수 있습니다. 각 프로세스를 완료하려면 화면의 지침을 따릅니다. 자세한 내용은 GitHub 리포지토리에 대한 액세스를 참조 하세요.

환경 만들기 및 Linux VM 추가

Azure Pipelines 프로젝트에서 환경 만들기 및 VM 추가의 지침에 따라 환경을 만들고 Linux VM을 환경 리소스로 추가합니다.

각 VM에서 복사한 에이전트 등록 스크립트를 실행하여 환경에 등록합니다. 대화형 프롬프트에 응답하여 개별 VM에 태그를 할당할 수도 있습니다.

빌드 파이프라인 만들기 및 실행

코드 리포지토리의 main 분기에 커밋이 있을 때마다 앱을 빌드하고 배포하는 CI 파이프라인을 만듭니다.

YAML 파이프라인 만들기

  1. Azure DevOps 프로젝트에서 파이프라인>새 파이프라인 또는 파이프라인 만들기를 선택한 다음, 소스 코드의 위치로 GitHub 를 선택합니다.
  2. 리포지토리 선택 화면에서 포크된 샘플 리포지토리를 선택합니다.
  3. 파이프라인 구성 화면에서 시작 파이프라인을 선택합니다.
  4. 파이프라인 YAML 검토 화면에서 생성된 시작 코드를 런타임에 따라 다음 코드로 바꿉니다.

빌드 작업 추가

Build 작업은 프로젝트를 빌드하고 테스트하는 작업을 실행하고, 빌드 결과는 drop 위치에 업로드됩니다. 이 작업은 Linux 환경 VM이 아닌 파이프라인 pool에 지정된 빌드 에이전트에서 실행됩니다.

다음 파이프라인은 npm을 사용하여 Node.js 프로젝트를 빌드하고 테스트한 다음 출력을 패키지하고 삭제 위치에 업로드합니다.

trigger:
- main

pool:
  vmImage: ubuntu-latest

jobs:  
- job: Build
  displayName: Build
  steps:
  - task: UseNode@1
    inputs:
      version: '16.x'
    displayName: 'Install Node.js'
  - script: |
      npm install
      npm run build --if-present
      npm run test --if-present
    displayName: 'npm install, build and test'
  - task: ArchiveFiles@2
    displayName: 'Archive files'
    inputs:
      rootFolderOrFile: '$(System.DefaultWorkingDirectory)'
      includeRootFolder: false
      archiveType: tar
      tarCompression: gz
      archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).gz
      replaceExistingArchive: true
  - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).gz
    artifact: drop

자세한 내용은 gulp를 사용하여 Node.js 앱 빌드에서 빌드를 만드는 단계를 검토합니다.

파이프라인 실행

azure-pipelines.yml 파일을 리포지토리에 저장하고 CI/CD 파이프라인을 시작하려면 저장 및 실행을 선택한 다음 저장을 선택하고 다시 실행합니다.

파이프라인이 완료되면 작업 요약 페이지를 확인하여 빌드 작업이 성공적으로 실행되었고 게시된 아티팩트 1 개는 관련 항목 아래에 표시되는지 확인합니다.

배포 작업 추가 및 실행

배포 작업은preDeploy, deploy, routeTraffic, postRouteTraffic 라이프사이클 훅을 한 번 실행한 다음, on: success 또는 on: failure을 실행합니다. 환경 VM에 배포하는 경우, preDeploy 단계는 환경 VM이 아닌 빌드 에이전트에서 실행됩니다. 다른 모든 단계는 환경의 등록된 VM에서 실행됩니다.

  1. 선택적 preDeploy 단계는 배포 전에 실행됩니다. 오케스트레이션, VM 및 아티팩트 준비 및 상태 검사에 이 단계를 사용할 수 있습니다.
  2. 이 단계에서는 deploy 대상 환경 VM에 배포 개체를 배포합니다.
  3. 선택적 routeTraffic 단계에서는 트래픽 전환을 적용할 수 있습니다.
  4. 선택적 postRouteTraffic 단계는 상태 검사 및 알림을 수행할 수 있습니다.
  5. 사용자 지정 on.failureon.success 단계는 알림 또는 복구를 제공할 수 있습니다.

환경에 resourceType: VirtualMachine 대한 배포 작업을 수행하려면 환경 VM이 Bash 또는 Azure CLI와 같은 모든 파이프라인 작업을 실행할 수 있어야 합니다. 이 preDeploy 단계를 사용하여 대상 VM에 필요한 소프트웨어 및 권한을 설치할 수 있습니다.

예를 들어 배포 단계에서 Azure CLI를 사용하는 경우 에이전트 VM에 Azure CLI가 설치되어 있고 에이전트 사용자의 PATH에서 사용할 수 있어야 합니다. 에이전트 사용자는 CLI를 실행할 권한이 있어야 하며 Azure에 인증해야 합니다. 에이전트 사용자를 sudoers에 추가하거나 설치를 자동화하기 위해 환경 변수를 설정해야 할 수 있습니다.

스크립트를 preDeploy 사용하여 대상 VM에 Azure CLI를 설치할 수 있습니다. Azure에 인증하려면 az login을 실행하거나, 자동화를 위해 서비스 주체를 정의하고 az login --service-principalpreDeploy 단계에서 실행할 수 있습니다.

배포 작업 추가

다음 예제 배포 작업은 Build 작업이 성공적으로 완료되면 시작됩니다. 파이프라인에 작업을 추가하려면 다음을 수행합니다.

  1. 요약 페이지에서 오른쪽 위에 있는 기타 작업 아이콘을 선택하고, 파이프라인 편집을 선택하고, 파이프라인의 끝에 다음 코드를 추가합니다. 만든 환경의 이름으로 <environment-name> 를 바꾸십시오.

    필요에 따라 tags 매개 변수를 사용하고 VM에 대해 정의한 <VMtag>을 지정하여 배포 대상 환경에서 특정 VM을 선택할 수 있습니다.

    - deployment: VMDeploy
      displayName: Web deploy
      dependsOn: Build
      condition: succeeded()
      environment:
        name: <environment-name>
        resourceType: VirtualMachine
        tags: <VMtag> # VMs to deploy to
    
  2. strategydeployment 작업에 추가합니다. runOnce 배포 전략은 가장 간단하며 지정strategy하지 않으면 기본적으로 실행됩니다. 이 전략은 병렬 처리 또는 트래픽 관리 없이 환경의 각 VM에서 배포 단계를 한 번 실행합니다.

      strategy:
         runOnce:
           deploy:
              steps:
              - script: echo my first deployment
    
  3. 배포 작업을 추가한 후 유효성 검사 및 저장을 선택한 다음 , 저장, 실행을 선택하고 실행을 다시 선택합니다 . 이 작업을 실행할 때마다 환경에 대한 배포 기록 레코드가 기록됩니다.

    참고

    환경을 사용하는 파이프라인을 처음 실행할 때 에이전트 풀 및 환경에 액세스하려면 파이프라인의 모든 실행에 대한 권한을 부여해야 합니다. 파이프라인 실행 요약 화면에서 작업 옆에 있는 대기 기호를 선택한 다음[ 허용]을 선택하여 필요한 권한을 부여합니다.

롤링 배포 전략

rolling을(를) 배포 전략 runOnce 대신 사용할 수 있습니다. 롤링 배포 전략은 병렬 처리, 상태 검사 및 트래픽 라우팅을 오케스트레이션할 수 있습니다. runOnce 전략은 한 번에 단일 VM에서 실행되지만, 롤링 배포는 설정에 따라 최대 5개의 대상 VM의 롤링 집합에서 병렬로 maxParallel 실행할 수 있습니다.

이 매개 변수는 maxParallel 사용 가능한 상태로 유지해야 하는 VM의 수 또는 백분율을 설정하여 앱이 요청을 처리할 수 있도록 하고 배포 중 전체 가동 중지 시간을 줄입니다. 또한 이 매개 변수는 배포의 성공 및 실패 조건을 결정합니다.

롤링 배포 전략에 대한 자세한 내용은 jobs.deployment.strategy.rolling 스키마 정의를 참조하세요.

배포 작업 예제

VM 리소스에 배포하려면 VM에 필요한 모든 앱, 종속성 및 사용 권한이 설치 및 구성되어야 합니다. 이러한 요구 사항을 수동으로 사전 설치해야 하거나 파이프라인에서 이러한 요구 사항을 설치하거나 구현해야 합니다.

VM 리소스에 대한 Java 앱 배포는 자체 포함되므로 구현하기가 더 쉽습니다. JVM(Java Virtual Machine)은 VM 에이전트에 미리 설치되는 경우가 많으며 앱 종속성, 권한 또는 패키지 관리에 대해 걱정할 필요가 없습니다. JAR 파일을 다운로드한 다음 java -jar로 실행하세요.

Node.js 앱에는 Node, npm 패키지 및 systemd와 같은 서비스 관리자가 각 에이전트 VM에 설치 및 설정되어 있어야 합니다. 자동화하려면 파이프라인 배포 스크립트가 비동기적이어야 하며 앱의 서비스를 다시 시작하고 관리할 수 있어야 합니다.

JavaScript 앱에 대한 다음 YAML rolling 배포 작업은 성공적인 Build 단계 완료에 따라 달라집니다. 배포 작업은 각 에이전트 VM에서 다음 요구 사항이 이미 사전 설치되거나 미리 구성되어 있다고 가정합니다. 전체 자동화를 위해 파이프라인의 일부로 VM에 이러한 앱과 서비스를 설치하고 구성할 수 있습니다.

  • Node.js 16.x가 설치되었으며 빌드 에이전트의 PATH에서 npm을 사용할 수 있습니다.
  • Node.js 앱을 시작하기 위해 구성된 서비스에 대한 systemd 서비스 파일을 사용하는 systemd입니다. 예시로는 /etc/systemd/system/pipelines-javascript.service가 있습니다.
  • 에이전트 사용자가 필요한 명령에 대해 암호 없이 sudo를 실행할 수 있도록 NOPASSWD:에서 을 설정합니다.
  • 에이전트 사용자에게 /opt/pipelines-javascript 또는 기타 배포 대상에 대한 쓰기 권한이 필요합니다.

팁 (조언)

대부분의 Node.js 앱의 경우 배포 작업을 사용하는 대신 Azure App Service 에 배포하거나 Microsoft 호스팅 에이전트와 함께 일반 파이프라인 작업을 사용하는 것이 좋습니다. 이 방법은 더 간단하며 VM 환경 관리의 운영 오버헤드를 방지합니다. 특정 VM 리소스에 배포하는 것은 VM 서버, 고급 오케스트레이션 또는 레거시 인프라를 직접 제어해야 하는 시나리오에 가장 적합합니다.

- stage: Deploy
  displayName: Rolling Deploy to VMs
  dependsOn: Build
  condition: succeeded()
  jobs:
  - deployment: RollingDeploy
    displayName: Rolling deploy to Ubuntu VMs
    environment:
      name: <environment-name>
      resourceType: VirtualMachine
    strategy:
      rolling:
        maxParallel: 1   #or 2 for parallel. For percentages, use x%
        preDeploy:
          steps:
          - download: current
            artifact: drop
          - script: echo "Pre-deploy on $(hostname)"
        deploy:
          steps:
          - script: |
              echo "Unpacking Node.js app on $(hostname)"
              sudo mkdir -p /opt/pipelines-javascript
              sudo tar -xzf $(Pipeline.Workspace)/drop/$(Build.BuildId).tar.gz -C /opt/pipelines-javascript --strip-components=1
              cd /opt/pipelines-javascript
              echo "Installing production dependencies"
              sudo npm ci --only=production
              echo "Restarting Node.js service"
              sudo systemctl restart pipelines-javascript
            displayName: 'Extract, install, and restart Node.js service'
        routeTraffic:
          steps:
          - script: echo "Routing traffic on $(hostname)"
        postRouteTraffic:
          steps:
          - script: echo "Post-route health check on $(hostname)"
        on:
          failure:
            steps:
            - script: echo "Deployment failed on $(hostname)"
          success:
            steps:
            - script: echo "Deployment succeeded on $(hostname)"

환경에서 파이프라인 추적성에 접근하기

환경 배포 탭은 커밋 및 작업 항목의 완전한 추적 가능성과 환경에 대한 파이프라인 간 배포 기록을 제공합니다.

배포 보기의 스크린샷.