我们如何配置我们的TFS门控构建验证来捕获解析器验证错误?
例如,我们有一个带有无效语句的存储过程,该语句不断传递门控TFS签入 XAML构建验证,甚至将 SSDT 发布传递给 SQL Server 2008R2 数据库整整两年!
CREATE PROCEDURE This_Should_Fail
AS BEGIN
DECLARE @TableVariable TABLE(
ID INT IDENTITY(1, 1),
Name VARCHAR(MAX)
)
SELECT DISTINCT TOP 1 Name
FROM @TableVariable
ORDER BY ID
END
当我运行此语句时,我收到相应的错误,但当我在TFS中运行完整版本时没有错误!
消息145,级别15,状态1,过程This_Should_Fail,第7行 如果指定了SELECT DISTINCT,则ORDER BY项必须出现在选择列表中。
但直到最近,当定义更改时才会出现错误,在运行时甚至不会抛出任何错误!
CREATE PROCEDURE This_Should_Fail
AS BEGIN
DECLARE @TableVariable TABLE(
ID INT IDENTITY(1, 1),
Name VARCHAR(MAX),
ForeignKeyID INT
)
--create some sample data
INSERT INTO @TableVariable(Name, ForeignKeyID)
VALUES ('Obj1', 999), ('Obj2', 999), ('Obj3', 0), ('Obj4', 0)
DECLARE @ForeignKeyID INT = 999--some lookup here
SELECT DISTINCT TOP 1 Name
FROM @TableVariable
WHERE ForeignKeyID = @ForeignKeyID
END
在TFS分支的更改未能在任何地方部署之前,进行了更改后整整一个月。在这两种情况下,所有选定的列都没有排序。
这让我更加困惑,因为即使在SSMS 2014中手动运行,TFS中的任何版本(我都不能包括因为它是我的公司的IP)都会引发任何错误!
感谢。
答案 0 :(得分:1)
门控签到是一种持续集成构建的形式。在TFS中,它创建一个包含正在验证的代码的shelveset,然后运行该代码的构建。只有代码成功构建且所有已配置的单元测试通过,才能实际签入代码。
换句话说,验证由您的构建/测试直接控制,而不是由TFS控制。如果构建未捕获错误或未通过测试测试。然后它会在实际部署到服务器后生效。
执行此操作的一种方法是捕获构建的日志信息,然后使用Logging Commands和exit 1
使构建失败。更多细节您可以参考这个问题:How to fail the build from a PowerShell task in TFS 2015(对于vNext构建)