Поделиться через


Кроссплатформенный скрипт

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 для упрощения написания кроссплатформенных скриптов. Вы также можете использовать условия для целевых сценариев на определенных платформах.

Шаг скрипта

Ключевое слово script — это ярлык задачи командной строки, которая запускает Bash в Linux и macOS или cmd.exe в Windows.

Вы можете передавать аргументы script кроссплатформенным инструментам легко. Шаг script выполняется в интерпретаторе собственных скриптов каждой платформы, Bash в macOS и Linux или cmd.exe в Windows. В следующем примере используется script шаг для вызова npm с набором аргументов.

steps:
- script: |
    npm install
    npm test

Переменные среды

Командная строка, PowerShell и Bash обрабатывают переменные среды по-разному. Чтобы получить доступ к системному значению, например PATH, необходимо использовать другой синтаксис для каждой платформы.

Azure Pipelines использует синтаксис макросов в качестве кроссплатформенного способа ссылки на переменные во время выполнения. Переменные с синтаксисом макросов обрабатываются перед выполнением задачи во время выполнения программы. Переменная расширяется до того, как оболочка платформы столкнется с ней.

Чтобы использовать синтаксис макросов в конвейере, окружите имя переменной следующим образом: $(<variable name>). Следующий кроссплатформенный пример скрипта отражает идентификатор конвейера.

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 могут использовать подсистему Git Bash или Подсистему Windows для Linux Bash. Агенты, размещенные корпорацией Майкрософт , по умолчанию предустановили 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 запускает PowerShell 7.x в macOS, Linux или Windows. Агенты должны установить PowerShell 7.x. Агенты, размещенные корпорацией Майкрософт , по умолчанию установлены PowerShell 7.x.

Платформенное переключение

Скрипты для конкретной платформы для дублирования логики конвейера вызывают дополнительную работу и повышенный риск ошибок. Но если вы не можете избежать сценариев для конкретной платформы, можно использовать условия , чтобы определить, на какой платформе вы находитесь.

Например, чтобы получить IP-адрес агента сборки, необходимо использовать ifconfig в macOS, ip addr в Ubuntu Linux и Get-NetIPAddress командлет в Windows PowerShell. Следующий поток данных получает эту информацию от агентов на разных платформах при помощи условий.

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)