提出问题
为了使用HTTPS,我将博客从GitHub Pages迁移到了我的服务器上。由于博客基于Hexo,在迁移之前,我的工作流程是:
本地写Markdown格式文章->Hexo生成HTML并推送到GitHub->GitHub Pages自动使用最新内容 |
现在由于Hexo渲染以后的HTML文件需要放到服务器上,那么工作流程变为:
本地写Markdown格式文章->Hexo生成HTML并推送到GitHub->手动登录服务器 ->进入放博客文章的文件夹->执行命令git pull |
增加的两步虽然说操作量不大,但是总显得很麻烦。于是我希望,在我把博客的HTML文件push到GitHub以后,服务器能自动从GitHub上把HTML内容拉下来。由于使用了Nginx,所以只要博客的HTML发生了更新,那么使用浏览器访问https://kingname.info时,新内容自动就会出现。这样一来,对我来说,看起来就像是我刚刚push了网页内容到GitHub,博客就自动更新了。
让服务器从GitHub上面拉代码,这个操作本身很简单。人来操作就一行代码git pull。写个Python脚本也就两行代码。但问题是,服务器怎么知道GitHub发生了更新?
有人说,Kingname,你不是做爬虫吗?你写个爬虫,每一秒检查一下GitHub不就可以了吗?这种办法当然可以。但问题是,我一周就更新一次博客,但这个爬虫为了等这一次更新,一周要访问GitHub高达604800次?更何况我有时候一个月都不更新。
所以显然不能让服务器主动检查GitHub更新,这种“轮询”操作效率太低。那么如果反过来,一旦GitHub有更新,它就通知服务器,然后服务器再去拉代码,这不就简单高效了吗?
解决问题
为了实现这个目的,就需要使用一些持续集成的工具。本文使用的是Jenkins。
Jenkins在敏捷开发界可以说是大名鼎鼎了。使用Jenkins搭建一整套持续集成环境,可以实现开发者往代码仓库一提交代码,代码自动进行单元测试,覆盖率测试,代码风格检查自动生成报告,自动通知部门同事开始Code Review。当代码被合并入主干以后,服务器自动拉下最新代码,自动编译,自动在几千几万台服务器上部署。在整个过程中,开发者只需要做一件事,那就是git push(当然在实际情况下,后面还会加一些参数)。
本文实现的是博客的自动部署,没有任何测试,也没有Code Review,也没有编译,服务器也只有一台,复杂程度当然远远低于持续集成。不过管中窥豹,来看看这个简单地流程是如何走通的,对初学者也会有帮助。
本文假设你已经在服务器上面搭建好了Jenkins环境。如果你还没有安装Jenkins或者不会安装,那么可以“参考”这篇文章:搭建持续集成环境(一)。由于这篇文章是18个月以前写的,系统也是小众的Arch Linux,所以建议你还是在网上搜一下最新的Jenkins安装教程比较好。
设置GitHub
在GitHub中进入博客所在的Repo,并点击Settings,如下图所示。
在设置页面,单击左侧的Integrations & services,并选择Add service,如下图所示。
从下拉菜单中,选中Jenkins (GitHub plugin)。在新打开的界面,填写Jenkins的信息,如下图所示。
其中Jenkins hook url填写的是我的服务器的Jenkins地址加上/GitHub-webhook/,所以完整的地址为http://xx.xx.xx.xx:8080/GitHub-webhook/。把这里的xx换成实际的IP地址或者域名即可。需要注意的是,网址末尾的斜杠一定不能省略。
填写好信息以后保存,GitHub就配置好了。
配置Jenkins
Jenkins需要安装GitHub Plugin才能接收到GitHub发来的通知。进入Jenkins的系统管理-管理插件,在可选插件选项卡中,搜索GitHub plugin并安装,安装完成Jenkins会重启。重启以后可以在已安装选项卡下面发现GitHub plugin,如下图所示。
回到Jenkins首页,单击左上角新建按钮,新建一个项目,项目类型为构建一个自由风格的软件项目。任务的配置信息如下图所示。
其中的项目名称和描述可以随意填写。勾选GitHub project,并把博客对应的GitHub Repo的地址填入。往下拉,看到源码管理,点选Git,依然填写博客对应的Repo地址。如下图所示。