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上面拉代码,这个操作本身很简单。人来操作就一行代码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地址。如下图所示。

继续往下拉,在构建触发器单击增加构建步骤,在弹出的下拉菜单中选择Execute shell。勾选GitHub hook trigger for GITScm polling。在Execute shell对应的输入框中输入命令,将当前目录下的所有文件和文件夹全部复制到/home/bexercise/kingname.github.io/文件夹下。如下图所示。

其中,文件夹/home/bexercise/kingname.GitHub.io/里面的内容如下图所示。这是Hexo生成的HTML文件和资源文件。

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

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中,执行命令hexo d就可以把本地生成好的HTML文件提交到GitHub中。然后打开浏览器,打开博客,发现新的文章已经出现在首页了。

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

举一反三

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

使用Jenkins自动部署博客的更多相关文章

  1. 使用Travis CI自动部署博客到github pages和coding pages

    每次换系统或换电脑之后重新部署博客总是很苦恼?想像jekyll那样,一次性部署完成后,以后本地不用安装环境直接 git push 就能生成博客?那推荐你应该使用使用 Travis CI了. 这篇文章我 ...

  2. Github webhooks 自动部署博客文章,使用总结【含视频】

    作者:小傅哥 博客:https://bugstack.cn 原文:https://mp.weixin.qq.com/s/VtTHUfyiITNSoGy052jkXQ 沉淀.分享.成长,让自己和他人都能 ...

  3. 5 分钟教你快速掌握 GitHub Actions 自动部署博客

    自从 GitHub 宣布 GitHub Actions 在平台上对所有开发人员和存储库可用以来,GitHub Actions 越来越受欢迎.很多第三方平台在生态系统中有速度等限制,将进一步推动开发人员 ...

  4. 关于gitlab+jenkins自动部署代码的实现

    本人PHP开发者,项目组大多是PHP,少量java项目. 因公司目前服务器和项目的管理比较混乱,与领导商量后,决定尝试 gitlab+jenkins自动化部署(之前用的svn FTP手动部署代码),解 ...

  5. Jenkins自动部署Tomcat项目

    Jenkins自动部署Tomcat项目 1.安装jenkins 插件 启动Jenkins,进入系统管理-插件管理: 选择Deploy to container Plugin 插件安装:

  6. 使用jenkins自动部署java工程到jboss-eap6.3 -- 1.环境搭建

    使用jenkins自动部署java工程到jboss-eap6.3 -- 1.环境搭建 目录 使用jenkins自动部署java工程到jboss-eap6.3 -- 1.环境搭建 使用jenkins自动 ...

  7. C蛮的全栈之路-node篇(二) 实战一:自动发博客

    目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 ---------------- 我是分割线 ---- ...

  8. Connection reset by [server_ip] port 22 (hexo d 部署博客出错)

    问题 在使用 hexo d 部署博客和使用 Git/Github 进行 git push -u origin master 时遇到了以下问题: git -c diff.mnemonicprefix=f ...

  9. 内存溢出导致jenkins自动部署到tomcat失败

    原文地址:http://openwares.net/java/jenkens_deploy_to_tomcat_error_of_outofmemoryerror.html jenkins自动部署wa ...

随机推荐

  1. Xilinx ISE 14.1中模拟True Dual Port RAM例子

    <一>创建工程 创建工程在此略过. <二>基本代码 1.创建一个Verilog modual代码如下: module main( input clk, input rsta, ...

  2. 面试时,当你有权提问时,别客气,这是个逆转的好机会(内容摘自Java Web轻量级开发面试教程)

    前些天,我在博客园里写了篇文章,如何在面试中介绍自己的项目经验,收获了2千多个点击,这无疑鼓舞了我继续分享的热情,今天我来分享另外一个面试中的甚至可以帮助大家逆转的技巧,本文来是从 java web轻 ...

  3. node调试工具--node-inspector安装

    node-inspector安装: npm install --registry=http://r.cnpmjs.org -g cnpm cnpm install -g node-inspector ...

  4. zabbix 3.2 高可用实现方式二-pacemaker+corosync实现zabbix高可用集群

    一.pacemaker 是什么 1.pacemaker 简单说明 2.pacemaker 由来 二.pacemaker 特点 三.pacemaker 内部结构 1.群集组件说明: 2.功能概述 四.c ...

  5. 在.csproj文件中增加npm, bower, gulp, webpack的构建

    <Target Name="RunNpm" AfterTargets="AfterBuild">   <!-- As part of publ ...

  6. 零基础如何迅速学习HTML5?新手小白学习web前端H5自白!

    很多的人在毕业之后才发现原来学的专业不是自己想做的工作,或者专业对口的工作待遇让人觉得并不满意,于是很多人选择培训机构学新的一门技能转换行业.IT行业的web前端H5受到很多学员的青睐.那么学习web ...

  7. x01.AntWorld: An Python AI Game

    1. 学习了一下 AI 五子棋,顺手改作 19 路的棋盘,便于围棋通用.render.py 主要修改如下: # 常量部分: IMAGE_PATH = 'img/' StoneSize = 32 WID ...

  8. System.Transactions 事务超时属性

    最近遇到一个处理较多数据的大事务,当进行至10分钟左右时,爆出事务超时异常,如果Machine.config中不设置最大超时时间,则默认超时时间为10分钟 MachineSettingsSection ...

  9. Python手动实现k-means

    import numpy as np import matplotlib.pyplot as plt def kmeans(data, cluster_num, method='mean'): poi ...

  10. 如何从零开始对接第三方登录(Java版):QQ登录和微博登录

    前言 个人网站最近增加了评论功能,为了方便用户不用注册就可以评论,对接了QQ和微博这2大常用软件的一键登录,总的来说其实都挺简单的,可能会有一点小坑,但不算多,完整记录下来方便后来人快速对接. 后台设 ...