tags: [Hexo]

categories: [教程]

date: 2020/6/21 20:46:25


写在前面

静态博客最近越来越流行,但是写作、部署一直是个大问题。本文主要讲解如何使用语雀进行文章写作,使用 Coding CI 进行自动化部署的过程。支持多种部署方式(COS/OSS、自有服务器、Coding Pages 等)。


2019.01.08 更新:语雀开放了 WebHook,我这里提供两种方法让语雀这边改完可以马上自动同步到博客服务器。跳转到新内容


2020.06.21 更新:优化文章结构,附全套 CI 流程


静态博客空间选择

  1. Github Pages: 方便,不太稳定,Git部署
  2. Coding.net Pages: 速度尚可,Git部署,稳定性也不太好
  3. 腾讯云 COS + 腾讯云 CDN:需要备案,速度极快,稳定性好,COS 插件部署
  4. 自有服务器,可选择自建 Nginx 或者使用虚拟主机,可以复用旧的环境。本站现在使用该方法。


创建 Hexo 博客


已经有 Hexo 博客的可以跳过。



npm install -g hexo-cli


hexo init <folder>
cd <folder>
npm install



安装语雀文章下载插件


yuque-hexo 是一个 Node.js 环境下的语雀下载器,使用 npm 安装


$ npm i -g yuque-hexo




{
  "name": "hexo-blog",
  "version": "1.0.0",
  "private": true,
  "hexo": {
    "version": "3.9.0"
  },
  "scripts": {
    "clean": "hexo clean",
    "clean:yuque": "yuque-hexo clean",
    "deploy": "yuque-hexo sync && hexo deploy",
    "publish": "npm run clean && npm run deploy",
    "dev": "hexo s",
    "sync": "yuque-hexo sync",
    "reset": "npm run clean:yuque && npm run sync"
  },
  "dependencies": {
    "hexo": "^3.7.1",
    "hexo-deployer-git": "0.0.4",
    "hexo-generator-archive": "^0.1.0",
    "hexo-generator-category": "^0.1.0",
    "hexo-generator-index": "^0.1.0",
    "hexo-generator-json-content": "^3.0.1",
    "hexo-generator-tag": "^0.1.0",
    "hexo-renderer-ejs": "^0.1.0",
    "hexo-renderer-marked": "^0.2.4",
    "hexo-renderer-stylus": "^0.2.0",
    "hexo-server": "^0.1.2"
  },
  "yuqueConfig": {
    "baseUrl": "https://www.yuque.com/api/v2",
    "login": "page",
    "repo": "luan.ma",
    "mdNameFormat": "slug",
    "postPath": "source/_posts",
    "onlyPublished": true
  },
  "devDependencies": {
    "yuque-hexo": "^1.6.0"
  }
}


$ npm install


$ yuque-hexo sync


PS: 插件支持 Front-matter ,可以帮你把这些信息提供给 Hexo 做索引,在语雀写文章的时候直接写在前面,然后插入一条分割线即可,不写也没问题:


tags: [Hexo]
categories: [教程]
date: 2018-10-05 10:43:50
-----


部署配置

HEXO 支持本地生成 HTML 代码之后,自动发送代码到网上。


在 _config.yml 文件里面可以选择部署的配置,下面介绍三种部署方式,SFTP 部署,COS/OSS 部署,Git 部署


SFTP

安装 SFTP 部署插件:

$ npm install hexo-deployer-sftp --save-dev

_config.yml 找到 deploy 项目,写入配置:

deploy:
  type: sftp
  host: 129.1.1.1
  user: root
  pass: 1123456
  remotePath: /usr/www/luan.ma
  port: 22


Coding Pages

安装 Git 部署插件:

$ npm install hexo-deployer-git --save-dev

_config.yml 找到 deploy 项目,写入配置:

deploy:
  type: git
  repo: https://user:pass@test.coding.net/test/testRepo.git
  branch: master
  token: b1b322a7ba57812a3b72ecfb663c7d05e6d027fe

仓库需要自己建一个,现在 Coding 要先建一个项目,再建仓库,然后把仓库地址按上面的格式替换一下即可


user pass 是在 coding 的个人设置中,使用访问令牌功能来生成,需要选择仓库管理权限,账号密码都是生成的


部署好后,点击 Coding 的持续部署,静态网站,点击部署静态网站后,设置域名信息即可


COS/OSS

使用腾讯云、阿里云的对象储存:


安装插件:

$ npm install hexo-deployer-cos-cdn --save-dev

配置:详见 https://github.com/lxl80/hexo-deployer-cos-cdn

deploy:
  type: cos-cdn
  cloud: tencent
  bucket: luanma-1253534690
  region: ap-hongkong
  secretId: AKIXnqgJjzPtX0
  secretKey: 73nKjkZBbqt8IH


手动启动/部署 Hexo 博客


$ hexo s


$ hexo g



$ hexo g -d



自动化部署

本文使用 Coding 自动化部署流程,我直接把代码贴出来,你可以粘贴代码到 coding 的自动化流程即可:

pipeline {
  agent any
  stages {
    stage('检出') {
      steps {
        checkout([
          $class: 'GitSCM',
          branches: [[name: env.GIT_BUILD_REF]],
          userRemoteConfigs: [[
            url: env.GIT_REPO_URL,
            credentialsId: env.CREDENTIALS_ID
          ]]])
        }
      }
      stage('构建') {
        steps {
          echo '构建中...'
          sh 'npm install && npm run deploy'
          echo '构建完成.'
        }
      }
      stage('部署') {
        steps {
          echo '部署中...'
          echo '部署完成'
        }
      }
    }
    environment {
      YUQUE_TOKEN = '+zIGeTrj7Pw='
    }
  }

接下来,我们点击 Coding CI 的触发器,复制 API 触发的地址,然后我们到 腾讯云 SCF 创建一个云函数,选择 Python 3:

# -*- coding: utf8 -*-

def main_handler(event, context):
    import requests

    headers = {
        'Content-Type': 'application/json',
    }

    data = '\n    {\n    "ref": "master",\n    "envs": []\n}'

    response = requests.post('https://123.coding.net/api/cci/job/2/trigger', headers=headers, data=data, auth=('ptcr0mox', '56cc1c432e7e'))
    print(data)

然后把这个云函数的 POST 触发地址填到语雀的 WEBHOOK 地址即可。


写在后面


其实这篇文章干货不多,主要是应某网友的要求,顺便把我的 TenneyBlog 做个了结。核心是把 yuque-hexo 这个东西介绍给大家。这个插件由阿里巴巴的同学开发,我也做了一些微小的贡献。本博客目前也是使用这个方案同步语雀的文章。


当然,关于 Hexo 皮肤、评论插件等等玩法也要折腾很久,我就不在这篇文章里面说了。