CODERFE

利用TravisCI自动部署Hexo blog

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

前几天的一篇文章介绍了搭建自己的Hexo博客,可是,今天遇到了一个问题:我要在另一台电脑上写博客文章,但是博客的源代码却不在身边,而且我也没有备份。于是就有一下几个解决方案:

  • 拷贝到U盘随身携带。但是,相信我,总有一天你会忘记的
  • 备份在云端,比如DropBox或者其他云盘。缺点:太麻烦,每次更新都要手动上传
  • 放在Github上。恩,这似乎是个不错的办法。但是这个方法每次既要更新博客,还要push到Github上

Travis CI解决方案

约定

  • 这些步骤都是Linux中完成的,其他平台的步骤大同小异
  • 以我的博客为例,blog是源码项目(目录),coderfe.github.io是部署后的博客项目

准备工作

  • 安装Travis Ci命令行工具

    1
    $ gem install travis
  • 生成 SSH key,并且把id_rsa.pub添加为coderfe.github.io项目的Deploy key,注意要勾选Allow write access,因为Travis CI要对这个仓库拥有写入权限

    1
    2
    $ ssh-keygen -t rsa -C "your_email@example.com"
    # 生成的ssh key一般在`~/home/.ssh`目录下
  • 在本地的blog项目中新建.travis文件夹,最后它的结构如下:

    1
    2
    3
    .travis
    |__id_rsa.enc
    |__ssh_config

正式开始

  • 把整个Hexo项目push到Github上,这个就是博客的源代码
  • 前往Travis CI官网用GitHub账号的登陆,并把自己的项目同步到Travis CI,然后把coderfe/blog的开关打开
  • 安装Travis CI命令行并用GitHub账号登录

    1
    2
    3
    4
    # 安装
    $ gem install travis
    # 登录
    $ travis login --auto
  • 加密id_rsa私钥(不能暴露在公开仓库中)

    1
    2
    3
    4
    5
    6
    7
    8
    # 把id_rsa复制到当前目录.travis/
    $ cp ~/.ssh/.id_rsa .
    # 加密之前必须新建.travis.yml文件,否则会报错
    $ touch .travis.yml
    # 加密
    $ travis encrypt-file ssh_key --add
    # 删除id_rsa
    $ rm id_rsa

以上代码执行完成功后在.travis.yml文件中有一串字母和数字,这是用来解密的,每个人都不一样,先不要动,而且会生成了id_rsa.enc文件,把.travis.yml移动到blog根目录

  • 再在.travis下新建ssh_config文件,内容如下:

    1
    2
    3
    4
    5
    Host github.com
    User git
    StrictHostKeyChecking no
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes
  • 配置.travis.yml文件,我的配置如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    branches:
    only:
    - master
    language: node_js
    sudo: false
    node_js:
    - 'stable'
    before_install:
    - openssl aes-256-cbc -K $encrypted_d2cb722f4635_key -iv $encrypted_d2cb722f4635_iv
    -in .travis/id_rsa.enc -out ~/.ssh/id_rsa -d
    - chmod 600 ~/.ssh/id_rsa
    - eval $(ssh-agent)
    - ssh-add ~/.ssh/id_rsa
    - cp .travis/ssh_config ~/.ssh/config
    - git config --global user.name "coderfe"
    - git config --global user.email coderfee@outlook.com
    - git clone -b master git@github.com:coderfe/coderfe.github.io.git .deploy_git
    install:
    - npm install hexo-cli -g
    - npm install
    script:
    - hexo clean
    - hexo g
    - hexo d

需要注意的问题

  • Deploy key权限问题,记得勾选Allow write access
  • 加密私钥id_rsa,私钥不能暴露在公开仓库,否则其他人也会拥有你仓库的读写权限

结语

利用Travis CI持续集成服务,再也不必去手动备份了,只需要一次push就可实现博客的更新和备份,大大提高了效率啊,有木有!这种自动化的工具真的是多多益善。当然像Nodejs这样的项目都在用这项服务,说明自动部署Hexo Blog只是其功能中很小的一部分,继续学习!

参考资料

用 Travis CI 自動部署網站到 GitHub
Travis CI官方文档