热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用TravisCI自动部署Hexo博客

自从使用GitHubPages和Hexo来发布博客之后,不得不说方便了许多,只需要几个简单的命令博客就发布了。但在不断的使用中发现每次的发布操作也挺耗时的。我一般的操作是将平时整理好的md文件放

自从使用GitHub Pages和Hexo来发布博客之后,不得不说方便了许多,只需要几个简单的命令博客就发布了。但在不断的使用中发现每次的发布操作也挺耗时的。

我一般的操作是将平时整理好的md文件放到私有的git仓库中(感兴趣可了解 Ubuntu-Gogs 用更简单的方式部署、升级或迁移Gogs服务),每次发布的时候都要先将文件 clone 到本地,然后配置一下hexo的运行环境,接着再执行 hexo s -g 来预览和调整,最后执行 hexo d 命令将博客发布上去,在这之前如果你没有配置过GitHub的 SSH Key,还要花一些时间来弄权限的问题。久而久之就发现这样操作起来实在是太繁琐了。

后来看到一篇文章介绍可以使用Travis CI来自动部署hexo的博客,只需要将md文件 pull 到仓库中博客就自动发布好了。趁着这几天工作任务不太着急,研究了一下,特纪录在此,希望能帮到有需要的朋友。

Travis CI 是目前新兴的开源持续集成构建项目,用来构建托管在GitHub上的代码。它提供了多种编程语言的支持,包括Ruby,Javascript,Java,Scala,PHP,Haskell和Erlang在内的多种语言。

配置GitHub Pages

如果你是新手或者还没有自己的 GitHub Pages 博客站点,可以先看我之前的文章 使用GitHub搭建Hexo静态博客 | IT范儿 了解如何配置,具体过程这里不再详述。

创建 hexo 分支

因为我之前的博客源文件是存放在私有的git管理工具下,如果我们要使用Travis CI自动部署,必须将这些博客的源码文件放到GitHub上才能被Travis访问到。因为 GitHub Pages 默认要求必须使用 master 分支存放静态文件,我们可以在该仓库下使用其他分支来存放博客源码文件,或者新创建一个仓库来单独保存。这里我们把hexo博客的源码放在 hexo 分支下,博客的静态文件部署在 master 分支下。

对于如何在GitHub上创建分支,相关操作命令如下,仅供参考:

# 克隆项目到本地
> git clone https://github.com/Leafney/Leafney.github.io.git

# 创建并切换到 hexo 分支
> git checkout -b hexo

当切换到 hexo 分支后,因为我们是需要用 hexo 分支来存放博客源码文件的,所以,将 hexo 分支下的文件除 .git 目录外全部删除,然后将博客源码文件拷贝到该目录下,并 commithexo 分支.

然后我们需要将本地的 hexo 分支提交到远程仓库中

# 提交本地hexo分支到远程仓库的hexo分支
> git push origin hexo:hexo

这样我们在GitHub的仓库下就能看到 hexo 分支为博客源文件,master 分支为静态文件。

这里需要注意一点,当我们新增博客md文件时,获取远程分支时要指定分支的名称,否则会默认获取 master 分支:

> git pull origin hexo

设置 Travis CI

使用 GitHub账户登录 Travis CI官网 ,进去后能看到已经自动关联了 GitHub 上的仓库。这里我们选择需要启用的项目,即 yourname/yourname.github.io

然后点击后面的齿轮图标进入设置界面。

如果你之前已经勾选过项目,可以进到项目主页中,在右上角找到 More options 选项下的 Settings 进入设置界面。


通用设置

General 区域开启:Build only if .travis.yml is present 表示“只有当 .travis.yml 存在时才构建” ;开启:Build branch updates 表示 “当分支更新时构建” 两个选项,如下:

Travis CI在自动构建完成后需要push静态文件到仓库的 master 分支下,而访问GitHub的仓库是需要权限的,下面来看看如何配置权限。

配置 Access Token

如下图,Environment Variables 区域就是用来添加权限信息的。我们需要填写一个Token的名称和值,该名称可以在配置文件中以 ${变量名} 来引用,该Token我们需要从Github中获取。


从GitHub获取Access Token

之前我们在使用命令 hexo d 部署hexo博客到GitHub上时,是因为本地有 SSH key,当交给 Travis 去自动部署时我们也需要设置可操作权限,这里我们使用GitHub提供的token变量来实现。

登陆 GitHub --Settings 选项,找到 Personal access tokens 页面。

点击右上角的 Generate new token 按钮会生成新的token,点击后提示输入密码后继续,然后来到如下界面,取个名字(我这里取 Travis_Token 下面的配置文件中会用到),勾选相应权限,这里只需要 repo 下全部和 user 下的 user:email 即可。

生成完成后,将该token拷贝下来。这里需要注意的是该token只有这个时候才能看到,当再次进入这个页面时就只会显示之前设置的名称了。如果忘记了只能重新生成一个。


在Travis CI中配置

将上面获取到的token添加到 Environment Variables 部分,值为该 token ,而名称即为上面设置的 Travis_Token (请更改为个人所设置名称)。不勾选后面的 Display value in build log . 否则会在日志文件中暴露你的 token 信息,而日志文件是公开可见的。

至此我们已经配置好了要构建的仓库和访问的token,接下来就是如何构建的问题了。


创建 .travis.yml 文件

之前的步骤中我们勾选了一项 Build only if .travis.yml is present,所以我们要在博客源码文件的 hexo 分支下新增一个 .travis.yml 配置文件,其内容如下:

language: node_js # 设置语言

node_js: stable # 设置相应版本

install:
    - npm install # 安装hexo及插件

script:
    - hexo clean # 清除
    - hexo g # 生成

after_script:
    - cd ./public
    - git init
    - git config user.name "yourname" # 修改name
    - git config user.email "your email" # 修改email
    - git add .
    - git commit -m "Travis CI Auto Builder"
    - git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:master # GH_TOKEN是在Travis中配置token的名称

branches:
    only:
        - hexo #只监测hexo分支,hexo是我的分支的名称,可根据自己情况设置

env:
    global:
        - GH_REF: github.com/yourname/yourname.github.io.git #设置GH_REF,注意更改yourname

注意:需要将配置文件中的 GH_TOKEN 换成我们自己设定的名称,这里我的配置应该是 Travis_Token- git push --force --quiet "https://${Travis_Token}@${GH_REF}" master:master # GH_TOKEN是在Travis中配置token的名称。 还要更改 GH_REF 中我们的博客仓库的地址。

配置文件中的操作也很简单,这也是网上找到的比较常见的一种配置格式了。然而,这份配置文件中却隐藏着一个大坑。至于如何跳过去,后面再详说。


实现自动部署

.travis.yml 配置文件修改完成后,将其提交到远程仓库的 hexo 分支下,此时如果之前的配置一切ok,我们应该能在 Travis CI 的博客项目主页页面中看到自动构建已经在开始执行了。上面会显示出构建过程中的日志信息及状态等。


遇到的问题

问题一:提示 .travis.yml 文件格式错误

Travis CI 的日志文件中,如果遇到下面的错误提示,那可能就是 .travis.yml 文件的格式有问题。

ERROR: An error occured while trying to parse your .travis.yml file.
Please make sure that the file is valid YAML.
http://lint.travis-ci.org can check your .travis.yml.
The log message was: Build config file had a parse error: found character that cannot start any token while scanning for the next token at line 6 column 1.

通过在github上查询,我发现这个问题是我在配置文件中的缩进使用了 tab 键导致的。因为在不同的编辑器下,tab 键表示的宽度可能不同。

这里建议是:不要用 tab 键,而是用适当的空格实现缩进

  • found character '\t' that cannot start any token while scanning for the next token at line · Issue #136 · ruby/psych · GitHub

问题二:Travis CI的自动构建成功,但是构建完成后的项目没有推送到github中
...
...
git commit -m "Travis CI Auto Builder"
git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:master
remote: Anonymous access to Leafney/Leafney.github.io.git denied.
fatal: Authentication failed for 'https://@github.com/Leafney/Leafney.github.io.git/'

查看日志提示是权限问题。

这里的问题是我在 .travis.yml 配置文件中没有把 ${GH_TOKEN} 部分换成自己在 Travis CI 中填写的token名称而导致的。执行时找不到token,也就没法设置权限了。


问题三:master commit 树被清空 ☆

如果你按照上面的 travis.yml 配置文件的设置去自动构建你的博客,你会发现 master 分支的提交记录只有当前提交的这一条,而且无论操作多少次,也仅仅只有一条。这还真的是一个大坑呀!

比如下面这位网友的站点: GitHub - hhstore/hhstore.github.io: 个人技术博客 在 master 分支下就只有一条提交记录。


.travis.yml 部分配置内容:

after_script:
  - cd ./public
  - git init
  - git config user.name "yourname"
  - git config user.email "your email"
  - git add .
  - git commit -m "update"
  - git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:master

仔细查看上面的配置文件,我们发现每次都是将 public 目录下的文件重新生成了一个git项目,然后强制覆盖提交到了 master 分支下,这就是问题的所在。

为了解决这个问题,我将配置文件改为了如下的内容:

after_script:
    - git clone https://${GH_REF} .deploy_git
    - cd .deploy_git
    - git checkout master
    - cd ../
    - mv .deploy_git/.git/ ./public/
    - cd ./public
    - git config user.name "yourname"
    - git config user.email "your email"
    - git add .
    - git commit -m "Travis CI Auto Builder"
    - git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:master

after_script 部分,我先将博客项目 clone 到本地的 .deploy_git 目录下(目录名可自定义),然后切换到 master 分支,将 master 分支下的 .git 目录拷贝到了 public 目录下,接着继续后面的 commit 操作。

这里算是采用了一种 换位 的方式。之前我们通过git管理文件时并不会改动 .git 目录,而只是更改文件。但在这种情况下,我们需要提交的是 public 目录下的新文件。这样,就会保留之前的提交记录了。


附上我在使用的配置文件内容:

language: node_js # 设置语言

node_js: stable # 设置相应版本

cache:
    apt: true
    directories:
        - node_modules # 缓存不经常更改的内容

before_install:
    - npm install hexo-cli -g

install:
    - npm install # 安装hexo及插件

script:
    - hexo clean # 清除
    - hexo g # 生成

after_script:
    - git clone https://${GH_REF} .deploy_git
    - cd .deploy_git
    - git checkout master
    - cd ../
    - mv .deploy_git/.git/ ./public/
    - cd ./public
    - git config user.name "yourname"
    - git config user.email "your email"
    - git add .
    - git commit -m "Travis CI Auto Builder"
    - git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:master

branches:
    only:
        - hexo # 只监测hexo分支

env:
    global:
        - GH_REF: github.com/yourname/yourname.github.io.git #设置GH_REF,注意更改成自己的仓库地址

注意上面配置文件中的某些参数改为自己的。


问题四:使用 x-oauth-basic

在网上看到一位网友解决 “master commit 树被清空” 的问题时采用了另外一种方法,即在 after_script 部分调用执行 hexo d 命令来发布。这样的方式遇到的问题是需要设置 SSH Key 或者必须获得权限才能进行 push 操作。

有一种授权的方式是通过https使用OAuth验证的方式将token添加到url中来提交。即需要更改 _config.yml 中的如下部分:

## Docs: https://hexo.io/docs/deployment.html
deploy:
  type: git
  repository: git@github.com:Leafney/Leafney.github.io.git
  branch: master

为:

## Docs: https://hexo.io/docs/deployment.html
deploy:
  type: git
  repository: https://:x-oauth-basic@github.com/owner/repo.git
  branch: master

而这样一来 token 就暴露在配置文件中了。所以还需要在操作命令中使用替换的方式只在自动部署时更改该token。

这里仅做介绍,更详细可访问:

  • 使用Travis Ci使hexo自动生成并部署 | xingo's private plot
  • Easier builds and deployments using Git over HTTPS and OAuth · GitHub

问题五:git branch 分支操作相关命令
# 查看本地所有分支(分之名称前面带*表示当前分支)
> git branch

# 查看远程所有分支
> git branch -r

# 创建分支 blog
> git branch blog

# 切换到 blog 分支
> git checkout blog

# 创建并切换到新分支
> git checkout -b blog

# 删除分支
> git branch -d blog

# 提交本地test分支作为远程的test分支
> git push origin test:test

# 合并分支(将名称为[blog]的分支与当前分支合并)
> git merge blog

# 获取远程指定分支
> git pull origin blog

相关参考

  • 手把手教你使用Travis CI自动部署你的Hexo博客到Github上 - 简书
  • 使用 Travis CI 自动部署 Hexo - 简书
  • 使用 Travis-CI 来自动化部署 Hexo · ZHOU

该文章同步发表在:

  • 使用Travis CI自动部署Hexo博客 - 酷小孩 - 博客园
  • 使用Travis CI自动部署Hexo博客 | IT范儿

推荐阅读
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
  • 只使用’if-else’语句的’else’部分是否可以接受?有时,我觉得检查所有条件是否都是真的更容易,但是只处理“其他”情况。我想 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 与.Net大师Jeffrey Richter面对面交流——TUP对话大师系列活动回顾(多图配详细文字)...
    与.Net大师JeffreyRichter面对面交流——TUP对话大师系列活动回顾(多图配文字)上周末很有幸参加了CSDN举行的TUP活动, ... [详细]
author-avatar
日月阁文玩都汇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有