Я пытаюсь создать выходную переменную, которая позже будет использоваться для других заданий. Однако есть вероятность, что задание, ответственное за его создание, будет пропущено. Чтобы выйти из этого сценария, я попытался добавить «заполнитель» к упомянутой ранее переменной. Однако на более позднем этапе, похоже, условие не равенства оценивается неправильно.
#Вот базовый конвейер:
trigger: none
pool: '<?>'
parameters:
- name: 'String'
type: string
displayName: 'String'
- name: 'skipA'
type: boolean
displayName: 'Skip stage A'
default: false
stages:
- stage: A
jobs:
- job: A1
condition: ne('${{ parameters.skipA }}', true)
steps:
- task: PowerShell@2
displayName: 'Run script 1'
name: script1
inputs:
pwsh: true
filePath: 'outputVariables\scripts\simpleScript.ps1'
arguments: >-
-inputValue ${{ parameters.String }}
- stage: B
variables:
myVar: $[ stageDependencies.A.A1.outputs['script1.myVar'] ]
dependsOn: A
jobs:
- job: B1
steps:
- task: PowerShell@2
displayName: 'Run script 1'
name: script1
inputs:
pwsh: true
filePath: 'outputVariables\scripts\simpleScript.ps1'
arguments: >-
-inputValue "placeholder,$(myVar)"
- job: B2
steps:
- template: 'templateFile.yml'
parameters:
somethingElse: '$(myVar),placeholder'
#файлшаблона.yml:
parameters:
- name: 'somethingElse'
type: string
steps:
- task: PowerShell@2
condition: ne('${{parameters.somethingElse}}', ',placeholder') #NOT EVALUATED CORRECTLY
displayName: 'Run script 3'
name: script1
inputs:
pwsh: true
filePath: 'outputVariables\scripts\simpleScript.ps1'
arguments: >-
-inputValue "${{parameters.somethingElse}}"
- script: echo step 2.1
Скрипт #ps1:
param (
[Parameter(Mandatory=$false)]
[string]$inputValue = "Def val"
)
# Print the input value to the screen
Write-Output "You entered: $inputValue"
Write-Host "##vso[task.setvariable variable=myVar;isOutput=true]$inputValue"
Я ожидаю, что задание B2 не будет запускать simpleScript.
Привет @AlvinZhao-MSFT, спасибо, что так быстро связались. Есть ли обходной путь, который я мог бы попробовать, или мне следует отказаться от этого подхода?
Да, вскоре я поделюсь рабочим синтаксисом YAML для вашей справки в разделе ответов.
Кстати, ваше фактическое требование НЕ состоит в том, чтобы запускать simpleScript в B2
, когда входное значение ${{parameters.String}}
представляет собой пустую строку, что делает значение $(myVar)
пустой строкой, верно?
Да, это правильно
но не тогда, когда параметры. Строка не является пустой строкой, а когда задание A1 пропускается, что приводит к пустой строке в $(myVar) [надеюсь, это имеет смысл]
Это имеет смысл, но немного сбивает с толку то, что вы определили параметр skipA
для пропуска задания A1
, а не этапа A
. В любом случае, решение ниже должно работать для вас. Пожалуйста, сообщите нам результаты вашего теста. Цените свое время и усилия.
Судя по описанию, вы хотите сгенерировать значение выходной переменной myVar
в скрипте во время выполнения конвейера и передать его в templateFile.yml
в качестве параметра. Однако нам не следует оценивать значение параметра в выражениях шаблона ${{parameters}}
, которые обрабатываются во время компиляции, перед выполнением. См. этот документ, который поможет нам Понять синтаксис переменных
Вместо оценки параметра, на который можно ссылаться только в выражениях шаблона, мы должны определить newVar
в выражениях времени выполнения $[variables]
и оценить его значение в свойстве condition
шага. Вот рабочий синтаксис YAML для справки.
basePipeline.yml
trigger: none
pool: 'Default'
parameters:
- name: 'String'
type: string
displayName: 'String'
default: ''
- name: 'skipA'
type: boolean
displayName: 'Skip stage A'
default: false
stages:
- stage: A
jobs:
- job: A1
condition: ne('${{ parameters.skipA }}', true)
steps:
- task: PowerShell@2
displayName: 'Run script 1'
name: script1
inputs:
pwsh: true
filePath: 'outputVariables\scripts\simpleScript.ps1'
arguments: >-
-inputValue "${{ parameters.String }}"
- powershell: |
Write-Host "MyVar is $(script1.myVar)"
displayName: 'Check output'
- stage: B
variables:
myVar: $[ stageDependencies.A.A1.outputs['script1.myVar'] ]
stageDeps: $[ convertToJson(stageDependencies) ]
dependsOn: A
jobs:
- job: B1
steps:
- task: PowerShell@2
displayName: 'Run script 2'
name: script2
inputs:
pwsh: true
filePath: 'outputVariables\scripts\simpleScript.ps1'
arguments: >-
-inputValue "placeholder,$(myVar)"
- powershell: |
Write-Host "myVar output in A1 is $(myVar)"
Write-Host "myVar output in B1 is $(script2.myVar)"
Write-Host "stageDeps is $(stageDeps)"
displayName: 'Check output'
- job: B2
variables:
newVar: $[ format('{0}{1}', variables['myVar'], ',placeholder') ]
steps:
- template: 'templateFile.yml'
parameters:
somethingElse: '$(newVar)'
файл шаблона.yml
parameters:
- name: 'somethingElse'
type: string
steps:
- task: PowerShell@2
condition: ne(variables['newVar'], ',placeholder') # Evaluate the variable value generated during pipeline runtime
displayName: 'Run script 3'
name: script3
inputs:
pwsh: true
filePath: 'outputVariables\scripts\simpleScript.ps1'
arguments: >-
-inputValue "$(newVar)"
- powershell: |
Write-Host "newVar defined in B2 is $(newVar)"
condition: always()
displayName: 'Check output'
Это то, чего я надеялся достичь, большое спасибо.
Привет! Добро пожаловать в SO. Мы не можем правильно оценить значение параметра, сгенерированное во время выполнения, в выражении шаблона
${{ parametes }}
, которое обрабатывается во время компиляции, перед выполнением.