Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使自定义Visual Studio Team Services生成任务失败(使用PowerShell)?_Powershell_Azure Devops_Azure Pipelines Build Task - Fatal编程技术网

如何使自定义Visual Studio Team Services生成任务失败(使用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

我创建了一个VisualStudioTeamServices扩展,它提供了几个构建任务。所有任务都作为PowerShell脚本实现

一切似乎都像预期的那样工作,但后来我意识到,当一个任务出现错误时,并没有破坏构建,这是应该的

我假设返回非零退出代码的PowerShell脚本会破坏构建,但事实并非如此。为了确认这一点,我仅用这一行创建了一个非常简单的任务:

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似乎更通用、更简单。