플랫폼 간 스크립트 실행

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Azure Pipelines를 사용하면 macOS, Linux 및 Windows 컴퓨터에서 빌드를 실행할 수 있습니다. .NET Core, Node.js 및 Python과 같은 플랫폼 간 기술을 개발하는 경우 이러한 기능은 이점과 과제를 모두 가져옵니다.

예를 들어 대부분의 파이프라인에는 빌드 프로세스 중에 실행하려는 하나 이상의 스크립트가 포함됩니다. 그러나 스크립트는 종종 다른 플랫폼에서 동일한 방식으로 실행되지 않습니다. 키워드(keyword) 바로 가기를 사용하여 script 스크립트를 더 쉽게 작성할 수 있으며, 조건을 사용하여 스크립트를 사용하여 특정 플랫폼을 대상으로 지정할 수도 있습니다.

스크립트 단계를 사용하여 플랫폼 간 도구 실행

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

사용은 script 태스크가 플랫폼 간 도구에 인수를 전달하는 경우에 유용할 수 있습니다. 예를 들어 인수 집합을 사용하여 호출 npm 하는 작업은 한 단계로 쉽게 수행할 script 수 있습니다. script 는 각 플랫폼의 네이티브 스크립트 인터프리터인 macOS 및 Linux의 Bash, windows의 cmd.exe 실행됩니다.

steps:
- script: |
    npm install
    npm test

환경 변수 처리

환경 변수는 플랫폼 간 스크립트 작성에 첫 번째 주름을 throw합니다. 명령줄, PowerShell 및 Bash에는 각각 환경 변수를 읽는 다양한 방법이 있습니다. PATH와 같은 운영 체제 제공 값에 액세스해야 하는 경우 플랫폼당 다른 기술이 필요합니다.

그러나 Azure Pipelines는 호출 된 매크로 구문에 대해 알고 있는 변수를 참조하는 플랫폼 간 방법을 제공합니다. 변수 이름을 $( )둘러싼 경우 플랫폼의 셸에서 볼 수 있기 전에 확장됩니다. 예를 들어 파이프라인의 ID를 에코하려는 경우 다음 스크립트는 플랫폼 간 친화적입니다.

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

이는 파이프라인에서 지정한 변수에도 작동합니다.

variables:
  Example: 'myValue'

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

Bash 또는 pwsh 고려

위에 표시된 예제보다 더 복잡한 스크립팅 요구 사항이 있는 경우 Bash에서 작성하는 것이 좋습니다. 대부분의 macOS 및 Linux 에이전트에는 사용 가능한 셸로 Bash가 있으며 Windows 에이전트에는 Git Bash 또는 Linux용 Windows 하위 시스템 Bash가 포함됩니다.

Azure Pipelines의 경우 Microsoft 호스팅 에이전트에는 항상 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 Core(pwsh)도 옵션입니다. 각 에이전트에 PowerShell Core가 설치되어 있어야 합니다.

플랫폼 기반 전환

일반적으로 파이프라인 논리의 중복과 같은 문제를 방지하기 위해 플랫폼별 스크립트를 피하는 것이 좋습니다. 중복으로 인해 추가 작업과 버그의 추가 위험이 발생합니다. 그러나 플랫폼별 스크립팅을 방지할 방법이 없는 경우 사용 중인 플랫폼을 검색할 수 있습니다 condition .

예를 들어 어떤 이유로 빌드 에이전트의 IP 주소가 필요하다고 가정합니다. Windows에서 ipconfig 해당 정보를 가져옵니다. macOS에서는 ifconfig. 그리고 Ubuntu Linux에서는 ip addr.

아래 파이프라인을 설정한 다음, 다른 플랫폼의 에이전트에 대해 실행해 봅니다.

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

# now we use the value, no matter where we got it
- script: |
    echo The IP address is $(IP_ADDR)