Конвейер Azure DevOps yaml: использование выходных переменных в условиях оценивается неправильно

Я пытаюсь создать выходную переменную, которая позже будет использоваться для других заданий. Однако есть вероятность, что задание, ответственное за его создание, будет пропущено. Чтобы выйти из этого сценария, я попытался добавить «заполнитель» к упомянутой ранее переменной. Однако на более позднем этапе, похоже, условие не равенства оценивается неправильно.

#Вот базовый конвейер:

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.

Привет! Добро пожаловать в SO. Мы не можем правильно оценить значение параметра, сгенерированное во время выполнения, в выражении шаблона ${{ parametes }}, которое обрабатывается во время компиляции, перед выполнением.

Alvin Zhao - MSFT 24.06.2024 13:39

Привет @AlvinZhao-MSFT, спасибо, что так быстро связались. Есть ли обходной путь, который я мог бы попробовать, или мне следует отказаться от этого подхода?

Kopolomo03 24.06.2024 13:46

Да, вскоре я поделюсь рабочим синтаксисом YAML для вашей справки в разделе ответов.

Alvin Zhao - MSFT 24.06.2024 13:47

Кстати, ваше фактическое требование НЕ состоит в том, чтобы запускать simpleScript в B2, когда входное значение ${{parameters.String}} представляет собой пустую строку, что делает значение $(myVar) пустой строкой, верно?

Alvin Zhao - MSFT 24.06.2024 14:09

Да, это правильно

Kopolomo03 24.06.2024 14:13

но не тогда, когда параметры. Строка не является пустой строкой, а когда задание A1 пропускается, что приводит к пустой строке в $(myVar) [надеюсь, это имеет смысл]

Kopolomo03 24.06.2024 14:29

Это имеет смысл, но немного сбивает с толку то, что вы определили параметр skipA для пропуска задания A1, а не этапа A. В любом случае, решение ниже должно работать для вас. Пожалуйста, сообщите нам результаты вашего теста. Цените свое время и усилия.

Alvin Zhao - MSFT 24.06.2024 14:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Судя по описанию, вы хотите сгенерировать значение выходной переменной 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'

Это то, чего я надеялся достичь, большое спасибо.

Kopolomo03 24.06.2024 15:00

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