我的 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) - 不起作用
这对我有用:
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