从 PS1 文件创建变量,从另一个阶段调用时该变量为空(DevOps YAML)

问题描述 投票:0回答:1

我的 YAML 文件有两个阶段。第一阶段是根据传入的运行时参数专门设置变量。 (在脚本的参数中使用)

stages:
- stage: A
  displayName: Setting Variables
  jobs:
    - deployment: A1
      environment: "<ENVIROMENT>"
      displayName: Set Variables
      strategy:
       runOnce:
        deploy:
         steps:
          - task: PowerShell@2
            inputs:
             targetType: filePath
             filePath: 'F:\Files\Powershell\Users.ps1'
             arguments: '-StaffName "${{ parameters.StaffName }}" -SiteName "${{ parameters.SiteName  }}" -server "$(DBServerName)" -database "DatabaseBackups" -username "$(DBUser)" -password "$(DBPassword)"'
            name: person

该脚本执行其魔法并从 SQL Server DB 获取数据,然后将其写入输出变量(至少,这就是我想要做的),在日志文件中它显示为该任务正确设置了变量

# Output the retrieved data as YAML
Write-Host "ForeName variable = $FirstName"
Write-Host "##vso[task.setvariable variable=ForeName;isOutput=true]$FirstName"
Write-Host "AzureEmail = $AzureEmail"
Write-Host "##vso[task.setvariable variable=AzureEmail;isOutput=true]$AzureEmail"
Write-Host "DBName = $DBName"
Write-Host "##vso[task.setvariable variable=DBName;isOutput=true]$DBName"

但是,在第二阶段,我尝试使用在上一阶段创建的输出变量。我已经在前一个阶段设置了依赖项(尽管我知道在使用 stageDepcies 时不需要这样做,我已经尝试过不依赖依赖项,但它没有什么区别),在阶段级别创建了变量。然而,当我运行管道时,任务已运行并且变量为空。

- stage: UseVariablesStage
  dependsOn: A
  variables: 
   ForeName: $[ stageDependencies.A.A1.outputs['person.ForeName'] ]
  jobs:
  - deployment: UseVariables
    environment: "<ENVIROMENT>"
    strategy:
      runOnce:
        deploy:
          steps:
          - script: echo $(ForeName)

我尝试将 PS1 文件中的变量输出设置为只读(认为它被覆盖) - 不起作用

我尝试将阶段标记为依赖于前一个阶段,而不是使用阶段依赖项,而是使用依赖项(如果这有意义吗?) - 不起作用

我尝试了不同的语法来使用变量,例如 ($env:ForeName) - 不起作用

powershell variables yaml azure-pipelines-yaml azure-devops-multistage-pipeline
1个回答
0
投票

这对我有用:

name: $(Build.DefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)

trigger: none

pool: Default

stages:
  - stage: set_stage
    displayName: Set variable
    jobs:
      - job: set_job
        displayName: Set Pipeline Variable
        steps:
          - pwsh: |
              Write-Host "##vso[task.setvariable variable=FullName;isOutput=true;issecret=false;isreadonly=true]John Doe"
            displayName: 'Set Pipeline Variable'
            name: Person
          - pwsh: |
              Write-Host "Hello $(Person.FullName)"
            displayName: 'Display Pipeline Variable'

  - stage: read_stage
    displayName: Read variable
    dependsOn: set_stage
    jobs:
      - job: read_job
        displayName: Read Pipeline Variable
        variables:
          personName: $[stageDependencies.set_stage.set_job.outputs['Person.FullName']]
        steps:
          - pwsh: |
              Write-Host "Hello $(personName)"
            displayName: 'Read Pipeline Variable'

最大的区别是我运行的是内联脚本而不是脚本文件,但我认为这没有太大区别。但无论如何,如果其他一切都失败了,请尝试同样的方法。

我在管道日志中注意到的一件事(在诊断模式下运行时)是

Processed
文本,它表示变量设置正确:

##[调试]已处理:##vso[task.setvariable 变量=FullName;isOutput=true;issecret=false;isreadonly=true]John Doe

© www.soinside.com 2019 - 2024. All rights reserved.