用了一段时间HEXO搭建个人的博客,但每次发布文章,都需要打开电脑hexo g编译之后,再提交到服务器上,确实挺麻烦的,和小伙伴聊完他的日志发布方式之后,痛定思痛,快捷发布日志这个问题需要解决一下了!Travis CLI搞起来!

闲聊日志的快捷发布

前几天,跟小伙伴Pipe一起参加个分享会,看到他做了笔记,结束后我说你发给我呀,他说直接看我博客(《工作思维方式简记》)呀!我的天,写完瞬间就发到站点去了!Pipe非常高产,去看看他的博客,用“高产似母猪”来描述都不足为过,5月份还没有过完,发布了7篇日志。

我问他,怎么做到那么高产?Pipe说,第一点是他的日志是碎片化的偏记录的,不一定要憋出大文章才发,然后就是博客系统要方便,随写随发。

反观我的博客,更新频率真的很低,一方面是喜欢憋专题文章,拖着拖着,然后就没有然后了。另一方面也是发布确实麻烦,电脑编辑好markdown,还要执行各种命令,最后push到github和自己的服务器,文章才能被大家看到,一开始觉得还好蛮geek的,但后来确实由于这些门槛,有打击到那些随时来的写作思绪。

By the way,Pipe用的是jekyll,跟github的持续集成是天生的,而HEXO没有这样的优势。从Hexo换到Jekyll吧,也不是很麻烦,但是我在Hexo生态做了一些东西,还是有点不舍哈。

  • github blog:我的博客分支
  • hexo-generator-index-plus:hexo小插件,首页排序生成器,和原生的index-generator比较显著的区别是加了置顶功能,可以在front-matter添加top属性即可。
  • hexo-theme-fresh:hexo博客主题,绿色小清新,Medium风格。

HEXO的开发分支与生产分支

仓库分成2个分支,主开发开支dev,以及生产环境的gh-pages分支。
查看博客可以通过访问github pages,又或者直接访问我的域名 wuyuying.com/blog。

开发分支 dev

在我的博客里,开发分支是dev,目录结构就是一开始hexo init后的结构。

- scaffolds // 页面的模板,包括草稿(draft.md)、页面(page.md)、文章(post.md)以及其他自定义模板
- source // 放页面和文章markdown文档
- themes // 博客主题
- _config.yml // 配置文件
- package.json
- .travis.yml // 持续集成服务travis的文件

本地开发流程一般是这样。

// hexo server, 启动本地服务器,预览我的文章
hexo s // hexo generate,编译文章,把 `source` 里面的页面和文章编译成 `public` 里面的html文件
hexo g// hexo deploy,如果 _config.yml 有配置deploy的内容,执行该命令是会执行相应的部署逻辑
hexo d

HEXO的详细科普和指令在这里就不写了哈,官方文档里都有 >> 传送门。

生产分支 gh-pages

dev分支里,执行了hexo g编译之后,编译后的静态文件会存在public文件夹里,而我们就把里面的内容挪到最终的生产环境分支gh-pages里,也就是最终我们看到的静态博客。

当我们在github里把github-pages服务打开,并渲染gh-pages分支,我们就能访问自己的博客了(https://yuyingwu.github.io/blog/)。

Travis CI

在大致了解HEXO的开发流程之后,我们可以开始考虑,如果要实现快捷发布,是要做什么?
User Story希望可以在github上写一篇文章,提交之后,可以直接在我的线上博客看到

在这里,我们用到了提供持续集成(CI, Continuous Integration)服务的Travis CI,但其实用到的不是它提供的CI服务,而更多的是通过监听分支提交的动态,在集成成功后去执行我们自定义的部署逻辑。

持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

噢,还有些事前准备:

  • 先在dev分支里,创建.travis.yml
  • 在Travis CLI平台上打开这个分支的CI开关

1. 编译并同步到gh-pages

那直接上我的CI配置代码吧。

language: node_js
node_js: stableaddons: # Travis CI建议加的,自动更新apiapt:update: truecache:directories: - node_modules # 缓存 node_modulesinstall:
- npm install # 初次安装,在CI环境中,执行安装npm依赖# before_script: script:
- hexo g # 执行 hexo generate,把文章编译到public中after_success: # 执行script成功后,进入到public,把里面的代码提交到博客的gh-pages分支
- cd ./public
- git init
- git config user.name "Yuying Wu"
- git config user.email "wuyuying1128@gmail.com"
- git add .
- git commit -m "Update site"
- git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:gh-pagesbranches:only:- dev # CI 只针对分支 devenv:global: # 全局变量,上面的提交到github的命令有用到- GH_REF: github.com/YuyingWu/blog.git- secure:
# secure是自动生成的,执行`travis encrypt 'GH_TOKEN=${your_github_personal_access_token}' --add`

相信代码和注释写得很清楚了,有个地方需要进一步解释的,github提交那part,涉及github access token的生成和加密。

  1. 生成github的Personal Access Tokens(打开分支提交的权限)
  2. 安装Travis CLI gem install travis(如果登录遇到环境问题,可以看看下面参考文章里面的解决方案)
  3. 进入到本地dev目录下(带有.travis.yml),执行travis login登录,再执行travis encrypt 'GH_TOKEN=${your_github_personal_access_token}' --add加密你的personal access token(也就是后来.travis.ymlenv.global.secure的值)

.travis.yml提交之后,看看Travis CLI上,开始持续集成了哈。


大功告成,集成之后,在github pages的页面上也能看到文章的更新。

2. CI到我的服务器

我的服务器是DO家(Digital Ocean)的,那一开始服务器初始化的过程,大家可以参考各个server商提供的setup文档哈,总的来说,在本地有个服务器信任的id_rsa的ssh文件,我们是可以通过ssh user@ip_address登录到服务器的。

# 这个命令会自动把 id_rsa 加密传送到 .git 指定的仓库对应的 travis 中去(在我本地这个文件叫qq_rsa,不是默认的id_rsa)
travis encrypt-file ~/.ssh/id_rsa --add

执行这个命令后,.travis.yml多了一行代码:(注意把其中的转义符\干掉哈),也会在分支目录下生成一个id_rsa.enc的加密文件,记得把这个文件也提交上去哟。

before_install:
- openssl aes-256-cbc -K $encrypted_3cf6c1fd150f_key -iv $encrypted_3cf6c1fd150f_iv-in qq_rsa.enc -out ~/.ssh/id_rsa -d

然后为了保证在Travis里面能正常执行,我们处理下运行环境的rsa文件权限和输出提示信息,before_install如下。

before_install:
- openssl aes-256-cbc -K $encrypted_3cf6c1fd150f_key -iv $encrypted_3cf6c1fd150f_iv-in qq_rsa.enc -out ~/.ssh/id_rsa -d
- chmod 600 ~/.ssh/id_rsa
- echo -e "Host 主机IP地址\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config

最后,在after_success里添加拷贝目标文件到服务器目标目录的操作,就大功告成了!

after_success
# other actions
- scp -o stricthostkeychecking=no -r ./* root@138.68.161.48:/home/wyyNode/public/blog/

参考文章

  • 如何快速搭建一个有域名且持续集成的hexo博客(2.0版) - Eva-Yue
  • Hexo 自动部署到 Github - 三点水
  • 持续集成服务 Travis CI 教程 - 阮一峰
  • "no implicit conversion of nil into String" when logging in - 在执行travis login遇到的问题的解决方案
  • Deploy to GitHub pages from Travis CI
  • 使用 Travis 将 GitHub 文件上传传至服务器 - Godi13

笔者 @Yuying Wu,前端爱好者 / 鼓励师 / 新西兰打工度假 / 铲屎官。目前就职于某大型电商的B2B前端团队。

感谢你读到这里。如果你和我一样喜欢前端,喜欢捣腾独立博客或者前沿技术,或者有什么职业疑问,欢迎关注我以及各种交流哈。

独立博客:wuyuying.com
知乎ID:@Yuying Wu
Github:Yuying Wu

开箱即用,Hexo博客的github+server自动部署相关推荐

  1. 【Hexo博客搭建】将其部署到GitHub Pages(二):如何初始化并部署?

    简介: 本系列文章属于半笔记半教程的零基础小白入门文,教你将 Hexo 部署到 GitHub Pages 应该怎么做,跟着此系列文章最终可以获得自己的静态博客网站.流程很长,分成不同的篇幅,此为本系列 ...

  2. 【Hexo博客搭建】将其部署到GitHub Pages(三):怎么写作以及更新?

    简介: 本系列文章属于半笔记半教程的零基础小白入门文,教你将 Hexo 部署到 GitHub Pages 应该怎么做,跟着此系列文章最终可以获得自己的静态博客网站.流程很长,分成不同的篇幅,此为本系列 ...

  3. 【Hexo博客搭建】将其部署到GitHub Pages(四):更换博客主题并进行个性化配置

    前几篇文章教了大家如何在GitHub上部署hexo博客以及怎么写文章,这次我们一起换掉其默认的主题,并进行一些简单配置,让咱们的博客更充满特色. 一.挑选心仪的hexo主题 这是我们未更换前,默认主题 ...

  4. github page hexo博客gitee_hexo + github 博客搭建

    原文链接 使用hexo搭建博客,托管于github 配置环境: node + git hexo 安装hexo npm install hexo -g 初始化hexo hexo init 或 hexo ...

  5. Hexo 博客添加 README.md 以及部署到 GitHub 丢失/显示不正常解决方法

    GitHub 项目的README.md为自述文件,可对该项目进行介绍,解释等. 使用 Github Pages 和 Hexo 搭建的博客,如果在最开始建立仓库的时候没有创建README.md文件,那么 ...

  6. Windows下使用GitHub Pages搭建hexo博客详细教程以及Next主题超全配置

    根据下面的教程搭建的博客见这里 前言 马上要进入研究生了,不能再过浑浑噩噩的日子了,搭建一个小网站,用于记录自己所学的东西.其实,之前在腾讯云1元乞丐版上也搭建过博客,但是呢,只用来扯淡了.这次使用 ...

  7. 记录本地Hexo博客部署到服务器上

    文章目录 前言: 武汉加油,中国加油! 一.服务器使用 二.部署博客 环境部署 服务器配置 0x01: 创建私有 Git 仓库 0x02:配置 Nginx 托管文件目录 0x03:创建 Git 钩子 ...

  8. 使用Travis CI自动部署Hexo博客

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

  9. Git 备份 Hexo 博客

    Hexo 部署到 github 上的博客是通过 hexo g 编译后生成的文件,用于生成网页的,而不是 Hexo 博客的源文件,其部署的文件在本地的 .deploy_git 文件夹下,而博客的配置文件 ...

最新文章

  1. MYSQL 使用自定义表变量
  2. 【错误记录】反射内部类报错 ( Android 使用 Hook 时反射内部类报错 )
  3. python从视频中提取音频_提取视频中的音频——python三行程序搞定!
  4. ASP.NET 泛型类型 Dictionary操作
  5. 数据结构 - 赫夫曼树
  6. 工具类:获取 spring 容器中 bean
  7. ReactNative环境搭建扩展篇——安装后报错解决方案
  8. 中国企业深陷「内卷」,原因找到了
  9. Sandy Bridge 12款双核心产品正式入列 Core i7-2620M Core i5-2540M
  10. onclick的值传给php,php – 从onclick事件将HTML属性传递给jQuery函数
  11. MVCWebForm对照学习:文件上传(以图片为例)
  12. 微服务架构的分布式事务解决方案
  13. 罗克露计算机组成原理书籍,计算机组成原理完整版罗克露全原版.ppt
  14. 怎么给win10进行分区?
  15. 湖南省中职学业水平考试复习试题(语文)
  16. linux_ohs安装_weblogic进行管理
  17. 降噪蓝牙耳机评测排行榜最新,综合表现好的降噪蓝牙耳机分享
  18. python勾股定理中三个数的关系是、找出三十以内的_从勾股定理到余弦相似度-程序员的数学基础...
  19. 物联网ThingsBoard源码本地编译篇,超详细教程,小白看过来!
  20. 【C++】spdlog--log4cxx有点笨重,试一试spdlog

热门文章

  1. c语言 整数拆分,C++ 整数拆分方法详解
  2. tplinkwr710n改无线打印服务器,TP-Link TL-WR710N V1无线路由器AP模式怎么设置
  3. 【新手教程】如何在Win11上制作一个模仿MacOS的桌面?
  4. CentOS7创建普通用户
  5. jQuery UI 使用心得及技巧
  6. 解决苹果手机滑动卡顿
  7. Win11如何把d盘空间分给c盘?Win11d盘分盘出来给c盘的方法
  8. 读 Samuel Enoch Stumpf 之《西方哲学史》
  9. java万能引用_Java的四种引用方式
  10. 计算机一级c云大,云南大学网红C位易主!新晋流量霸主竟然是……