写在前面
N久之前在GitHub Page上部署了Hexo,本地生成文章的时候需要
hexo g&&hexo d
等步骤才能上传到GitHub,最近又把博客折腾到了VPS上,手动deploy到VPS的同时又不能更新GitHub上,因此搜索了一下解决方案,发现可以实现git flow push到source后,使用Travis CI 持续集成自动deploy到GitHub Page,同时推送到VPS服务器。
构建流程
基本准备:
- GitHub Source 即博客源码仓库,以下称为Source
- GitHub Page 静态页仓库
- 配置好Nginx,git等环境的VPS
构建流程如下:
- 新增或修改了文章,push到GitHub的source
- Travis CI 发现source改变后自动执行配置好的脚本,生成静态页面
- Travis 推送静态页面文件到VPS服务器
- Travis push静态页面到GitHub
GitHub 和 Travis 设置
因为之前已经建好Blog的仓库和GitHub Page的仓库了,这些网上都很多教程,并不复杂,就直接记录如何让Source的仓库和Travis关联的步骤:
进入GitHub的Setting页面
选择Developer settings
选择Personal access tokens,生成Travis需要的access token
填写一个token的描述,如hexoblog,选择repo,然后Generate token即可
这里要复制下生成的token(只允许看见一次),在Travis那边可以使用
打开 Travis 网站(https://travis-ci.org) ,org后缀的才是对GitHub Public仓库免费的,com的针对是付费的私有仓库的。使用GitHub账号登录。
- 网上很多教程说需要打开
Build only if .travis.yml is present
选项(.travis.yml存在才生成),但最新的设置好像没有这个选项了,这里也不会有影响,然后需要Add一个Token, 新增一个HEXO_TOKEN,ValuE那里填写刚刚GitHub复制的access token即可。
iv和key是后面VPS那边自动生成的,这里可以先忽略。配置完以后就需要到博客仓库.travis.yml
文件了。
本地配置
在本地Blog根目录下新建.travis.yml文件,配置如下:
其中github.com/redanula/redanula.github.com.git
为GitHub Page的仓库,HEXO_TOKEN
为Travis刚刚Travis配置的token的标识。language: node_js node_js: stable cache: apt: true directories: - node_modules before_install: - export TZ='Asia/Shanghai' install: - npm install script: - hexo clean - hexo g && gulp 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 "redanula" - git config user.email "yanglangjing@hotmail.com" - git add . - git commit -m "Travis CI Auto Builder at `date +"%Y-%m-%d %H:%M"`" - git push --force --quiet "https://${HEXO_TOKEN}@${GH_REF}" master:master branches: only: - master env: global: - GH_REF: github.com/redanula/redanula.github.com.git notifications: email: - yanglangjing@hotmail.com on_success: change on_failure: always
提交
.travis.yml
文件到GitHub,这时候GitHub Page就会自动生成了。可以打开Travis查看对应的Current构建过程。首次提交的之后,发现生成的 redanula.github.io 是空白的,找了下原因是因为使用的next主题没有在Source仓库的hexo theme的目录,add & push对应的主题到Source仓库之后就成功了。接下来就是服务器的工作了。
VPS服务器配置
ssh登录VPS服务器,安装Travis服务
先安装ruby 如果提示如下:
current directory: /var/lib/gems/2.3.0/gems/ffi-1.9.25/ext/ffi_c
/usr/bin/ruby2.3 -r ./siteconf20180821-29696-1onq3fa.rb extconf.rb
mkmf.rb can’t find header files for ruby at /usr/lib/ruby/include/ruby.h
需要安装对应的ruby包:# 如果是在centos等系统下面,执行命令: yum install ruby-devel # 如果是在Ubuntu等系统下面,执行命令: apt-get install ruby-dev # 安装travis命令行工具,gem指令需要先安装ruby gem install travis
新增一个Git账号
adduser git
赋予git用户sudo权限
chmod 740 /etc/sudoers vim /etc/sudoers # User privilege specification 在root行后面增加 git ALL=(ALL:ALL) ALL # 保存退出后,修改回文件权限 chmod 440 /etc/sudoers
配置SSH
# 切换到git用户下 su git # 生成ssh密钥对 注意密码要为空,Travis自动过程中才不会被输入密码步骤卡住,生成后目录 /home/git/.ssh/id_rsa ssh-keygen -t rsa # 设置.ssh目录为700 chmod 700 ~/.ssh/ # 设置.ssh目录下的文件为600 chmod 600 ~/.ssh/* # 切换到.ssh/目录 cd .ssh/ # 将公钥内容添加到authorized_keys cat id_rsa.pub >> authorized_keys
Travis配置
# 在home目录下拉取Source仓库 cd /home git clone 你的仓库.git # cd到仓库根目录 # 登录github帐号 travis login --auto # 生成加密公钥文件id_rsa.enc并自动增加解密行到.travis.yml文件;-r 指向GitHub的Source仓库 travis encrypt-file ~/.ssh/id_rsa --add -r redanula/blog-hexo-source
修改.travis.yml,在before_install钩子后面添加权限处理:
before_install: - chmod 600 ~/.ssh/id_rsa - echo -e "Host 【配置名】\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
修改.travis.yml,在after_success钩子后面添加推送行为:
#/var/www/blog为博客目录 after_script: - rsync -rv --delete -e 'ssh -o stricthostkeychecking=no -p 对应ssh端口' public/ git@对应的IP或域名:/var/www/blog
这里注意
~/.ssh/id_rsa
路径需要去掉travis命令自动添加的转义 \ 这里的key和iv文件就是上文图中Travis后台自动出现的两个值openssl aes-256-cbc -K $encrypted_598a070685f0_key -iv $encrypted_598a070685f0_iv -in id_rsa.enc -out ~/.ssh/id_rsa -d
推送.travis.yml文件到Source(也可以vps先推送上去本地拉下来做上述几步的修改)
git add ./ git commit -m "Travis CI" git push
接下来就可以随意只管提交文章,Travis会自动持续集成到GitHub Page 和 服务器了:)。
Done. Your build exited with 0.
参考文章
Hexo - 使用 Travis CI 自動佈署 Blog
使用 Travis 自动部署 Hexo 到 Github 与 自己的服务器
用TravisCI持续集成自动部署Hexo博客的个人实践
使用travis-ci自动部署hexo博客
Deploying Pharo builds from Travis over ssh
Travis-CI自动化测试并部署至自己的CentOS服务器
Hexo搭建个人博客并使用Git部署到VPS