专栏名称: SegmentFault思否
SegmentFault (www.sf.gg)开发者社区,是中国年轻开发者喜爱的极客社区,我们为开发者提供最纯粹的技术交流和分享平台。
目录
相关文章推荐
程序员的那些事  ·  清华大学:DeepSeek + ... ·  2 天前  
程序员小灰  ·  3个令人惊艳的DeepSeek项目,诞生了! ·  2 天前  
OSC开源社区  ·  2024: 大模型背景下知识图谱的理性回归 ·  3 天前  
程序猿  ·  “未来 3 年内,Python 在 AI ... ·  4 天前  
程序员小灰  ·  DeepSeek做AI代写,彻底爆了! ·  5 天前  
51好读  ›  专栏  ›  SegmentFault思否

Hexo 博客终极玩法:云端写作,自动部署

SegmentFault思否  · 公众号  · 程序员  · 2019-01-09 08:00

正文

Hexo + Github + 语雀 + yuque-hexo +travis-ci+severless 打造全自动持续集成个人博客,云端写作,自动部署,完美体验~

一、Hexo+Github 的痛点

1. 为啥要用hexo+github?

作为一个程序猿,博客肯定是必须要有的拉,github也是必须要混的拉~所以: hexo + github = 高大上

2. 蛋疼的写作体验

使用hexo,会面临如下问题:

  • 博客源码怎么管理?

  • 图片存在哪?

  • 如何编写markdown文件?

相信很多人都在使用本地编辑器来写博客,那体验,真心蛋疼,比如说vscode,可视化插件一般般,图片还不能复制黏贴,想插入个图片还要先保存成文件放在本地,然后再引用,啥?你说七牛云存储?哪有复制黏贴爽呀~

当然,博客源码可以使用travis-ci来做持续集成,想写博客或者换个电脑,clone一下源仓库,写完push一下,就可以不用管了。but,比起独立站点的博客,如wordpress,还是觉得写作体验有点不爽。

3. 脑洞大开

偶然间,朋友安利了语雀这个文档写作平台,觉得这就是完美的写作体验,各种UI和编辑器都很舒服~秀个图:

markdown编辑器也是巨爽:

于是乎,就在想能不能在语雀里写作,写完之后自动同步到Github的博客呢?年轻就要有激情,说干就干,花了一天时间,结合了severless、yuque-hexo、travis-ci之后,终于跑通了整个写作、发布、自动部署的流程~

二、具体方案

整体流程:

  • 语雀发布一篇文章

  • webhook:调用serverless函数

  • serverless:发起请求trigger一个build任务

  • travis-ci:同步语雀文章并构建hexo

  • github:生成静态页面展示

1. hexo+github+triavs-ci

hexo如何部署,如何集成travis-ci,等等,我就不再讲了,网上类似的文章灰常多~

比如:

  • 使用Hexo+Github+TravisCI搭建自动发布的静态博客系统

  • GitHub pages + Hexo 搭建自己的个人博客

那么如何同步语雀的文章呢?答案就是: yuque-hexo

这是一个开源库: https://github.com/x-cold/yuque-hexo ,用法也很简单:

1)修改package.json,增加配置

  1.  "yuqueConfig": {

  2.    "baseUrl": "https://www.yuque.com/api/v2",

  3.    "login": "u46795",

  4.     "repo": "blog",

  5.    "mdNameFormat": "title",

  6.    "postPath": "source/_posts/yuque"

  7.  },

2)增加命令

  1.  "scripts": {

  2.    "sync": "yuque-hexo sync",

  3.    "clean:yuque": "yuque-hexo clean",

  4.    "deploy": "npm run sync && hexo clean && hexo g -d",

  5.  },

附上我的package.json文件。

2. serverless

目前阿里云和腾讯云都有serverless服务,免费的额度完全够用了,下面介绍一下如何配置。

1)创建函数

2)serverless 函数示例

  1. php

  2. function main_handler($event, $context) {

  3.     // 解析语雀post的数据

  4.    $update_title = '';

  5.    if($event->body){

  6.        $yuque_data= json_decode($event->body);

  7.        $update_title .= $yuque_data->data->title;

  8.    }

  9.    // default params

  10.    $repos = 'xxxx';  // 你的仓库id 或 slug

  11.    $token = 'xxxxxx'; // 你的登录token

  12.    $message = date("Y/m/d").':yuque update:'.$update_title;

  13.    $branch = 'master';

  14.    // post params

  15.    $queryString = $event->queryString;

  16.    $q_token = $queryString->token ? $queryString->token : $token;

  17.    $q_repos = $queryString->repos ? $queryString->repos : $repos;

  18.    $q_message = $queryString->message ? $queryString->message : $message;

  19.    $q_branch = $queryString->branch ? $queryString->branch : 'master';

  20.    echo($q_token);

  21.    echo('===');

  22.    echo ($q_repos);

  23.    echo ('===');

  24.    echo ($q_message);

  25.    echo ('===');

  26.    echo ($q_branch);

  27.    echo ('===');

  28.    //request travis ci

  29.    $res_info = triggerTravisCI($q_repos, $q_token, $q_message, $q_branch);


  30.    $res_code = 0;

  31.    $res_message = '未知';

  32.    if($res_info['http_code']){

  33.        $res_code = $res_info['http_code'];

  34.        switch($res_info['http_code']){

  35.            case 200:

  36.            case 202:

  37.                $res_message = 'success';

  38.            break;

  39.            default :

  40.                $res_message = 'faild';

  41.            break;

  42.        }

  43.    }

  44.    $res = array(

  45.        'status'=>$res_code,

  46.        'message'=>$res_message

  47.    );

  48.    return $res;

  49. }


  50. /*

  51. * @description  travis api , trigger a build

  52. * @param $repos string 仓库ID、slug

  53. * @param $token string 登录验证token

  54. * @param $message string 触发信息

  55. * @param $branch string 分支

  56. * @return $info array 回包信息

  57. */

  58. function triggerTravisCI ($repos, $token, $message='yuque update', $branch='master') {

  59.    //初始化

  60.    $curl = curl_init();

  61.    //设置抓取的url

  62.    curl_setopt($curl, CURLOPT_URL, 'https://api.travis-ci.org/repo/'.$repos.'/requests');

  63.    //设置获取的信息以文件流的形式返回,而不是直接输出。

  64.    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

  65.    //设置post方式提交

  66.    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");

  67.    //设置post数据

  68.    $post_data = json_encode(array(

  69.        "request"=> array(

  70.            







请到「今天看啥」查看全文