使用Jenkins自动部署博客
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自动部署博客的更多相关文章
- 使用Travis CI自动部署博客到github pages和coding pages
每次换系统或换电脑之后重新部署博客总是很苦恼?想像jekyll那样,一次性部署完成后,以后本地不用安装环境直接 git push 就能生成博客?那推荐你应该使用使用 Travis CI了. 这篇文章我 ...
- Github webhooks 自动部署博客文章,使用总结【含视频】
作者:小傅哥 博客:https://bugstack.cn 原文:https://mp.weixin.qq.com/s/VtTHUfyiITNSoGy052jkXQ 沉淀.分享.成长,让自己和他人都能 ...
- 5 分钟教你快速掌握 GitHub Actions 自动部署博客
自从 GitHub 宣布 GitHub Actions 在平台上对所有开发人员和存储库可用以来,GitHub Actions 越来越受欢迎.很多第三方平台在生态系统中有速度等限制,将进一步推动开发人员 ...
- 关于gitlab+jenkins自动部署代码的实现
本人PHP开发者,项目组大多是PHP,少量java项目. 因公司目前服务器和项目的管理比较混乱,与领导商量后,决定尝试 gitlab+jenkins自动化部署(之前用的svn FTP手动部署代码),解 ...
- Jenkins自动部署Tomcat项目
Jenkins自动部署Tomcat项目 1.安装jenkins 插件 启动Jenkins,进入系统管理-插件管理: 选择Deploy to container Plugin 插件安装:
- 使用jenkins自动部署java工程到jboss-eap6.3 -- 1.环境搭建
使用jenkins自动部署java工程到jboss-eap6.3 -- 1.环境搭建 目录 使用jenkins自动部署java工程到jboss-eap6.3 -- 1.环境搭建 使用jenkins自动 ...
- C蛮的全栈之路-node篇(二) 实战一:自动发博客
目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 ---------------- 我是分割线 ---- ...
- Connection reset by [server_ip] port 22 (hexo d 部署博客出错)
问题 在使用 hexo d 部署博客和使用 Git/Github 进行 git push -u origin master 时遇到了以下问题: git -c diff.mnemonicprefix=f ...
- 内存溢出导致jenkins自动部署到tomcat失败
原文地址:http://openwares.net/java/jenkens_deploy_to_tomcat_error_of_outofmemoryerror.html jenkins自动部署wa ...
随机推荐
- 对抗栈帧地址随机化/ASLR的两种思路和一些技巧
栈帧地址随机化是地址空间布局随机化(Address space layout randomization,ASLR)的一种,它实现了栈帧起始地址一定程度上的随机化,令攻击者难以猜测需要攻击位置的地址. ...
- Windows环境下多线程编程原理与应用读书笔记(7)————事件及其应用
<一>事件 事件主要用于线程间传递消息,通过事件来控制一个线程是处于执行状态还是处于挂起状态. 事件和互斥量之间的差别: 事件主要用于协调两个或者多个线程之间的动作,使其协调一致,符合逻辑 ...
- css中单位px和em,rem的区别[转载]
PX特点 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位: 3. Firefox能够调整px和em,rem,但是96%以上 ...
- shell命令输入输出重定向
Linux命令的执行过程 首先是输入:stdin输入可以从键盘,也可以从文件得到 命令执行完成:把成功结果输出到屏幕,stout默认是屏幕 命令执行有错误:把错误也输出到屏幕上面,stderr默认也是 ...
- [java基础] java 左移和右移
今天搜到一个比较好用的在线编译器,希望和大家分享. 除了java还有c++....,地址是http://www.tutorialspoint.com/compile_java_online.php 另 ...
- MyEclipse10激活方法
背景:因为以前一直使用的是myeclipse8.6版本,但因为版本太低有些功能不支持,于是想试用下myeclipse10.0版本,但是下载后发现需要激活,但在激活的过程中遇到了很多坑,于是便有了本文的 ...
- 从java1到java9每个版本都有什么新特性?
每次出新版本,大家大概都会这么问,"Java X会有什么特性呢?" .在下面的内容里,我总结了至今为止的Java主要发行版中各自引入的新特性,这样做的目的是为了突出各个新特性是在哪 ...
- VPN连接机器不再输入密码以及Pin码方法
连接机器不输入密码 #!/usr/bin/env expect spawn ssh guosong@xx_ip; expect "*password*"; send &quo ...
- JavaScript数组对象方法
数组的方法:首先,数组的方法有数组原型方法,也有从object对象继承来的方法.这里只详细说明一下数组的原型方法. (1)join:把数组中的所有元素放入一个字符串.元素通过指定的分隔符进行分隔. 例 ...
- Android隐藏软键盘
1,用java代码隐藏: /**隐藏软键盘**/ View view = getWindow().peekDecorView(); if (view != null) { ...