title: 使用 Jenkins 自动部署博客
toc: true
comment: true
date: 2017-12-17 19:48:10
tags: ['Jenkins', 'CI']
category: ['Jenkins']
---
这篇文章比较简单,适合初学
的读者,本文可以帮助你对基于 Jenkins 的持续集成有一个比较全局的概念。
- 持续集成
为了使用 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 上面拉代码,这个操作本身很简单。人来操作就一行代码
。写个 Python 脚本也就两行代码。但问题是,服务器怎么知道 GitHub 发生了更新?
- git pull
有人说,Kingname,你不是做爬虫吗?你写个爬虫,每一秒检查一下 GitHub 不就可以了吗?这种办法当然可以。但问题是,我一周就更新一次博客,但这个爬虫为了等这一次更新,一周要访问 GitHub 高达 604800 次?更何况我有时候一个月都不更新。
所以显然不能让服务器主动检查 GitHub 更新,这种 "轮询" 操作效率太低。那么如果反过来,一旦 GitHub 有更新,它就通知服务器,然后服务器再去拉代码,这不就简单高效了吗?
为了实现这个目的,就需要使用一些持续集成的工具。本文使用的是 Jenkins。
Jenkins 在 敏捷开发 界可以说是大名鼎鼎了。使用 Jenkins 搭建一整套 持续集成 环境,可以实现开发者往代码仓库一提交代码,代码自动进行单元测试,覆盖率测试,代码风格检查自动生成报告,自动通知部门同事开始 Code Review。当代码被合并入主干以后,服务器自动拉下最新代码,自动编译,自动在几千几万台服务器上部署。在整个过程中,开发者只需要做一件事,那就是
(当然在实际情况下,后面还会加一些参数)。
- git push
本文实现的是博客的自动部署,没有任何测试,也没有 Code Review,也没有编译,服务器也只有一台,复杂程度当然远远低于持续集成。不过管中窥豹,来看看这个简单地流程是如何走通的,对初学者也会有帮助。
本文假设你已经在服务器上面搭建好了 Jenkins 环境。如果你还没有安装 Jenkins 或者不会安装,那么可以 "参考" 这篇文章: 搭建持续集成环境 (一) 。由于这篇文章是 18 个月以前写的,系统也是小众的 Arch Linux,所以建议你还是在网上搜一下最新的 Jenkins 安装教程比较好。
在 GitHub 中进入博客所在的 Repo,并点击
,如下图所示。
- Settings
在设置页面,单击左侧的
,并选择
- Integrations & services
,如下图所示。
- Add service
从下拉菜单中,选中
。在新打开的界面,填写 Jenkins 的信息,如下图所示。
- Jenkins (GitHub plugin)
其中
填写的是我的服务器的 Jenkins 地址加上
- Jenkins hook url
,所以完整的地址为
- /GitHub-webhook/
。把这里的
- http://xx.xx.xx.xx:8080/GitHub-webhook/
换成实际的 IP 地址或者域名即可。需要注意的是,网址末尾的斜杠一定不能省略。
- xx
填写好信息以后保存,GitHub 就配置好了。
Jenkins 需要安装
才能接收到 GitHub 发来的通知。进入 Jenkins 的
- GitHub Plugin
-
- 系统管理
,在
- 管理插件
选项卡中,搜索
- 可选插件
并安装,安装完成 Jenkins 会重启。重启以后可以在
- GitHub plugin
选项卡下面发现
- 已安装
,如下图所示。
- GitHub plugin
回到 Jenkins 首页,单击左上角
按钮,新建一个项目,项目类型为
- 新建
。任务的配置信息如下图所示。
- 构建一个自由风格的软件项目
其中的
和
- 项目名称
可以随意填写。勾选
- 描述
,并把博客对应的 GitHub Repo 的地址填入。往下拉,看到
- GitHub project
,点选
- 源码管理
,依然填写博客对应的 Repo 地址。如下图所示。
- Git
继续往下拉,在
单击
- 构建触发器
,在弹出的下拉菜单中选择
- 增加构建步骤
。勾选
- Execute shell
。在
- GitHub hook trigger for GITScm polling
对应的输入框中输入命令,将当前目录下的所有文件和文件夹全部复制到
- Execute shell
文件夹下。如下图所示。
- /home/bexercise/kingname.github.io/
其中,文件夹
里面的内容如下图所示。这是 Hexo 生成的 HTML 文件和资源文件。
- /home/bexercise/kingname.GitHub.io/
这里需要解释一下这一条命令:
- cp -r ./* /home/bexercise/kingname.GitHub.io/
其中的
表示复制文件和文件夹。
- cp -r
表示当前目录。
- ./
表示当前目录下面的所有内容。因此整条命令的意思是把当前目录下的所有内容全部复制到
- ./*
下,并且如果文件名相同,就会直接覆盖。需要注意的是,
- /home/bexercise/kingname.GitHub.io/
这仅仅是一个普通的文件夹而已,别看它的名字长得像个网址,但其实它只是一个名字比较怪的普通文件夹而已,没有什么特殊的意义。
- kingname.GitHub.io
这个项目在构建的时候,它会自动从 GitHub 上面对应 Repo 所有的文件拉取到当前的文件夹下,所以执行了这一条复制命令以后,博客 HTML 文件自然就被复制到了网站的根目录下。
由于 Jenkins 在安装的时候,会自动创建一个名为
的普通账号,这个账号没有管理员权限。jenkins 执行命令的时候,它也会使用这个账号。但是由于
- jenkins
这个文件夹是用户
- kingname.GitHub.io
创建的,所以
- bexercise
账号默认是没有权限读写这个文件夹的。现在需要给
- jenkins
账号授予权限。使用
- jenkins
这个账号登录服务器,使用以下命令给
- bexercise
赋予权限,让它可以读写
- jenkins
文件夹:
- kingname.GitHub.io
- sudo chown - R jenkins: jenkins / home / bexercise / kingname.GitHub.io
执行完成这一行命令以后,jenkins 才可以把其他地方的文件复制到这个文件夹里面。
没有什么复杂的使用方法,在 Hexo 中,执行命令
就可以把本地生成好的 HTML 文件提交到 GitHub 中。然后打开浏览器,打开博客,发现新的文章已经出现在首页了。
- hexo d
在 Jenkins 项目的执行历史里面,也可以看到它被自动触发而产生的历史记录。如下图所示。
由于 Jenkins 可以运行 Shell 命令,进行单元测试本质上也是运行一条命令,那这不就可以实现自动进行单元测试了吗?那么如果把 Shell 命令改成运行一个 Python 脚本,那不就可以做任何事情了吗?如果 Python 脚本里面写了发送邮件的代码,那不就实现了你一提交代码,其他人就收到邮件了吗?
来源: http://www.cnblogs.com/xieqiankun/p/deploy_blog_by_jenkins.html