起因

更新blog时,总是需要登录到服务器,把文件复制粘贴到目录,或者在目录中修改,然后还要执行一下更新命令才行,虽然之前已经做到使用vscode免密登录服务器修改文件,也修改了npm命令来快速生成静态页面,但是由于vscode连接到服务器总是需要那么半分钟,想好的东西都没兴趣记了,所以萌生了自动更新的念头。

思路

我的办法有点取巧,主要思路是在服务器上clone一份仓库代码,然后本地push触发钩子之后推动服务器上的代码更新。不知道是否有更好的方法?

主要步骤

首先在服务器上部署一个git服务器

这个部分有专门的讲解,也可以看阮一峰老师的教程。搭建好之后创建一个hexo-blog.git的裸仓库,这个仓库是没有工作目录的。

然后将项目pushgit服务器上

我之前的项目是直接放服务器上的,改也是在服务器,现在我要做的是将它搬运到本地来,考虑到直接copy文件夹会比较慢,所以先压缩一下:

zip zipname.zip ./*  // 将当前文件夹的所有文件压缩到名为zipname的压缩文件中

这样传输速度就能飙升了。

在本地init git,然后把将仓库的远程地址设为服务器的git仓库地址:

git remote set-url origin username@ip:/srv/hexo-blog.git

再将本地代码(也就是服务器上的代码)pushgit服务器上去。

将服务器上的项目也使用git进行管理

这一步就简单了,我直接把服务器上的代码在/var/www/目录中又clone了一份:

git clone git@127.0.0.1:/srv/hexo-blog.git

这个命令中的127.0.0.1其实是猜的,手动尴尬…

关键步骤:修改git服务器中的自动化脚本

这一步其实也是在京东的凹凸实验室里面学的:

其中关键步骤是这样的:

image-20200811194403061

不过我的和它这上面的配置几乎不相同,因为我需要的是本地push触发仓库的hooks之后,在去项目所在的服务器目录下拉取代码,然后打包生成静态页面,在重启一下服务(由于仓库没有工作目录,我只能用这么蠢的方法了)。

在修改hooks中的post-update的过程中,由于不知道凹凸实验室那样操作的原理,所以改完之后一直找不到失败的原因,不知道是脚本没执行还是这个脚本根本就不能执行,一下子就陷入的僵局,没办法,看看注释上是怎么说的:

image-20200811192024119

最后一句话说**如果要启用hook,就需要将名字改为post-update**就是去掉后缀,这样就清晰了,不是脚本不能执行,而是里面写的有问题!

再次修改脚本:

image-20200811195344255

终于能跑了,并且有服务器执行的脚本的一些信息:

image-20200811195509704

但是!执行到后面又出问题了:

image-20200811195558236

不过看样子是权限的问题,由于我使用的是git用户clone的代码,所以作为git用户是没有权限去拉取的(搭建git服务器时创建的git用户),立马上手改权限:

// cd到项目所在目录
chown -R git ./hexo-blog/

再次从本地push

image-20200811195939029

大功告成!!!

等等,刷新页面好像并没有被更新,仔细一看输出:

Host key verification failed.
fatal: Could not read from remote repository.

原来还有权限问题,中间尝试过很多方法,比如说把项目所在目录改为git用户组,使用凹凸实验室的改法,发现都没有用,突然想到在搭建git服务器时,禁止了git用户登录shell,是不是这个问题呢…于是换一种方式拉取代码:

git clone root@ip:/srv/xxx.git

再一试,果然能行:

image-20200812113638812

也没有报错了,手动开心!hhhhh。

其它问题

同步问题

当我本地修改后再次提交,问题又来了,由于我在服务器上运行了npm run cg生成了大量静态页面,但是这些静态页面是和本地不同步的,所以再次提交到服务器时,服务器会提示先要把服务器修改push才行。解决方案有两个,一个是在本地生成静态页面,服务器直接拉取,第二个是使用.gitignore将项目的public文件夹忽略掉,这样就不会引发冲突。

pm2 restart后的问题

以上步骤都做好后,发现代码到服务器之后总是会修改db.json,按网友的说法这个文件是为了提高性能的,所以想想还是别忽略了,但是影响部署还是挺烦的,在脚本里面使用git checkout .,想着能不能恢复到本地的版本,但是每次本地提交后还是会生成,然后意识到是不是pm2 restart导致的,于是把脚本中这一行先删掉,果然就没生成了,所以git checkout .要放在restart后面,但是又遇到一个问题,restartcheckout好像没有被执行,感觉像是restart把脚本执行给结束掉了,那暂停几秒可不可行?

sleep 3s

执行下来好像真能行!

最后

但是看样子并不是最优解,期待以后能学习到更多这方面的知识。