使用Jenkins自动部署博客

这篇文章比较简单,适合初学的读者,本文可以帮助你对基于Jenkins的持续集成有一个比较全局的概念。

提出问题

为了使用HTTPS,我将博客从GitHub Pages迁移到了我的服务器上。由于博客基于Hexo,在迁移之前,我的工作流程是:

现在由于Hexo渲染以后的HTML文件需要放到服务器上,那么工作流程变为:

增加的两步虽然说操作量不大,但是总显得很麻烦。于是我希望,在我把博客的HTML文件push到GitHub以后,服务器能自动从GitHub上把HTML内容拉下来。由于使用了Nginx,所以只要博客的HTML发生了更新,那么使用浏览器访问https://kingname.info时,新内容自动就会出现。这样一来,对我来说,看起来就像是我刚刚push了网页内容到GitHub,博客就自动更新了。

让服务器从GitHub上面拉代码,这个操作本身很简单。人来操作就一行代码。写个Python脚本也就两行代码。但问题是,服务器怎么知道GitHub发生了更新?

有人说,Kingname,你不是做爬虫吗?你写个爬虫,每一秒检查一下GitHub不就可以了吗?这种办法当然可以。但问题是,我一周就更新一次博客,但这个爬虫为了等这一次更新,一周要访问GitHub高达604800次?更何况我有时候一个月都不更新。

所以显然不能让服务器主动检查GitHub更新,这种“轮询”操作效率太低。那么如果反过来,一旦GitHub有更新,它就通知服务器,然后服务器再去拉代码,这不就简单高效了吗?

解决问题

为了实现这个目的,就需要使用一些持续集成的工具。本文使用的是Jenkins。

Jenkins在敏捷开发界可以说是大名鼎鼎了。使用Jenkins搭建一整套持续集成环境,可以实现开发者往代码仓库一提交代码,代码自动进行单元测试,覆盖率测试,代码风格检查自动生成报告,自动通知部门同事开始Code Review。当代码被合并入主干以后,服务器自动拉下最新代码,自动编译,自动在几千几万台服务器上部署。在整个过程中,开发者只需要做一件事,那就是(当然在实际情况下,后面还会加一些参数)。

本文实现的是博客的自动部署,没有任何测试,也没有Code Review,也没有编译,服务器也只有一台,复杂程度当然远远低于持续集成。不过管中窥豹,来看看这个简单地流程是如何走通的,对初学者也会有帮助。

本文假设你已经在服务器上面搭建好了Jenkins环境。如果你还没有安装Jenkins或者不会安装,那么可以“参考”这篇文章:搭建持续集成环境(一)。由于这篇文章是18个月以前写的,系统也是小众的Arch Linux,所以建议你还是在网上搜一下最新的Jenkins安装教程比较好。

设置GitHub

在GitHub中进入博客所在的Repo,并点击,如下图所示。

在设置页面,单击左侧的,并选择,如下图所示。

从下拉菜单中,选中。在新打开的界面,填写Jenkins的信息,如下图所示。

其中填写的是我的服务器的Jenkins地址加上,所以完整的地址为。把这里的换成实际的IP地址或者域名即可。需要注意的是,网址末尾的斜杠一定不能省略。

填写好信息以后保存,GitHub就配置好了。

配置Jenkins

Jenkins需要安装才能接收到GitHub发来的通知。进入Jenkins的-,在选项卡中,搜索并安装,安装完成Jenkins会重启。重启以后可以在选项卡下面发现,如下图所示。

回到Jenkins首页,单击左上角按钮,新建一个项目,项目类型为。任务的配置信息如下图所示。

其中的和可以随意填写。勾选,并把博客对应的GitHub Repo的地址填入。往下拉,看到,点选,依然填写博客对应的Repo地址。如下图所示。

继续往下拉,在单击,在弹出的下拉菜单中选择。勾选。在对应的输入框中输入命令,将当前目录下的所有文件和文件夹全部复制到文件夹下。如下图所示。

其中,文件夹里面的内容如下图所示。这是Hexo生成的HTML文件和资源文件。

这里需要解释一下这一条命令:

其中的表示复制文件和文件夹。表示当前目录。表示当前目录下面的所有内容。因此整条命令的意思是把当前目录下的所有内容全部复制到下,并且如果文件名相同,就会直接覆盖。需要注意的是,这仅仅是一个普通的文件夹而已,别看它的名字长得像个网址,但其实它只是一个名字比较怪的普通文件夹而已,没有什么特殊的意义。

这个项目在构建的时候,它会自动从GitHub上面对应Repo所有的文件拉取到当前的文件夹下,所以执行了这一条复制命令以后,博客HTML文件自然就被复制到了网站的根目录下。

修改权限

由于Jenkins在安装的时候,会自动创建一个名为的普通账号,这个账号没有管理员权限。jenkins执行命令的时候,它也会使用这个账号。但是由于这个文件夹是用户创建的,所以账号默认是没有权限读写这个文件夹的。现在需要给账号授予权限。使用这个账号登录服务器,使用以下命令给赋予权限,让它可以读写文件夹:

执行完成这一行命令以后,jenkins才可以把其他地方的文件复制到这个文件夹里面。

使用方法

没有什么复杂的使用方法,在Hexo中,执行命令就可以把本地生成好的HTML文件提交到GitHub中。然后打开浏览器,打开博客,发现新的文章已经出现在首页了。

在Jenkins项目的执行历史里面,也可以看到它被自动触发而产生的历史记录。如下图所示。

举一反三

由于Jenkins可以运行Shell命令,进行单元测试本质上也是运行一条命令,那这不就可以实现自动进行单元测试了吗?那么如果把Shell命令改成运行一个Python脚本,那不就可以做任何事情了吗?如果Python脚本里面写了发送邮件的代码,那不就实现了你一提交代码,其他人就收到邮件了吗?

本文来自企鹅号 - 未闻Code媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术博文

mkdir dxs

chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID;组可以是组名或者组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。系统管...

2698
来自专栏圣杰的专栏

Azure Web连接到Azure MySql Db

1153
来自专栏云计算教程系列

如何在Ubuntu 14.04上备份OrientDB数据库

OrientDB是一个多模型NoSQL数据库,支持图形和文档数据库。它是一个Java应用程序,可以在任何操作系统上运行; 它也完全是ACID投诉,支持多主复制。

790
来自专栏北京马哥教育

史上最详细linux启动过程讲解---没有之一

对于linux系统的初学者来说,理解并掌握linux系统启动流程能够使你够深入的理解linux系统,还可以通过系统的启动过程来分析问题解决问题。 Linux...

3846
来自专栏张善友的专栏

Devops step by step

接着上次分享的devops历程[Followme Devops实践之路], 大家希望能够出一个step by step手册, 那今天我就来和手把手来一起搭建这么...

2663
来自专栏假装我会写代码

简单轻松部署你的项目 - Deployer

1573
来自专栏python开发者

Ubuntu部署python3.5的开发和运行环境

Ubuntu部署python3.5的开发和运行环境 1 概述 由于最近项目全部由python2.x转向 python3.x(使用目前最新的 python3.5....

27110
来自专栏前端开发

Jenkins配合github实现前端项目自动化构建部署

大家以前写前端项目部署,可能都是手动运行命令,打包完,然后压缩,再利用FTP、Xshell等这类的工具上传到服务器解压。也或者你不会操作,你认为这些事情是运维做...

2503
来自专栏difcareer的技术笔记

一种更优的方式获取私有API

在编译私有的Android SDK中讲述了如何通过编译一个完整的SDK来获取一些稀有的API,但是这个方法有几点不足:

1073
来自专栏程序员叨叨叨

听说你PHP配置Composer遇到了一些困境

最近在写PHP通信接口,涉及到数据库CRUD操作时,觉得PHP原生方法每次都要写SQL语句,效率不高,于是尝试使用Propel orm框架,此文记录PHP配置P...

873

扫码关注云+社区

领取腾讯云代金券