参考文章

github webhook的设置:
ruby on rails搭建的博客网站结合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检测机制

经过一下午的捣鼓,终于完成了

ruby on rails搭建的博客网站结合github的webhook实现自动更新网站_经验分享_02

反复修改错误之后,终于成功更新了网站内容

ruby on rails搭建的博客网站结合github的webhook实现自动更新网站_经验分享_03