0

我们正在从 ccnet 转移到 teamcity,所以我的问题可能只是无知,但无论如何:

我有一个 cmd line hack 可以检查构建中的“Todo”注释并输出计数:

findstr /s /i "TODO" *.cs | find /c "":""

或者

findstr /s /i TODO *.cs | find /c "":"" >todo.txt

现在,如果构建大于 0,我想使构建失败,但我无法弄清楚如何做到这一点。我相信如果我可以将结果注入到构建日志中会是最好的

我该怎么做呢?

4

2 回答 2

1

如果我正确理解您的要求,如果您在任何包含字符串 TODO 的 .cs 文件中找到至少一行以及?(其他一些字符串)。

我相信您的 FIND 命令已损坏。正如所写,它在名为:. 我相信您想搜索管道 FINDSTR 命令的输出。但我不明白你想用 FIND 寻找什么字符串。

FIND 搜索字符串必须用双引号括起来 - "search"。如果搜索要包含双引号,则每个双引号必须用另一个双引号转义。要搜索She said "Hello",您需要"She said ""Hello""".

我怀疑您使用 FIND 命令是因为您想要计数。但是由于您只是在寻找字符串的存在(计数> 0),因此您不需要实际计数。输出可以重定向到 nul,如果找到字符串,可以使用 && 运算符采取行动。

您应该能够使用正则表达式使用单个 FINDSTR 命令执行搜索。我将假设您正在寻找包含:在某个点后跟的任何行TODO(不区分大小写)。该表达式.*匹配除换行符以外的任何字符 0 次或更多次。所以你的搜索字符串是:.*TODO. 如果我:弄错了,并且您需要在搜索中包含双引号,那么每个双引号都需要用反斜杠转义,例如\".

您正在所有子目录中进行递归不区分大小写的正则表达式搜索,因此您需要/s,/r/i选项。

FINDSTR 将在每个空格处将任何字符串拆分为多个搜索,除非您使用该/c:选项。我认为您的搜索没有空格,但我喜欢以/c任何方式使用该选项。通常,搜索字符串也用双引号括起来。

完整的命令是

>nul findstr /sri /c:":.*TODO" *.cs && echo Do something to make the build fail

我的问题是我不了解 TeamCity,所以我不知道如何向 TeamCity 发出信号以中止构建。如果找到搜索字符串,我只是打印了一条消息,但显然需要采取其他一些措施。

编辑以回应评论

好的 - 根据您的评论,TeamCity 似乎用另一个双引号转义了双引号。所以在你原来的问题中实际执行的命令变成了

findstr /s /i TODO *.cs | find /c ":" >todo.txt

正如你所说,这完全没问题。

在这种情况下,我对使用单个 FINDSTR 的建议应该是完美的。由于您的搜索不需要空格,我们可以一起消除引号。如果 TeamCity 可以检查返回的错误代码并采取措施,那真的很简单。

>nul findstr /sri :.*TODO *.cs

如果找到字符串,则错误代码将为 0,如果未找到,则为 1。

如果您需要错误代码为 1(如果找到)和 0(如果未找到),那么只需使用

>nul findstr /sri :.*TOTO *.cs && (exit 1) || (exit 0)


如果你真的想使用你原来的命令

findstr /s /i "TODO" *.cs | >nul find /c "":""

如果找到将返回错误代码 0,如果未找到则返回 1

findstr /s /i "TODO" *.cs | >nul find /c "":"" && (exit 1) || (exit 0)

如果找到将返回错误代码 1,如果未找到则返回 0

于 2012-06-19T11:59:39.830 回答
0

事实证明,问题不是我的 cmdline,而是我从 teamcity 调用它的方式。您的输入 dbenham 仍然非常有用,因为我可能会根据您的建议使构建失败并且仍然显示违规行的数量。

非常感谢 :)

正确用法如下图!

正确设置命令行的 teamcity 中 buildstep 的图片

于 2012-06-19T14:24:23.100 回答