我需要在TeamCity中运行名为sc.exe
的应用程序作为构建过程的一部分。这个小应用程序打开了通往Sauce Labs的隧道,应用程序本身运行正常。该应用程序的一个特性是当它启动并准备好通过隧道支持Sauce上的测试时,它会输出消息Sauce Connect is up, you may now start your tests.
应用程序需要继续在本地运行以保持隧道打开。
sc.exe
不会退出,但是我需要构建步骤来发送退出代码,以便它可以知道隧道已启动,我们已准备就绪。我希望Perl脚本exit
0
并让sc.exe
进程保持运行状态。我在Perl中写了这个小跑者脚本:
#!/user/bin/perl
use strict;
use warnings;
my $result = `sc -v --pac file://browsermob.js -u $ENV{SAUCE_USER_NAME} -k $ENV{SAUCE_API_KEY}`;
for (my $i = 0; $i < 60; $i++) {
if ($result =~ /Sauce Connect is up, you may start your tests\./) {
print $result;
exit 0;
}
sleep(1);
}
die "Did not detect open Sauce Connect tunnel.";
现在,请记住,当我从终端运行它时,反引号中的系统调用确实有效,而sc.exe
的输出在这种情况下是预期的。当我运行这个Perl脚本时,隧道确实启动了 - 我可以登录Sauce Labs并看到隧道是活动的。但是,此脚本既不会退出0
也不会退出die
。它能做什么?
我觉得我像往常一样缺少一些如此明显的东西。
在Win 7 x64或Windows Server 2008上运行,结果相同。
答案 0 :(得分:7)
由于反引号中的命令永远不会退出,因此它永远不会返回并且不会填充$result
。尝试在管道中启动命令并从中读取:
open(my $sc, "-|", "sc -v --pac file://browsermob.js -u $ENV{SAUCE_USER_NAME} -k $ENV{SAUCE_API_KEY} &");
while (<$sc>) {
print && exit 0 if /Sauce Connect is up, you may start your tests\./;
}
close $sc;
请注意命令末尾的&
以在后台运行命令。
要在60秒后让它超时,请使用alarm:
local $SIG{ALRM} = sub { die "Did not detect open Sauce Connect tunnel." };
alarm 60;