Is there a tool to validate an Azure DevOps Pipeline locally?

在对 YAML 定义的 Azure DevOps 管道进行更改时,仅仅看到构建失败并出现解析错误(有效的 YAML,但是无效的管道定义) ,然后尝试反复试验修复问题,这可能是相当乏味的。

如果反馈循环可以变得更短就好了,通过本地分析和验证管道定义; 基本上就是一个可以在 Azure 管道中定义的关于各种资源等知识的链接。然而,我还没有找到任何工具可以做到这一点。

有这样的工具吗?

51970 次浏览

更新 : 此功能在2019年10月为 第2479期删除


您可以使用其 YAML 测试特性在本地运行 Azure DevOps 代理。

  1. 微软/天青管道代理项目中,在本地计算机上安装代理。
  2. 然后使用 运行本地(仅内部)上的 docs 页面访问代理中可用的特性。

这应该会让你非常接近你所期望的反馈类型。

仅供参考-此功能已在 第2479期 -删除对“本地运行”特性的引用中删除

考虑到 Github Actions 有 在本地运行操作的能力,希望他们稍后会把它带回来

Azure DevOps 提供了一个 运行预览 API 端点,它接受 yaml 覆盖并返回扩展后的 yaml。我将此支持添加到 蓝色管道 powershell 模块。下面的命令将执行 id 为01但使用 yaml 覆盖的管道,并返回扩展的 yaml 管道。

Preview - Preview 服务范围: Pipelines 电视宣传短片版本: 6.1-预览1 对管道的试运行进行排队,并返回包含最终 yaml 的对象。

# AzurePipelinesPS session
$session = 'myAPSessionName'


# Path to my local yaml
$path = ".\extension.yml"


# The id of an existing pipeline in my project
$id = 01
        

# The master branch of my repository
$resources = @{
repositories = @{
self = @{
refName = 'refs/heads/master'
}
}
}


Test-APPipelineYaml -Session $session -FullName $path -PipelineId $id -Resources
$resources

这种工具目前还不存在——在他们的反馈渠道中存在一些问题:

作为一种变通方法——您可以在自己的机器上安装 Azure devops build agent,注册为自己的 build pool,并使用它来构建和验证 yaml 文件的正确性。参见 杰米在这个帖子里的回答

当然,这意味着您需要不断地在官方构建代理和您自己的构建池之间切换,这是不好的。另外,如果有人不小心通过您自己的机器推动了一些更改-您可能会遇到各种各样的问题,这些问题可能发生在正常的构建机器中。(像 ui 提示一样,在你自己的机器上运行敌对代码,等等,因为第三方可执行的执行,敌对代码甚至可能是意外的病毒感染)。

There are two approaches which you can take:

  1. 使用 cake (Frost)在本地执行构建,以及在 Azure Devops 上执行构建。
  2. 使用 powershell 在本地以及 Azure Devops 上执行构建。

通常1对2-1有更多的内置机制,比如在 Azure devops 上发布(也支持其他构建系统提供者,比如 github 操作,等等...)。

(我个人建议使用第一种选择)

至于1: Read for example following links to have slightly better understanding:

Search for existing projects using "Cake.Frosting" on github to get some understanding how those projects works.

As for 2: it's possible to use powershell syntax to maximize the functionality done on build side and minimize functionality done on 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 文件内容的数量。

请注意,我还添加了上一个 Execute.ps1脚本复制为 lastRun.ps1文件。

如果您发现某些不可重复的问题,可以在构建后使用它——但是您希望在自己的计算机上运行相同的命令来测试它。

您可以使用’字符在下一行继续 ps1的执行,或者在它已经是复杂结构的情况下(例如 @{)-它可以按照。

但是即使这样 yaml 语法被最小化了,它仍然需要进行测试——如果您想要使用不同的构建阶段和多个构建机器的话。一种方法是使用特殊类型的参数 -noop,它不执行任何操作,而只打印要执行的内容。通过这种方式,您可以立即运行管道,并检查计划执行的所有内容都将得到执行。

尝试在标准文本编辑器中手动编写整个 YAML 文件可能会很麻烦。取而代之的是 Azure DevOps 操作的开源扩展,它们可以让你的生活更加轻松。例如,我的一个朋友最近推荐了 白源闪电,当时我正试图在 YAML 管道中添加一个构建任务,你可以很容易地免费安装并配置你的管道,我觉得使用带有 Whitesourcebolt 的 Azure DevOps 要容易得多。 现在,要将构建任务添加到 YAML 管道,请按照以下步骤操作:

  1. In the pipeline edit page, from the right side, click 演出助理. The Tasks sidebar is displayed.
  2. 在搜索栏中,输入 白色资源。将显示 WhiteSource 任务。

Screenshot attached

  1. 单击 WhiteSource Bolt 任务。
  2. 在右下角,单击 Add。 WhiteSource Bolt 任务将添加到管道中。
  • 任务: WhiteSource@21
  • 输入: cwd: '$(System.DefaultWorkingDirectory)'
  1. 若要指定要在 WhiteSource 要素中创建的 WhiteSource 项目的名称,请将以下内容添加到 WhiteSource 任务中。在下面的示例中,将 New _ Project _ Name 替换为要赋予 WhiteSource 项目的名称: 注意 : 不能在第一次生成运行后更改项目名称。
  • Task: WhiteSource@21
  • 输入: cwd: '$(System.DefaultWorkingDirectory)'
  • 项目名称: New_Project_Name

如果 YAML 中有错误,那么扩展本身将为您验证它并提供错误详细信息。有关如何将生成任务添加到 YAML 管道的详细信息,请检查上面的链接。

如果您有一个包含关于如何组成 YAML 文件的规则的模式,则可以验证使用 YAML 和 YAML 描述的管道。它将作为您描述的案例的简短反馈,特别是对于语法解析错误。几乎任何 IDE 都可以使用 YAML 模式验证。因此,我们需要:

  1. YAML 模式-根据我们将验证管道的内容
  2. An IDE (VS Code as a popular example) - which will perform validation on the fly
  3. 配置上面的两个组件,以便为更大的利益一起工作

模式可以在很多地方找到,对于这种情况,我建议使用 < a href = “ https://www.schemastore.org/json/”rel = “ norefrer”> https://www.schemastore.org/json/ 它有 Azure 管道模式(这个模式包含一些问题,比如与 Microsoft 文档相比不同类型的值,但仍然包含无效语法的情况)

VS Code will require an additional plug-in to perform YAML text validation, there are also a bunch of those, who can validate schema. I'll suggest try 来自 RedHat 的 YAML (I know, the rating of the plugin is not the best, but it works for the validation and is also configurable)

在 VS Code 插件的设置中,您将看到一个关于验证的部分(如屏幕快照)

YAML Schema validation plugin settings

现在您可以添加到所需的模式设置中,甚至不需要将其下载到您的机器上:

    "yaml.schemas": {
    

"https://raw.githubusercontent.com/microsoft/azure-pipelines-vscode/v1.174.2/service-schema.json" : "/*"
}

只需保存设置并重新启动您的 VS 代码。 您将在 YAML Azure DevOps 管道文件中注意到有关问题的警告(如果有的话)。以下屏幕截图的验证失败:

enter image description here

请参阅 更多细节请点击这里

我可以告诉你我们如何处理这种脱节。

We use only pipeline-as-code, yaml.

我们使用 ZERO yaml 模板,并严格执行一个文件 pr 管道。

我们使用 vscode 的 Azure yaml 扩展,在编辑器中获得类似于 linter 的行为。

我们在管道中所做的大部分实际工作都是通过调用 PowerShell 完成的,通过合理的默认设置也可以在 CLI 中调用,这意味着我们实际上可以在本地执行任何相关的东西。

例外情况是只有代理和实际管道的配置,例如下载工件任务和发布任务等。

让我举几个例子:

Here we have the step that builds our FrontEnd components: enter image description here

这里我们在 CLI 中运行这一步:

enter image description here

我不会发布实际管道运行的屏幕快照,因为清理它需要很长时间,但它基本上是相同的,还有一些更多的跟踪信息,由 run.ps1 call-wrapper 提供。