다음을 통해 공유


플랫폼 간 스크립팅

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

Azure Pipelines는 Linux, macOS 및 Windows 머신에서 파이프라인을 실행할 수 있습니다. .NET Core, Node.js또는 Python과 같은 플랫폼 간 개발 기술을 사용하는 경우 이러한 플랫폼 간 빌드 기능은 이점과 과제를 모두 제공합니다. 예를 들어 대부분의 파이프라인에는 빌드 프로세스 중에 실행할 하나 이상의 스크립트가 포함되지만 스크립트 구문은 플랫폼마다 다른 경우가 많습니다.

이 문서에서는 플랫폼 간 스크립팅을 사용하여 다양한 빌드 플랫폼을 지원하는 방법을 설명합니다. Azure Pipelines script 단계를 사용하여 플랫폼 간 스크립트를 쉽게 작성할 수 있습니다. 조건을 사용하여 특정 플랫폼에 스크립트를 대상으로 지정할 수도 있습니다.

스크립트 단계

스크립트 키워드는 Linux 및 macOS에서 Bash를 실행하거나 Windows에서 cmd.exe 명령줄 작업의 바로 가기입니다.

플랫폼 간 도구에 인수를 쉽게 전달하는 데 사용할 script 수 있습니다. 이 script 단계는 각 플랫폼의 네이티브 스크립트 인터프리터에서 실행됩니다. macOS 및 Linux에서는 Bash, Windows에서는 cmd.exe입니다. 다음 예제에서는 인수 집합을 script 사용하여 호출 npm 하는 단계를 사용합니다.

steps:
- script: |
    npm install
    npm test

환경 변수

명령줄, PowerShell 및 Bash는 환경 변수를 다르게 확인합니다. PATH와 같은 시스템 제공 값에 액세스하려면 플랫폼당 다른 구문을 사용해야 합니다.

Azure Pipelines는 런타임에 변수를 참조하는 플랫폼 간 방법으로 매크로 구문을 사용합니다. 매크로 구문이 있는 변수는 런타임 중에 태스크가 실행되기 전에 처리됩니다. 플랫폼 셸이 변수를 처리하기 전에 변수가 확장됩니다.

파이프라인에서 매크로 구문을 사용하려면 다음과 같이 변수 이름을 묶습니다 $(<variable name>). 다음 플랫폼 간 예제 스크립트는 파이프라인의 ID를 출력합니다.

steps:
- script: echo This is pipeline $(System.DefinitionId)

이 구문은 파이프라인 내에서 정의하는 변수에도 작동합니다.

variables:
  Example: 'myValue'

steps:
- script: echo The value passed in is $(Example)

Bash 작업

더 복잡한 스크립트가 필요한 경우 Bash에서 작성하고 파이프라인에서 Bash 작업을 사용하는 것이 좋습니다. 대부분의 macOS 및 Linux 에이전트는 Bash를 셸로 사용하고 Windows 에이전트는 Linux Bash용 Git Bash 또는 Windows 하위 시스템을 사용할 수 있습니다. Microsoft 호스팅 에이전트에는 기본적으로 Bash가 미리 설치되어 있습니다.

다음 예제에서는 빌드를 트리거할지 여부를 결정하는 데 도움이 되는 Bash 작업을 실행합니다.

trigger:
    batch: true
    branches:
        include:
        - main
steps:
- bash: |
    echo "Hello world from $AGENT_NAME running on $AGENT_OS"
    case $BUILD_REASON in
            "Manual") echo "$BUILD_REQUESTEDFOR manually queued the build." ;;
            "IndividualCI") echo "This is a CI build for $BUILD_REQUESTEDFOR." ;;
            "BatchedCI") echo "This is a batched CI build for $BUILD_REQUESTEDFOR." ;;
        *) $BUILD_REASON ;;
    esac
  displayName: Hello world

비고

PowerShell은 스크립트에 대한 옵션이기도 합니다. pwsh 단축키는 macOS, Linux 또는 Windows에서 PowerShell 7.x를 실행합니다. 에이전트에 PowerShell 7.x가 설치되어 있어야 합니다. Microsoft 호스팅 에이전트 에는 기본적으로 PowerShell 7.x가 설치되어 있습니다.

플랫폼 기반 전환

파이프라인 논리를 복제하기 위한 플랫폼별 스크립팅으로 인해 추가 작업이 발생하고 오류 위험이 증가합니다. 그러나 플랫폼별 스크립팅을 피할 수 없는 경우 조건을 사용하여 사용 중인 플랫폼을 검색할 수 있습니다.

예를 들어, 빌드 에이전트의 IP 주소를 얻으려면 macOS에서는 ifconfig, Ubuntu Linux에서는 ip addr, Windows PowerShell에서는 Get-NetIPAddress cmdlet을 사용해야 합니다. 다음 파이프라인은 조건을 사용하여 다른 플랫폼의 에이전트에서 해당 정보를 가져옵니다.

steps:
# Linux
- bash: |
    export IPADDR=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/')
    echo "##vso[task.setvariable variable=IP_ADDR]$IPADDR"
  condition: eq( variables['Agent.OS'], 'Linux' )
  displayName: Get IP on Linux
# macOS
- bash: |
    export IPADDR=$(ifconfig | grep 'en0' -A3 | grep inet | tail -n1 | awk '{print $2}')
    echo "##vso[task.setvariable variable=IP_ADDR]$IPADDR"
  condition: eq( variables['Agent.OS'], 'Darwin' )
  displayName: Get IP on macOS
# Windows
- powershell: |
    Set-Variable -Name IPADDR -Value ((Get-NetIPAddress | ?{ $_.AddressFamily -eq "IPv4" -and !($_.IPAddress -match "169") -and !($_.IPaddress -match "127") } | Select-Object -First 1).IPAddress)
    Write-Host "##vso[task.setvariable variable=IP_ADDR]$IPADDR"
  condition: eq( variables['Agent.OS'], 'Windows_NT' )
  displayName: Get IP on Windows

# use the value
- script: |
    echo The IP address is $(IP_ADDR)