如何使自定义Visual Studio Team Services生成任务失败(使用PowerShell)?
我创建了一个VisualStudioTeamServices扩展,它提供了几个构建任务。所有任务都作为PowerShell脚本实现 一切似乎都像预期的那样工作,但后来我意识到,当一个任务出现错误时,并没有破坏构建,这是应该的 我假设返回非零退出代码的PowerShell脚本会破坏构建,但事实并非如此。为了确认这一点,我仅用这一行创建了一个非常简单的任务:如何使自定义Visual Studio Team Services生成任务失败(使用PowerShell)?,powershell,azure-devops,azure-pipelines-build-task,Powershell,Azure Devops,Azure Pipelines Build Task,我创建了一个VisualStudioTeamServices扩展,它提供了几个构建任务。所有任务都作为PowerShell脚本实现 一切似乎都像预期的那样工作,但后来我意识到,当一个任务出现错误时,并没有破坏构建,这是应该的 我假设返回非零退出代码的PowerShell脚本会破坏构建,但事实并非如此。为了确认这一点,我仅用这一行创建了一个非常简单的任务: exit 1 并检查构建是否成功 我还发现脚本中未捕获的异常确实会导致构建失败 因此,如何从构建任务中通知失败 更新:我正在使用task.j
exit 1
并检查构建是否成功
我还发现脚本中未捕获的异常确实会导致构建失败
因此,如何从构建任务中通知失败
更新:我正在使用task.json和脚本:
task.json:
{
"id": "7CA6E75B-0700-4723-83A7-C167EA514988",
"name": "ExampleTask",
"friendlyName": "Example build task",
"description": "Example build task for development purposes",
"author": "eduardomhg",
"category": "Utility",
"visibility": [
"Build",
"Release"
],
"demands": [],
"version": {
"Major": "0",
"Minor": "0",
"Patch": "1"
},
"minimumAgentVersion": "1.83.0",
"instanceNameFormat": "Example Task",
"groups": [
{
"name":"advanced",
"displayName":"Advanced",
"isExpanded":false
}
],
"execution": {
"PowerShell": {
"target": "$(currentDirectory)\\ExampleTask.ps1",
"argumentFormat": "",
"workingDirectory": "$(currentDirectory)"
}
}
}
示例Task.ps1:
Write-Host "Executing example task..."
exit 1
TL;博士
基于PowerShell开发自定义任务时:
PowerShell脚本在完成其任务时应返回0,如果结果为正或负,则不尊重。
当任务无法正确完成时,它必须返回一个不同于0的值,例如基础结构问题、语法错误或意外异常等。
当任务的作业完成时,失败或成功必须始终与VSTS任务库SDK的API或vso[task.complete]命令进行通信。
详细信息:使用您在“task.json”文件的“execute”部分指定的C类启动PowerShell脚本;可能的基于PS的处理程序包括:
动力壳3
动力壳
PowerShellExe
“PowerShell3”或不推荐使用的“PowerShell”处理程序:
基于PowerShell创建自定义任务时必须使用;这意味着您的任务与至少一个PS脚本捆绑在一起,该脚本在“执行”部分的task.json中指定
无论任务结果是正常还是失败,都期望退出代码等于0
当脚本执行期间出现内部错误时,期望值不同于0,这意味着脚本无法完全完成其作业,即任务作业的结果甚至未知时。简言之,退出代码与任务作业的正/负结果无关。作业完成时,无论是负面还是正面,退出代码必须为0。
出口代码等于0的要求如下:
在,;
在中,它明确指出应使用上述命令在标准输出上指示任务失败;
这一点在生成摘要中也很清楚,在生成摘要中,当返回不同于0的退出代码时(例如,当使用[Environment]::Exit1时),会将生成摘要弄乱,如红色框中所示。
相反,当以0退出代码优雅地退出失败的任务,并使用Write-VstsSetResult-API绿色框设置结果时,您会得到一个干净的生成摘要。
相反,“PowerShellExe”处理程序执行由最终用户提供的PowerShell脚本:在这种情况下,此处理程序遵循普通命令制服的普通规则,即:
-结果状态等于0,表示执行成功;
-不同于0的结果,表示执行失败
进一步详情:
在开发基于PowerShell的自定义任务时,利用这些功能,可以向代理发出一些命令。其中之一是告诉结果任务执行的成功或失败:这可以通过调用API函数来完成
否则,如果无法使用SDK,则仍可在标准输出上打印以下命令:
##vso[task.complete result=Succeeded|SucceededWithIssues|Failed|Cancelled|Skipped]
这与Write VstsSetResult函数下面使用的命令相同
代理确实截取并使用任务的标准输出,它识别并执行命令
当任务能够在失败或成功时完成其作业时,它必须返回退出代码0,并使用上述命令设置结果。只有当任务无法完成其作业时,才能使用不同于0的退出代码进行通信。TL;博士
基于PowerShell开发自定义任务时:
PowerShell脚本在完成其任务时应返回0,如果结果为正或负,则不尊重。
当任务无法正确完成时,它必须返回一个不同于0的值,例如基础结构问题、语法错误或意外异常等。
当任务的作业完成时,失败或成功必须始终与VSTS任务库SDK的API或vso[task.complete]命令进行通信。
详细信息:使用您在“task.json”文件的“execute”部分指定的C类启动PowerShell脚本;可能的基于PS的处理程序包括:
动力壳3
动力壳
PowerShellExe
“PowerShell3”或不推荐使用的“PowerShell”处理程序:
基于PowerShell创建自定义任务时必须使用;这意味着你的助教
k与至少一个PS脚本捆绑在一起,该脚本在“execute”部分的task.json中指定
无论任务结果是正常还是失败,都期望退出代码等于0
当脚本执行期间出现内部错误时,期望值不同于0,这意味着脚本无法完全完成其作业,即任务作业的结果甚至未知时。简言之,退出代码与任务作业的正/负结果无关。作业完成时,无论是负面还是正面,退出代码必须为0。
出口代码等于0的要求如下:
在,;
在中,它明确指出应使用上述命令在标准输出上指示任务失败;
这一点在生成摘要中也很清楚,在生成摘要中,当返回不同于0的退出代码时(例如,当使用[Environment]::Exit1时),会将生成摘要弄乱,如红色框中所示。
相反,当以0退出代码优雅地退出失败的任务,并使用Write-VstsSetResult-API绿色框设置结果时,您会得到一个干净的生成摘要。
相反,“PowerShellExe”处理程序执行由最终用户提供的PowerShell脚本:在这种情况下,此处理程序遵循普通命令制服的普通规则,即:
-结果状态等于0,表示执行成功;
-不同于0的结果,表示执行失败
进一步详情:
在开发基于PowerShell的自定义任务时,利用这些功能,可以向代理发出一些命令。其中之一是告诉结果任务执行的成功或失败:这可以通过调用API函数来完成
否则,如果无法使用SDK,则仍可在标准输出上打印以下命令:
##vso[task.complete result=Succeeded|SucceededWithIssues|Failed|Cancelled|Skipped]
这与Write VstsSetResult函数下面使用的命令相同
代理确实截取并使用任务的标准输出,它识别并执行命令
当任务能够在失败或成功时完成其作业时,它必须返回退出代码0,并使用上述命令设置结果。只有当任务无法完成其作业时,才能使用不同于0的退出代码进行通信。您可以添加以下行以使任务失败:
"##vso[task.complete result=Failed]"
这将告诉VSTS任务失败。您可以添加以下行以使任务失败:
"##vso[task.complete result=Failed]"
这将告诉VSTS任务失败。尝试改用此代码:
[Environment]::Exit(1)
请尝试改用此代码:
[Environment]::Exit(1)
我没有使用Microsoft提供的预定义PowerShell任务之一,但使用PowerShell任务开发自定义任务可以通过其他几种方式实现。我没有使用Microsoft提供的预定义PowerShell任务之一,但是,使用PowerShell任务开发自定义任务可以通过其他几种方式实现。您是否可以共享task.json及其调用的任何脚本?您是否尝试过简单地使用write-error cmdlet?write-error cmdlet工作会导致生成失败,答案中建议的其他解决方案也是如此,所以想知道报告失败的正确方法是什么…你能共享task.json和它调用的任何脚本吗?你有没有尝试过简单地使用write-error cmdlet?write-error cmdlet工作会导致构建失败,就像答案中建议的其他解决方案一样,所以想知道报告失败的正确方法是什么…这似乎是可行的!然而,我很难看出它与exit关键字之间的区别。直觉上,我会说退出应该足以将故障通知回调用方,但我不是PowerShell的专家,所以我可能在这里遗漏了一些明显的东西。@EduardoHernández据我所知,[环境]::Exit1终止此过程并返回退出代码。找不到关于它们之间不同的详细文章,您可以为此问题打开一个新线程。另一方面,如果问题解决了,你可以将其标记为答案。这似乎有效!然而,我很难看出它与exit关键字之间的区别。直觉上,我会说退出应该足以将故障通知回调用方,但我不是PowerShell的专家,所以我可能在这里遗漏了一些明显的东西。@EduardoHernández据我所知,[环境]::Exit1终止此过程并返回退出代码。找不到关于它们之间不同的详细文章,您可以为此问题打开一个新线程。另一方面,如果解决了问题,您可以将其标记为“答案”。这是可行的,但[Environment]::Exit似乎更通用、更简单。这是可行的,但[Environment]::Exit似乎更通用、更简单。