这种工具目前不存在 - 他们的反馈渠道中存在一些问题:
作为一种解决方法 - 您可以在自己的机器上安装 azure devops 构建代理,注册为自己的构建池,并使用它来构建和验证 yaml 文件的正确性。见Jamie's answer in this thread
当然,这意味着您需要在官方构建代理和您自己的构建池之间不断切换,这并不好。此外,如果有人不小心通过您自己的机器推送了一些更改 - 您可能会遇到各种问题,这可能发生在正常的构建机器中。 (如 ui 提示、在您自己的机器上运行恶意代码等 - 由于第三方可执行文件执行,恶意代码甚至可能是意外病毒感染)。
作为解决此问题的一种方法 - 可以使用 powershell 语法来最大化在构建端完成的功能并最小化在 azure devops 上完成的功能。
parameters:
- name: publish
type: boolean
default: true
parameters:
- name: noincremental
type: boolean
default: false
...
- task: PowerShell@2
displayName: invoke build
inputs:
targetType: 'inline'
script: |
# Mimic build machine
#$env:USERNAME = 'builder'
# Backup this script if need to troubleshoot it later on
$scriptDir = "$(Split-Path -parent $MyInvocation.MyCommand.Definition)"
$scriptPath = [System.IO.Path]::Combine($scriptDir, $MyInvocation.MyCommand.Name)
$tempFile = [System.IO.Path]::Combine([System.Environment]::CurrentDirectory, 'lastRun.ps1')
if($scriptPath -ne $tempFile)
{
Copy-Item $scriptPath -Destination $tempFile
}
./build.ps1 'build;pack' -nuget_servers @{
'servername' = @{
'url' = "https://..."
'pat' = '$(System.AccessToken)'
}
'servername2' = @{
'url' = 'https://...'
'publish_key' = '$(ServerSecretPublishKey)'
}
} `
-b $(Build.SourceBranchName) `
-addoperations publish=${{parameters.publish}};noincremental=${{parameters.noincremental}}
然后在 build.ps1 上处理所有必要的参数。
param (
# Can add operations using simple command line like this:
# build a -add_operations c=true,d=true,e=false -v
# =>
# a c d
#
[string] $addoperations = ''
)
...
foreach ($operationToAdd in $addoperations.Split(";,"))
{
if($operationToAdd.Length -eq 0)
{
continue
}
$keyValue = $operationToAdd.Split("=")
if($keyValue.Length -ne 2)
{
"Ignoring command line parameter '$operationToAdd'"
continue
}
if([System.Convert]::ToBoolean($keyValue[1]))
{
$operationsToPerform = $operationsToPerform + $keyValue[0];
}
}
这将允许在您自己的机器上本地运行所有相同的操作并最大限度地减少 yaml 文件内容的数量。
请注意,我还添加了最后执行 .ps1 脚本复制为 lastRun.ps1 文件。
如果您发现一些不可重现的问题,您可以在构建后使用它 - 但您想在自己的机器上运行相同的命令来测试它。
您可以使用 ` 字符在下一行继续执行 ps1,或者如果它已经是复杂的结构(例如@{) - 它可以继续执行。
但即使这样 yaml 语法被最小化,它仍然需要测试 - 如果你想要不同的构建阶段和使用多个构建机器。一种方法是使用特殊类型的参数-noop,它不执行任何操作 - 但只会打印打算执行的内容。通过这种方式,您可以立即运行您的管道并检查计划执行的所有内容 - 将被执行。