Azure Pipelines中PowerShell@2任务失败后如何终止流水线运行?
解决Azure Pipelines中PowerShell任务失败后未终止流水线的问题
问题根源
PowerShell默认不会因为sqlcmd这类外部命令的退出错误码自动标记任务失败,即便continueOnError保持默认的false也无效。你设置的failOnStderr: true仅会在命令将错误输出到stderr时触发任务失败,但sqlcmd部分错误仅通过退出码返回、未输出到stderr,导致任务未被标记为失败,后续步骤仍继续执行。
解决方案
修改PowerShell脚本,显式捕获sqlcmd的退出码,手动触发任务失败:
- task: PowerShell@2 displayName: "Delete TEST DB" condition: eq('${{ parameters.dataresetenv }}', 'test') env: TEST_DB_USERNAME: $(TEST_DB_USERNAME) TEST_DB_PASSWORD: $(TEST_DB_PASSWORD) inputs: failOnStderr: true targetType: 'inline' script: | $resourceGroupName = 'MY-TEST-RESOURCE-GROUP' $ServerName = "my-test-server.database.windows.net" # 执行sqlcmd删除数据库命令 sqlcmd -S $ServerName -U "$(TEST_DB_USERNAME)" -P "$(TEST_DB_PASSWORD)" -q "DROP Database [MY-TEST-DB];" # 捕获sqlcmd的退出码,非0则终止任务并标记失败 if ($LASTEXITCODE -ne 0) { Write-Error "删除测试数据库失败,sqlcmd退出码: $LASTEXITCODE" exit 1 }
关键说明
$LASTEXITCODE是PowerShell存储外部命令退出码的内置变量,sqlcmd执行失败时会返回非0值。- 通过
exit 1可让PowerShell任务明确标记为失败,触发流水线的失败逻辑,自动终止后续步骤的执行(无需额外修改后续步骤的条件,默认失败任务后的步骤会自动跳过)。
内容的提问来源于stack exchange,提问作者starrywrites
相关产品推荐
相关产品推荐

