有一段时间我无法从我的GitLab实例运行webhooks。起初我以为它是与GitLab升级〜10.0版本相关的东西,或者是一些iptables,但是现在我认为它可能更像Ruby的东西以及如何调用Shippable端点(在Ruby中?)。
在失败的请求网站上,我可以看到以下信息:
execution expired
https://[username:password]@api.shippable.com/projects/[project id]/newBuild
- 由Shippable在启用项目时自动生成Push Hook
首先,我测试了枯萎,我实际上可以从服务器连接Shippable
curl --verbose -X POST -H "Content-Type: application/json" -H "X-Gitlab-Event: $event" --data "$json" $url
请求成功,这让我认为这不是iptables的问题(但是我检查了没有,没有设置iptables规则)。
然后我尝试在/opt/gitlab/embedded/bin/irb
:
require 'net/http'
require 'net/https'
uri = URI.parse(url)
username = uri.userinfo.split(':')[0]
password = uri.userinfo.split(':')[1]
req = Net::HTTP::Post.new(uri.path, {'Content-Type' =>'application/json', 'X-Gitlab-Event' => event})
req.basic_auth username, password
req.body = json
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
response = http.start { |http| http.request(req) }
然后就像在GitLab中一样失败了:
Net::OpenTimeout: execution expired
from /opt/gitlab/embedded/lib/ruby/2.3.0/net/http.rb:880:in `initialize'
from /opt/gitlab/embedded/lib/ruby/2.3.0/net/http.rb:880:in `open'
from /opt/gitlab/embedded/lib/ruby/2.3.0/net/http.rb:880:in `block in connect'
from /opt/gitlab/embedded/lib/ruby/2.3.0/timeout.rb:101:in `timeout'
from /opt/gitlab/embedded/lib/ruby/2.3.0/net/http.rb:878:in `connect'
from /opt/gitlab/embedded/lib/ruby/2.3.0/net/http.rb:863:in `do_start'
from /opt/gitlab/embedded/lib/ruby/2.3.0/net/http.rb:852:in `start'
from (irb):142
from embedded/bin/irb:11:in `<main>'
有趣的是,在我的本地机器上发生了类似的事情:当Ruby抛出时卷曲成功。
此外,我检查了它不应该是基本身份验证,SSL或POST的问题 - 我从我的服务器的irb成功发布了Bitbucket上的代码片段,就像我测试Shippable webhook端点一样。我甚至在我的模拟服务器上发布了Shippable请求,其请求格式几乎相同。
此时我很好奇这种行为可能是什么原因以及如何进一步调试它。我发现在所有失败案例中只有两个因素是目标(Shippable URI)和客户端(Ruby的Net :: HTTP)。你还建议我检查一下吗?
答案 0 :(得分:0)
我确实无法回答,但问题消失了 - 我认为GitLab或Shippable更新改变了一些东西,因为钩子开始工作而没有我做任何动作。