把博客迁到阿里云并实现自动化部署

作者 likaiqiang 日期 2021-05-21
把博客迁到阿里云并实现自动化部署

前言

博客最初部署于coding page,为什么不用github page,因为当年github私有仓库收费,后来虽然免费了,但是一直没有迁移。

不久前就发现博客里面原先利用新浪微博做图床的图加载不出来了,当时没在意,以为是代理的问题,直到偶然在知乎上看到说是微博图床挂了(人家加了防盗链),不得已只能换个图床。

于是登录了好久都没光顾的coding,真是屋漏偏逢连夜雨,coding和腾讯云深度整合了,以前很简单的coding page搞得很复杂,于是动起了迁移阿里云的念头。

更换图床

sinaimgmover

看来好多人用微博作为博客的图床,微博一挂,炸出好多条鱼来。有人用go写了个脚本,可以一键把微博的图迁到阿里云。

添加travis ci

思路

以前是在本地通过hexo g 生成静态文件,然后通过hexo d 推到coding上的,然后coding page傻瓜式一键部署(甚至都不用自个操作。。。)。

这样做的坏处是没法优雅的保存源md文件,之前为了备份md文件,不得不维护两个git,很麻烦。

现在使用travis ci,直接把hexo g 搬到travis上,去除hexo d,利用alioss sdk上传。

实现

用自己的github登录travis ci, 初次登录的话印象中要设置github token,验证邮件(如果github绑定了多个邮箱,记得都找一找)。
然后点击头像,进入settings,点击Manage repositories on GitHub,选择要监控的仓库,等travis ci安装完毕就可以了,初次使用的话,印象中还要选一下plan,直接选免费的就行。

在项目的根目录创建.travis.yml,travis会根据这个文件的配置来部署,这里给个例子。

language: node_js
node_js:
- '10'
install: npm install
script: hexo g
branches:
only:
- master

添加aioss sdk

以前通过hexo d通过_config.yml里面的deploy配置来决定把代码推到哪里的。现在要推到阿里云,只能用sdk了,幸好alioss sdk有node版本。

更新.travis.yml

language: node_js
node_js:
- '10'
install: npm install
script: hexo g
branches:
only:
- master
after_success: node ./oss.js

oss.js

const OSS = require('ali-oss')
const path = require('path')
const fs = require('fs')
const client = new OSS({
region: '',
accessKeyId: '',
accessKeySecret: '',
bucket: ''
})
const searchFolder = (folder,callback)=>{
if(typeof folder === 'undefined'){
folder = path.join(__dirname,'./public')
}
if(fs.statSync(folder).isFile()){
callback(folder)
return
}
fs.readdir(folder,(err,paths)=>{
for(let p of paths){
const lastP = path.join(folder,`${p}`)
fs.stat(lastP,(error, stats)=>{
if(!err){
if(stats.isFile()){
typeof callback === 'function' && callback(lastP)
}
else {
searchFolder(lastP,callback)
}
} else {
console.error(err)
}
})
}
})
}
const entry = path.join(__dirname,'./public')
searchFolder(entry,(p)=>{
const relativePath = path.relative(entry,p)
const lastP = '/' + relativePath.split(path.sep).join('/')
client.put(lastP, fs.createReadStream(p)).then((result) => {
console.log('done');
});
})