Могу ли я подставить переменную в Azure Pipelines?

Я ищу способ определить переменную в моем azure-pipelines.yml файл, в котором я могу подставить 'Build.SourceVersion' -> Используйте только первые 7 символов.

Похоже, в документации нет встроенной функции, которая может выполнять такие строковые операции. Что-то мне не хватает?

Другой мой подход - использовать задачу bash и перезаписать переменную там, но найти что-то встроенное, что может сделать это, было бы лучшим решением.

7 ответов

Другой мой подход - использовать задачу bash и перезаписать переменную там, но найти что-то встроенное, что может сделать это, было бы лучшим решением.

Я согласен с Лукасом. Такой встроенной задачи для получения первых 7 символов $(Build.SourceVersion) в Azure DevOps нет.

Мы могли бы использовать задачу командной строки /powershell, чтобы разделить длинный sha на короткий sha:

echo $(Build.SourceVersion)

set TestVar=$(Build.SourceVersion)

set MyCustomVar=%TestVar:~0,7%

echo %MyCustomVar%

echo ##vso[task.setvariable variable=ShortSourceVersion]%MyCustomVar%

В этом случае мы могли бы получить короткие версии Build.SourceVersion и установите его как переменную среды.

Затем мы могли бы установить эту задачу командной строки как группу задач:

Итак, мы могли бы использовать эту задачу для установки ShortSourceVersion прямо.

Надеюсь это поможет.

Я знаю, что немного опоздал на эту вечеринку, но для всех, кто заходит сюда и хочет избежать использования Bash, PowerShell и подобных, мне удалось создать подстроку, не содержащую ничего, кроме выражений Azure Pipelines.

(Я обязательно попаду прямо в ад за написание этого кода)

К сожалению, по какой-то причине мы не можем индексировать строку, поэтому ответ @dsschneidermann не работает. Но мы можем обойти это, используя функцию.

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

  1. Добавьте какой-нибудь известный символ после каждого символа исходной строки, используяreplace. То есть, добавить_, так чтоabcстановитсяa_b_c_.
  2. Разделить строку, используя добавленный символ –split('a_b_c_', '_'). splitфункция возвращает индексируемый массив.
  3. Используйте индексацию массива для составления результата

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

Результат таков:

      - name: Build.SourceVersion.PreparedForSplit
  value: ${{ replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(variables['Build.SourceVersion'], 'a', 'a_'), 'b', 'b_'), 'c', 'c_'), 'd', 'd_'), 'e', 'e_'), 'f', 'f_'), 'g', 'g_'), 'h', 'h_'), 'i', 'i_'), 'j', 'j_'), 'k', 'k_'), 'l', 'l_'), 'm', 'm_'), 'n', 'n_'), 'o', 'o_'), 'p', 'p_'), 'q', 'q_'), 'r', 'r_'), 's', 's_'), 't', 't_'), 'u', 'u_'), 'v', 'v_'), 'w', 'w_'), 'x', 'x_'), 'y', 'y_'), 'z', 'z_'), '0', '0_'), '1', '1_'), '2', '2_'), '3', '3_'), '4', '4_'), '5', '5_'), '6', '6_'), '7', '7_'), '8', '8_'), '9', '9_') }}
  readonly: true
- name: Build.SourceVersion.Short
  value: ${{ split(variables['Build.SourceVersion.PreparedForSplit'], '_')[0] }}${{ split(variables['Build.SourceVersion.PreparedForSplit'], '_')[1] }}${{ split(variables['Build.SourceVersion.PreparedForSplit'], '_')[2] }}${{ split(variables['Build.SourceVersion.PreparedForSplit'], '_')[3] }}${{ split(variables['Build.SourceVersion.PreparedForSplit'], '_')[4] }}${{ split(variables['Build.SourceVersion.PreparedForSplit'], '_')[5] }}${{ split(variables['Build.SourceVersion.PreparedForSplit'], '_')[6] }}
  readonly: true

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


Я также создал сценарий PowerShell для создания промежуточной переменной:
      # Input variable name
$VariableName = 'Build.SourceVersion'
# Known characters - should be every character that could appear in the input
$Chars = 'abcdefghijklmnopqrstuvwxyz0123456789'
# Character to be appended after every character in the input string
$IntermediateChar = '_'

$output = "variables['$VariableName']"

foreach ($Char in [char[]]$Chars) {
    $output = "replace($output, '$Char', '$Char$IntermediateChar')"
}

Write-Host $output

В Azure devops это действительно можно сделать с использованием пакетной техники - как и другие ответы, предлагаемые здесь, - однако я хотел удалить строку из конца строки - и с пакетной обработкой это становится более сложным (см. следующую ссылку ) .

Затем я решил использовать встроенные выражения Azure, например, так:

      - name: sourceBranchName
  value: ${{ replace(variables['Build.SourceBranch'], 'refs/heads/') }}

replaceбудет иметь аналогичный эффект для подстроки - поэтому он удалит ненужную часть из исходной строки.

Однако, если вы хотите объединить некоторую строку, а затем удалить ее из исходного имени - это можно сделать, например, с помощьюformatфункция:

      - name: originBranchName
  value: ${{ replace(variables.sourceBranchName, format('-to-{0}', variables.dynamicvar ) ) }}

Еслиdynamicvarявляетсяa- тогда функция удалит-to-aот названия филиала.

Вот самая короткая версия, которую я использую для этой работы;

      - bash: |
    longcommithash=$(Build.SourceVersion)
    echo "##vso[task.setvariable variable=shorthash;]$(echo ${longcommithash::9})"

Это дает вам вывод, как показано ниже;

Вы правы, нативного способа сделать это нет. Вам нужно будет написать сценарий для преобразования переменной.

Вот пример:

trigger:
- master

resources:
- repo: self

stages:
- stage: Build
  displayName: Build image
  jobs:  
  - job: Build
    displayName: Build
    pool:
      vmImage: 'ubuntu-latest'
    steps:
    - task: CmdLine@2
      inputs:
        script: ' x=`echo "$(Build.SourceVersion)" | head -c 7`; echo "##vso[task.setvariable variable=MyVar]$x"'
    - task: CmdLine@2
      inputs:
        script: 'echo "$(MyVar)"'

Например

      variables:
- name: Version
  value: ${{ parameters.version }}
- name: Environment
  value: Production

  - job: Tag
    displayName: "Make tag in git"
    continueOnError: true
    steps:
     - script: |
         set Env=$(Environment)
         set Abbr=%Env:~0,1%
         git tag %Abbr%.$(Version)
         git push origin %Abbr%.$(Version)

Что вы можете! Если вы обязательно должны . Вот вычисление во время выполнения, использующее первые 7 символов переменной Build.SourceVersion.

      variables:
  example: ${{ format('{0}{1}{2}{3}{4}{5}{6}', variables['Build.SourceVersion'][0], variables['Build.SourceVersion'][1], variables['Build.SourceVersion'][2], variables['Build.SourceVersion'][3], variables['Build.SourceVersion'][4], variables['Build.SourceVersion'][5], variables['Build.SourceVersion'][6]) }}

NB: я не могу заставить его работать с $[... ]синтаксис, поскольку переменная изначально пуста.

Другие вопросы по тегам