在coding中自动化部署hexo

当掌握了如何配置hexo后,我心里在想,如果每次我写完blog后要做以下步骤部署代码:
$ hexo cl && hexo g && hexo d,是否有方法能直接通过git推送到仓库就自动编译好代码呢?于是乎就寻找有没有自动化部署的方法,不找不知道,一找吓一跳,为了学好自动化部署,愣是碰了不少比壁,当然也学会了不少东西,最后也是成功部署,写这篇文章记录一下我踩过的坑

工具/框架版本

工具/框架版本
node12.22.5
npm6.14.14
hexo-cli4.3.0
git2.33.0
vscode1.59.1
source tree3.2.1

配置持续集成

请参考《Coding持续集成自动部署Hexo博客》

排坑环节

参照《Coding持续集成自动部署Hexo博客》

这片文章部署后会出现一系列小插曲,但这并不是文章的代码有误,而是由于框架版本升级之后出现的一系列兼容问题

我使用的是《Coding持续集成自动部署Hexo博客》内的方案1

为了更好地说明其中的问题,我贴出文章中自定义构建过程的代码

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 'node -v'
sh 'npm install -g hexo-cli'
sh 'npm install hexo --save'
sh 'npm install -g hexo-generator-searchdb'
sh 'npm install -g'
echo '构建完成.'
}
}
stage('测试') {
steps {
echo '单元测试中...'
sh 'hexo clean'
sh 'hexo g '
echo '单元测试完成.'
}
}
stage('部署') {
steps {
echo '部署中...'
sh 'npm install hexo-deployer-git --save'
sh 'hexo deploy'
echo '部署完成'
}
}
}

当我使用上述代码构建时,会出现构建失败的提示,以下是排坑环节

hexo g的问题

问题

查看构建过程的字样,发现问题出现在sh hexo g这个步骤

报错信息如下

FATAL { err: [2021-08-25 18:15:36]
TypeError: line.matchAll is not a function

} ‘Something's wrong. Maybe you can find the solution here:
%s’ ‘\u001b[4mhttps://hexo.io/docs/troubleshooting.html\u001b[24m'

原因

版本12.0.0的Node.js中支持String.matchAll()

两种解决方法:

  1. 请将nodejs升级到高于12.0.0的版本

  2. _config.xml中的 highlight->enable的值从true更改为false

这样可以避免异常,但方法二会让代码失去高亮显示功能
@bovenson ———— stackoverflow

解决方法

如果嫌麻烦,可以使用方案2,直接在_config.xml里设置就好了,而我采用了方案1,保留了语法高亮的功能

首先升级nodejs的版本,在stage('检出')stage('构建')之间加入一段升级nodejs的stage()方法

代码如下

 stage('检出'){
···
}
+stage('更新nodejs版本') {
+ steps {
+ echo '更新node版本中...'
+ sh 'npm install -g n'
+ sh 'n 12.22.5'
+ sh 'node -v'
+ echo '更新node版本完成.'
+ }
+ }
stage('构建'){
···
}

这样,重新提交代码则成功把v10.x.x的nodejs升级为v12.22.5的nodejs(选择这个版本是为了与我的本机的nodejs版本保持一致)

npm install -g的问题

问题

错误信息如下

npm install -g
npm ERR! code ENOLOCAL
npm ERR! Could not install from “” as it does not contain a package.json file.
npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2021-08-25T12_47_51_060Z-debug.log
script returned exit code 1

原因

初步估计是因为更新了高版本的nodejs后出现冲突,之前的版本有点低(待明确)

解决方法

stage(构建)里的做以下修改

stage('构建') {
steps {
echo '构建中...'
sh 'node -v'
sh 'npm install -g hexo-cli'
sh 'npm install hexo --save'
sh 'npm install -g hexo-generator-searchdb'
- sh 'npm install -g'
+ sh 'npm -g install npm@4.2.0'
echo '构建完成.'
}
}

SourceTree的问题

问题

在说明这个问题之前,我是用的是最新版的SourceTree(v4.x.x),在感叹它好用之余,就被坑到了

当我第二次推送内容到代码仓库的时候会出现以下报错

Updates were rejected because the tip of your current branch is behind its remote counterpart. Integrate the remote changes (e.g. hint: ‘git pull …’) before pushing again.

意思为

更新被拒绝,因为您当前分支的最新提交落后于其对应的远程分支。

再次推送前,先与远程变更合并(如 ‘git pull …’)

原因

在我成功构建之后,我代码仓库中的代码就会自动被编译好,也就是说,我的代码仓库跟我本地电脑的内容是不一样的

这时候我再push我的hexo源码去我的代码仓库就会出现以下报错

解决方法

这个时候必须要用到SourceTree里的强制推送功能

很坑的是SourceTree v4.x.x使用无法直接开启强制推送功能,而v4.x.x则可以开启,因此,直接选择v3.x.x的SourceTree,我这里使用的是v3.2.1(255),这个问题就迎刃而解了

后记

如果有小伙伴知道怎么修改Mac SourceTree v4.x.x强制推送,烦请邮件告知我,感激不尽

本文仅仅是记录个人排坑过程,非教学文章,欢迎留言或使用邮箱跟我一起探讨与勘误