Travis CI 自动部署 Hexo Blog

需求

老的部署方法:

  • 本地写md
  • push到github
  • 服务器上hexo c && hexo g

想要的部署方法:

  • 本地写md
  • push到github
  • 没了 坐等自动更新

不都是三步吗

第三步再细分的话就是

  • CI拉取变化的分支
  • 安装依赖
  • hexo c && hexo g
  • 将静态文件发送到服务器

网上的攻略写的太杂了 和我想象中的流程又有些不太一样 所以各种攻略提取一些有用的东西再综合一下..

Travis CI

持续集成工具

https://travis-ci.org/ 这个是免费给开源项目用的

https://travis-ci.com/ 这个收费的

使用github账号登录travis,然后pick上要自动部署的项目

tech_9_1

.travis.yml

travis的配置文件,必须放在项目根目录下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
language: node_js
node_js:
- '10'
# 激活travis的分支 按照自己实际情况来
branchs:
only:
- master
# 缓存某知名黑洞
cache:
directories:
- node_modules
# 安装依赖
install:
- npm i hexo-cli -g
- npm i
# 执行脚本
script:
- hexo clean && hexo g

这是利用travis自动打包的基础配置,把这个push上去其实就能在travis.org上看到自动打包的一个过程

把文件丢到服务器

需要travis免密登录服务器然后把东西丢到服务器上

以下几步最好不要在windows下执行,会翻车

创建sshkey

ssh-keygen -t rsa -C "blog"

-C 后面是描述(可以不要)

名字可以自个儿取 默认是 id_rsa (最好不要用默认的 我改成了id_rsa_travis_blog

当前用户的.ssh文件夹下会多出两个文件:

id_rsa_travis_blog -> 私钥

id_rsa_travis_blog.pub -> 公钥

然后把公钥发到要部署的服务器上

ssh-copy-id -i id_rsa_travis_blog.pub user@host

user和host改成指定的用户和主机名(不要用root嗷)

如果ssh端口不是22的话 加一个 -p port

进入服务器的user的.ssh文件夹

能看到authorized_keys文件新增了一条刚刚添加的公钥信息

最后chmod 644 authorized_keys,不然travis还是会提示输入密码

私钥加密

进入项目根目录,然后travis login登录travis(用github账户)

travis的安装需要ruby 此处略

登录成功后执行travis encrypt-file ~/.ssh/id_rsa_travis_blog --add

项目根目录会生成一个id_rsa_travis_blog.enc的加密文件

.travis.yml文件也会自动插入一条内容:

1
2
3
before_install:
- openssl aes-256-cbc -K $encrypted_xxxxxx_key -iv $encrypted_xxxxxx_iv
-in id_rsa_travis_blog.enc -out ~/.ssh/id_rsa_travis_blog -d

keyiv能在travis的环境变量里找到

tech_9_2

然后修改before_install

1
2
3
4
5
6
before_install:
- openssl aes-256-cbc -K $encrypted_xxxxxx_key -iv $encrypted_xxxxxx_iv
-in id_rsa_travis_blog.enc -out ~/.ssh/id_rsa_travis_blog -d
- eval "$(ssh-agent -s)"
- chmod 600 ~/.ssh/id_rsa_travis_blog
- ssh-add ~/.ssh/id_rsa_travis_blog

开启ssh-agent并添加私钥

文件传输

首先为了隐藏一些隐私,需要在travis上添加环境变量

tech_9_3

然后.travis.yml中添加授信

1
2
addons:
ssh_known_hosts: $BLOG_HOST:$BLOG_HOST_PORT

最后在after_success钩子中添加

1
2
3
4
after_success:
- cd public
- ls -a
- scp -o stricthostkeychecking=no -P $BLOG_HOST_PORT -r ./* $BLOG_USER@$BLOG_HOST:$BLOG_PATH

成了 push到远端后就能在travis上看到本次的自动部署流程了

tech_9_4

有总共花费的时间 整个流程的日志 还有邮件提醒