github webhook的设置:
参考文章的网站是使用php搭建的,而我们的是使用ruby on rails
框架搭建的
首先创建路由以及对应的控制器、action和view
编辑config/routes.rb
,增加如下内容post 'githook/go'
,注意,这里的HTTP请求方式是post,因为到时候github向我们网站发送请求的时就是以post方式发送的
根据github webhook签名校验规则,我们应如下编写githook_controller.rb
中的go
方法
进入app/contorllers
目录,创建githook_controller.rb
,内容如下:
require 'base64'
require 'cgi'
require 'openssl'
class GithookController < ApplicationController
skip_before_action :verify_authenticity_token
def go
secret = "your_own_secret";
# 获取http头部
signature = request.headers["X-Hub-Signature"];
# 计算hash
hash = "sha1=" + OpenSSL::HMAC.hexdigest('sha1', secret, request.body.read)
if signature == hash
shellPath = "/var/ruby_apps/ruby_learning";
cmd =
@res = `cd #{shellPath} && git pull`;
end
end
end
request.headers["X-Hub-Signature"]
和request.body.read
两处值得我们注意,知识点,获取HTTP请求头部字段值和HTTP请求体,注意这里执行命令使用的是
``
不能使用exec,它会直接终止程序
进入app/views/githook
目录,编辑go.html.erb
,内容如下:
<%= @res %>
这里直接显示实例变量@res
,其实就是执行命令git pull
的回显
skip_before_action :verify_authenticity_token
这也是个知识点,参考回答,不加这一个声明语句的话,会报错ActionController::InvalidAuthenticityToken
在rails启动服务器的控制台中会看到如下错误:
Can't verify CSRF token authenticity.
Completed 422 Unprocessable Entity in 1ms
CSRF token相关错误,正常情况下,我们访问网页,向服务器发送POST请求时都会附带一个csrf token,这个token是服务器生成的网页表单中的一个属性为hidden的input标签中的值,但是对于我们的webhook来讲,它是由github向我们的服务器直接发起的POST请求,没有csrf token,所以这里就会报错,解决方法就是直接针对该控制器关闭csrf检测机制
经过一下午的捣鼓,终于完成了
反复修改错误之后,终于成功更新了网站内容