Hexo 搭建个人博客 #05 利用 Travis CI 帮你自动部署

Travis CI

本文首发于:https://y0ngb1n.github.io/a/5c7519f9.html

什么是 Travis CI?

Travis CI 是在软件开发领域中的一个在线的,分布式的持续集成服务,用来构建及测试在 GitHub 托管的代码。这个软件的代码同时也是开源的,可以在 GitHub 上下载到,尽管开发者当前并不推荐在闭源项目中单独使用它。

它提供了多种编程语言的支持,包括 Ruby、JavaScript、Java、Scala、PHP、Haskell 和 Erlang 在内的多种语言。许多知名的开源项目使用它来在每次提交的时候进行构建测试,比如 Ruby on Rails,Ruby 和 Node.js。

目前 Travis CI 两个站点,提供不同的服务:

版本 主页 特色
免费版 https://travis-ci.org/ 为开源项目提供免费服务
收费版 https://travis-ci.com/ 可以部署 GitHub 私有仓库

两个站点只能看到各自的项目,不能通用,按需选用。

准备工作

首先,访问官方网站 travis-ci.org,点击右上角的登入按钮,使用 GitHub 账户登入 Travis CI。

Travis 会列出 GitHub 上面你的所有仓库,以及你所属于的组织。此时,选择你需要 Travis 帮你构建的仓库,打开仓库旁边的开关。一旦激活了一个仓库,Travis 会监听这个仓库的所有变化。

<p align="center">
<img src="https://i.loli.net/2019/01/17/5c4036203a833.png" alt="travis github repo">
</p>

.travis.yml

Travis 要求项目的根目录下面,必须有一个 .travis.yml 文件。这是配置文件,指定了 Travis 的行为。该文件必须保存在 GitHub 仓库里面,一旦代码仓库有新的 Commit,Travis 就会去找这个文件,执行里面的命令。

.travis.yml

language: node_js             # 指定语言环境
node_js: '8.9.3'              # 指定 NodeJS 版本
cache: npm                    # 指定 npm 缓存方案,会缓存 $HOME/.npm 或 node_modules 文件夹

dist: trusty                  # 指定系统版本,trusty 是指 Ubuntu 14.04 发行版的名称
sudo: required                # 是否需要 sudo 权限

branches:                     # 指定要构建的分支
  only:                       # only 表示只构建以下分支
  - source

before_install:               # install 阶段之前执行
  - npm install -g hexo-cli   # 全局安装 Hexo 命令行工具

install:                      # 在安装项目环境阶段需要运行的命令,一条一行,类似的还有 before_install
  - npm install               # 安装 package.json 中的依赖

script:                       # 在构建阶段需要运行的命令,一条一行,类似的还有 before_script、after_script
  - hexo clean
  - hexo generate             # Hexo 常规命令,执行清理和生成

after_success:                # script 阶段成功时执行,构建失败不会执行,其他同上
  - git config --local user.name "travis-ci"
  - git config --local user.email "deploy@travis-ci.org"
  - sed -i'' "s~git@github.com:~https://${GITHUB_REPO_TOKEN}@github.com/~" _config.yml
  - hexo deploy > /dev/null   # 通过 Hexo 的 deploy 命令部署博客

更多使用技巧请主动参考「持续集成服务 Travis CI 教程」。

那么,现在又有一个问题了:我们的目是自动部署到 GitHub Pages,用的是 hexo deploy 命令,但是 Hexo 又配置使用的是 Git push 来推送的(由 hexo-deployer-git 插件提供技术支持),那么 Travis CI 怎么有权限操作我的 GitHub 仓库呢!

GitHub Access Token

以下内容摘抄「使用 Travis 自动构建 Hexo 到 GitHub

GitHub 允许你通过设置页面添加一个「个人访问令牌(Personal access tokens)」,使用 Assess Token 将有权限通过 https 访问 GitHub Api 操作自己的仓库,可见这个就是我们需要的。

现在我们来添加一个 token,先进入自己 GitHub 的设置页面,点击 Personal access tokensGenerate new token 按钮,新建一个 token。

Generate new token

在权限设置中,我们只需要操作仓库,因此只需要打开仓库相关的权限就够了,权限开放应该满足最小原则,能少就少。设置好权限后点击生成按钮就会生成完毕并跳到 tokens 列表。

Personal access tokens

现在就需要把刚生成的 Access Token 的值复制下来,注意,这个页面一旦刷新过了, token 就不能再显示了,没记住的只能重新生成一个了

Copy personal access tokens

嗯,现在 Access Token 也有了,能操作仓库了,那么,这个 token 应该放到哪里呢?

肯定不是放到代码里。。。

其实在 Travis CI 的项目设置界面就有提供设置环境变量,我们就应该把 token 放到那里。

回到我们 Travis CI 的博客项目设置页面中,添加一个名为 GITHUB_REPO_TOKEN 的环境变量储存我们的 token,并记得要设置 Display value in build logOFF,关闭变量的显示,否则等于公开了 token。

添加 Token 环境变量

现在在我们的执行脚本中就能使用 $GITHUB_REPO_TOKEN 访问 token 的环境变量了~

然后就是如何使用了。在 Hexo 部署前,我们应该把原来的部署仓库地址用带有 Access Token 的地址替换掉,于是在 .travis.ymlhexo deploy 命令前增加一条命令:

sed -i'' "s~git@github.com:~https://${GITHUB_REPO_TOKEN}@github.com/~" _config.yml

这样,在执行时,这条命令就能自动替换到有权限操作的 token 地址了,并且也不会泄露或者影响本地的原始配置文件。

构建失败:子模块拉取失败

本博客的第三方主题使用 git submodule 管理,可以翻看「Hexo 搭建个人博客 #04 主题的安装与自定义样式

Build History

详细的构建日志可见 #1,下面提取关键信息:

$ git submodule update --init --recursive
Submodule 'themes/skapp' (git@github.com:Mrminfive/hexo-theme-skapp.git) registered for path 'themes/skapp'
Cloning into '/home/travis/build/y0ngb1n/y0ngb1n.github.io/themes/skapp'...
Warning: Permanently added the RSA host key for IP address '192.30.253.113' to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.

Travis CI 官方是默认支持 Git Submodules,在拉取仓库时会默认拉取子模块的仓库,可以手动关闭该特性。

由于在使用 git submodule 时,添加了 git@github.com 的仓库地址,使用 SSH 的协议,所以拉取失败了,下面提供两个解决方案:

  1. Adding to SSH Known Hosts - 官方提供的解决方案
  2. 手动修改 .gitmodules 里配置的仓库地址,将使用 git 协议的仓库链接改为 https 协议

我这使用方案 2,修改为https 协议:

[submodule "themes/skapp"]
    path = themes/skapp
    url = https://github.com/Mrminfive/hexo-theme-skapp.git

将修改推送至 GitHub 后,Travis CI 会进行构建,此时可见 #2 成功构建了。

在 README 中查看构建状态

我们可以在 README 中添加 Travis CI 的构建状态,这样便可方便地查看项目在 Travis CI 上的构建状态。—— Embedding Status ImagesShields.io

README

参考资料

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容