Могу ли я подставить переменную в 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 не работает. Но мы можем обойти это, используя функцию.
Это определенно более сложно, чем использование сценариев, но, с другой стороны, полностью выполняется во время компиляции .
- Добавьте какой-нибудь известный символ после каждого символа исходной строки, используя
replace
. То есть, добавить_
, так чтоabc
становитсяa_b_c_
. - Разделить строку, используя добавленный символ –
split('a_b_c_', '_')
.split
функция возвращает индексируемый массив. - Используйте индексацию массива для составления результата
Помимо того, что это нечитабельно, у этого метода есть тот недостаток, что вам придется указывать все символы, которые когда-либо могли быть частью входного значения. Если этого не сделать, это может привести к неожиданному поведению. Но для 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: я не могу заставить его работать с
$[
...
]
синтаксис, поскольку переменная изначально пуста.