自动部署 hexo 项目至阿里云轻量级服务器

1. 服务器 - 安装 git

服务器需先安装git,如已安装,则跳过。

1
2
3
4
5
# 使用root用户或有权限的用户执行命令,安装git
sudo yum install git

# 安装完毕后,执行下行命令,若打印 git 版本,则安装成功
git --version

2. 服务器 - 生成 SSH-Key 密钥

1
2
# 检查 root 目录下是否已存在密钥  -la是显示隐藏文件
cd /root && ls -la

我的 root 目录下还没有密钥,执行下行命令生成 SSH-Key, 记得替换成自己的邮箱。

1
ssh-keygen -t rsa -C "fooso2021@gamil.com"

执行该命令后,第一行会提示你 SSH-Key 的保存地址,无需改动就直接回车。

然后他会让你输入二次密码。密码是用来保护你的密钥,可以直接 enter 跳过,否则后边拉取代码时会要求输入密码。

生成完毕后,会在当前文件夹下生成一个 .ssh 的隐藏文件夹,里边有两个文件 id_rsa (私钥) 和 id_rsa.pub (公钥)。现在就可以直接复制使用了。

3. github - 配置 SSH-Key

在 个人设置 - SSH and GPG keys 中上传刚才生成的 id_rsa.pub

配置地址

4. 服务器 - 拉取 hexo 项目代码

我的服务器里,hexo 项目代码放在 /home/git/sofor-v1 文件目录下。

1
2
3
4
5
6
7
8
9
# 移动到home目录下
cd /home

# 创建项目文件夹
mkdir git && cd git

# 此时已创建完毕,开始拉取代码 - 克隆地址替换为自己项目地址
git clone git@github.com:So-For/sofor-v1.git
# 拉取代码过程中可能会提示连接问题, 输入 yes 继续

5. 服务器 - npm 全局安装 hexo-cli 并建立 hexo 全局软连接

1
2
3
4
npm install hexo-cli -g

# 建立hexo全局软连接 (如报错,则使用 ln -sf 命令,强制连接连接)
ln -s /download/nodejs/bin/hexo /usr/local/bin/

6. 服务器 - 创建 git 裸仓库

执行下面代码,创建只有提交记录的空仓库。具体原理移步 git裸仓库实现自动化部署

1
2
3
cd /home/git
# 创建裸仓库
git init --bare bare.git

7. 服务器 - git 裸仓库自动构建、部署脚本

本地的deploy命令只是把静态文件提交到git仓库,既然有git hooks,那么我们可以在有文件提交上来时,再将文件拷贝到博客网站目录。 进入到git仓库hooks目录,并创建钩子post-receive

1
2
3
4
cd /home/git/bare.git/hooks
# 创建 post-receive git hooks
touch post-receive
vim post-receive

输入下面脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/sh
# 当发生错误时中止脚本
set -e

#判断是不是远端仓库
IS_BARE=$(git rev-parse --is-bare-repository)
if [ -z "$IS_BARE" ]; then
echo >&2 "fatal: post-receive: IS_NOT_BARE"
exit 1
fi
echo "deploy start================================================"
# 清除变量
unset GIT_DIR
# 定义变量
BlogGitPath="/home/git/sofor-v1"
BlogBuildedPath="/home/git/sofor-v1/public/."
DeployPath="/var/www"
cd $BlogGitPath
# 更新代码
echo "fetch code ================================================"
git pull
# 安装依赖
yarn install
# hexo 生成静态文件
hexo g
# 将静态文件复制到部署目录
echo "copy public ==============================================="
cp -rf $BlogBuildedPath $DeployPath
echo "deploy end ================================================"

其中BlogGitPath为 hexo 项目绝对路径,BlogBuildedPath是 hexo 项目打包后的绝对路径,DeployPath是博客网站最终部署路径,git会先将 hexo 项目从 github 拉取到服务端仓库,然后执行node脚本安装依赖,再执行 hexo 打包命令。最后将打包完毕后的静态文件,拷贝到博客网站目录DeployPath

更该 post-receive 目录权限

1
2
chmod +x post-receive
chmod 777 -R /var/www

8. 客户端 - 本地仓库关联服务器 git 裸仓库

完成上述操作后,需要在客户端项目中关联到服务器的 git 裸仓库

1
2
3
# root:web服务器用户名
# x.x.x.x: web服务器的IP
git remote add deploy ssh://root@x.x.x.x/home/git/bare.git

9. 客户端 - 提交验证

关联完服务器 git 裸仓库之后,就可以在客户端提交一点测试代码进行验证。

每次提交代码的时候,需要先把代码提交到 github 上之后,再将提交记录提交到服务器 git 裸仓库中,这样就可以触发裸仓库的 post-receive 钩子,执行拉取最新代码、打包、部署的操作了。

1
2
3
4
5
# 提交代码到 github
git push origin
# 将提交记录提交到服务器 git 裸仓库
git push deploy
# 如果没有在服务端配置客户端的ssh时,会提示输入服务器密码,输入密码后就可以进行提交了

10. 客户端 - 服务器配置 windows 客户端SSH公钥(免密提交)

参考连接:https://blog.51cto.com/lengff/4580016

windows 环境可能会提示 ssh-copy-id 方法不存在,则参考下方连接

参考连接:https://blog.csdn.net/qq_45624685/article/details/122631083

参考文章:

https://www.cnblogs.com/sxdcgaq8080/p/10570150.html

https://juejin.cn/post/6844903640910544909

https://juejin.cn/post/7239256068743544890

https://www.imqianduan.com/git-svn/335.html

https://blog.csdn.net/qq_45624685/article/details/122631083