Jenkins的ZMQ活动发布者没有发送通知

时间:2014-09-26 02:37:34

标签: jenkins zeromq pyzmq

我一直试图弄清楚我的Jenkins ZMQ事件发布者配置出了什么问题超过23个小时而已经放弃了。希望你可能知道我做错了什么。

  • 我已经使用ZMQ-event-publisher插件安装了Jenkins,并在Manage Jenkins - > Configure System下检查了Enable on all Jobs注意 TCP port to publish on设置为8888)。
  • 创建了一份新工作,选中了Check if ZMQ events should be published for this project并点击了Save
  • 我使用pyZMQ

    编写了一个Python脚本
    #!/usr/bin/env python
    import zmq
    port = "8888"
    context = zmq.Context()
    socket = context.socket(zmq.SUB)
    
    socket.connect("tcp://localhost:%s" % port)
    socket.setsockopt(zmq.SUBSCRIBE, '')
    print "Jenkins... waiting..."
    string = socket.recv()
    print "recv =>", string
    
  • 在Jenkins机器上执行上述脚本+运行Jenkins作业。

不幸的是,该脚本没有收到来自Jenkins的任何ZMQ消息。 尝试使用tcpdump -i eth0 'port 8888'tcpdump -i lo 'port 8888'捕获ZMQ消息也无济于事。

除此之外,查看/var/log/jenkins/jenkins.log,我得到:

Sep 25, 2014 8:54:47 PM org.jenkinsci.plugins.ZMQEventPublisher.ZMQRunnable bindSocket
INFO: Binding ZMQ PUB to port 8888
Sep 25, 2014 8:54:48 PM hudson.model.Run execute
INFO: MyJob #18 main build action completed: SUCCESS

此外,netstat -ntlp验证

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 :::8888                     :::*                        LISTEN      31/java             
tcp        0      0 :::57467                    :::*                        LISTEN      31/java             
tcp        0      0 :::8009                     :::*                        LISTEN      31/java             
tcp        0      0 :::59373                    :::*                        LISTEN      31/java             
tcp        0      0 :::8080                     :::*                        LISTEN      31/java 

那么,我做错了什么? 关于如何正确配置Jenkins ZMQ插件没有很好的解释,看看插件代码并没有透露太多。

我们非常感谢您的帮助。

感谢。

编辑:戴夫的建议很棒,但尚未解决问题。

编辑2 :看起来它失败了,因为Jenkins一直在从Docker容器运行,我忘了暴露它的所有端口。然而,看起来戴夫的建议确实解决了这个问题。耶!!!

1 个答案:

答案 0 :(得分:2)

来自ZMQ Guide

  

请注意,使用SUB套接字时,必须使用zmq_setsockopt()和SUBSCRIBE设置订阅

我怀疑您的订阅者脚本没有看到事件,因为您需要设置订阅过滤器。如zmq_setsockopt page所述,将过滤器设置为空字符串可以订阅所有消息。

尝试添加:

socket.setsockopt(zmq.SUBSCRIBE, '')