2009-08-20 82 views
0

我为jetbrains工具团队编写了一个插件。它几乎只是一个服务器监听器,用于监听正在触发的构建,并输出一些文本文件,其中包含关于不同构建的信息,如触发它的内容,其中存在多少变化等等。完成后,我编写了一个可以输入当服务器正在运行并踢出构建时,将信息输入teamcity。我希望能够在构建运行后获得构建的构件,但问题是我不知道每个构建运行需要多长时间。有时30分钟是30秒。关于服务器监听器的Python问题

所以我在python中用这条线开始构建。

urllib.urlopen('http://'+username+':'+password+'@localhost/httpAuth/action.html?add2Queue='+btid+'&system.name=<btid>&system.value=<'+btid+'>&system.name=<buildNumber>&system.value=<'+buildNumber+'>') 

构建运行后(某些不确定的时间)我想用这行来获取我的文本文件。

urllib.urlopen('http://'+username+':'+password+'@localhost/httpAuth/action.html?add2Queue='+btid+'&system.name=<btid>&system.value=<'+btid+'>&system.name=<buildNumber>&system.value=<'+buildNumber+'>') 

问题再次出现,我不知道在执行第二行之前要等多久。通常在Java中,我会做第二个线程的睡眠一段时间,并等待构建完成。我不知道如何在Python中做到这一点。因此,如果任何人有一个想法,要么如何做到这一点在Python或更好的方式来做到这一点,我将不胜感激。如果我需要更好地解释我自己,请让我知道。

Grant-

+1

如果构建没有完成并且您打电话给第二块,会发生什么? – Christopher 2009-08-20 17:04:17

+0

它会返回一个http 404错误。这与访问不存在的html页面相同,因为一旦构建完成,文本文件将只存在于服务器上的该位置。 – cozmokramer8 2009-08-20 17:21:24

回答

2

除非你得到由具有堆积服务器联系,这样做是唯一的出路通知投票。您可以按照其他注释中的说明产生线程,只需让主脚本进入休眠状态并进行轮询即可。

喜欢的东西:

wait=True 
while wait: 
    url=urllib.urlopen('http://'+username+':'+password+'@localhost/httpAuth/action.html?add2Queue='+btid+'&system.name=<btid>&system.value=<'+btid+'>&system.name=<buildNumber>&system.value=<'+buildNumber+'>') 
    if url.getcode()!=404: 
    wait=False 
    else: 
    time.sleep(60) 

作为替代方案,你可以使用CherryPy。然后,构建完成后,可以将curl或wget连接到正在聆听的CherryPy服务器,并触发您的应用程序下载该url。

你也可以使用xmlrpclib来做类似的事情。

+0

我想我将不得不轮询。我喜欢你的选择建议,但我有点受限,因为我只能使用服务器上当前安装的内容。这是一个相当大的公司,我没有选择甚至安装额外的Python库:( 感谢您的代码,但只有好奇的是这被认为是不好的编码习惯这样做?它似乎是丑陋的我但显然它必须经常发生。 再次感谢 格兰特 – cozmokramer8 2009-08-20 17:58:55

+0

的问题中断驱动或调查为基础的通知是一个大的。有时候轮询效率更高,有时事件通知是更有效的。我一般喜欢*不*进行轮询,但是有时候更大的体系结构决定会否定使用通知的可能性,在这种情况下,唯一的选择是轮询。关于轮询的一件事情,通常最好使轮询间隔可配置为b/c,而不存在一个真实的民意调查间隔 – Christopher 2009-08-20 18:30:18

+0

再次感谢Christophe你是一个很大的帮助。也感谢关于使其可配置的提示,这是一个好主意。另外,如果其他人在将来阅读这些提示,我也会在25分钟尝试后将循环打破。我这样做是因为有人开始构建然后中断它的机会,所以不会输出文本文件。然后,如果我运行这个脚本,它将处于连续循环。 Grant- – cozmokramer8 2009-08-20 19:40:10

0

的Python实际上有一个threading system是非常相似的Java,所以你应该能够使用没有太多的麻烦。

但是,如果你需要做的就是等待一些时间预定量,使用

import time 
time.sleep(300) # sleep for 300 seconds 
+0

这有点像我在想什么,但我只是不知道那是多少时间。我最初的想法是做同样的time.sleep()命令几秒钟,并尝试找到文件。如果它返回http 404错误,然后再睡几秒钟,然后重试。这看起来像是和丑陋的方法,我希望有一个更优雅的解决方案。 – cozmokramer8 2009-08-20 17:23:14

+0

哦,谢谢你的链接,我现在正在阅读。 :) – cozmokramer8 2009-08-20 17:24:16

+0

@ cozmokramer8:它被称为“投票”或“忙等待”,这是你在这种情况下唯一的选择。 – 2009-08-20 17:38:10