起因
更新blog时,总是需要登录到服务器,把文件复制粘贴到目录,或者在目录中修改,然后还要执行一下更新命令才行,虽然之前已经做到使用vscode免密登录服务器修改文件,也修改了npm命令来快速生成静态页面,但是由于vscode连接到服务器总是需要那么半分钟,想好的东西都没兴趣记了,所以萌生了自动更新的念头。
思路
我的办法有点取巧,主要思路是在服务器上clone一份仓库代码,然后本地push触发钩子之后推动服务器上的代码更新。不知道是否有更好的方法?
主要步骤
首先在服务器上部署一个git服务器
这个部分有专门的讲解,也可以看阮一峰老师的教程。搭建好之后创建一个hexo-blog.git的裸仓库,这个仓库是没有工作目录的。
然后将项目push到git服务器上
我之前的项目是直接放服务器上的,改也是在服务器,现在我要做的是将它搬运到本地来,考虑到直接copy文件夹会比较慢,所以先压缩一下:
zip zipname.zip ./* // 将当前文件夹的所有文件压缩到名为zipname的压缩文件中
这样传输速度就能飙升了。
在本地init git,然后把将仓库的远程地址设为服务器的git仓库地址:
git remote set-url origin username@ip:/srv/hexo-blog.git
再将本地代码(也就是服务器上的代码)push到git服务器上去。
将服务器上的项目也使用git进行管理
这一步就简单了,我直接把服务器上的代码在/var/www/目录中又clone了一份:
git clone git@127.0.0.1:/srv/hexo-blog.git
这个命令中的127.0.0.1其实是猜的,手动尴尬…
关键步骤:修改git服务器中的自动化脚本
这一步其实也是在京东的凹凸实验室里面学的:
其中关键步骤是这样的:

不过我的和它这上面的配置几乎不相同,因为我需要的是本地push触发仓库的hooks之后,在去项目所在的服务器目录下拉取代码,然后打包生成静态页面,在重启一下服务(由于仓库没有工作目录,我只能用这么蠢的方法了)。
在修改hooks中的post-update的过程中,由于不知道凹凸实验室那样操作的原理,所以改完之后一直找不到失败的原因,不知道是脚本没执行还是这个脚本根本就不能执行,一下子就陷入的僵局,没办法,看看注释上是怎么说的:

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

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

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

不过看样子是权限的问题,由于我使用的是git用户clone的代码,所以作为git用户是没有权限去拉取的(搭建git服务器时创建的git用户),立马上手改权限:
// cd到项目所在目录
chown -R git ./hexo-blog/
再次从本地push:

大功告成!!!
等等,刷新页面好像并没有被更新,仔细一看输出:
Host key verification failed.
fatal: Could not read from remote repository.
原来还有权限问题,中间尝试过很多方法,比如说把项目所在目录改为git用户组,使用凹凸实验室的改法,发现都没有用,突然想到在搭建git服务器时,禁止了git用户登录shell,是不是这个问题呢…于是换一种方式拉取代码:
git clone root@ip:/srv/xxx.git
再一试,果然能行:

也没有报错了,手动开心!hhhhh。
其它问题
同步问题
当我本地修改后再次提交,问题又来了,由于我在服务器上运行了npm run cg生成了大量静态页面,但是这些静态页面是和本地不同步的,所以再次提交到服务器时,服务器会提示先要把服务器修改push才行。解决方案有两个,一个是在本地生成静态页面,服务器直接拉取,第二个是使用.gitignore将项目的public文件夹忽略掉,这样就不会引发冲突。
pm2 restart后的问题
以上步骤都做好后,发现代码到服务器之后总是会修改db.json,按网友的说法这个文件是为了提高性能的,所以想想还是别忽略了,但是影响部署还是挺烦的,在脚本里面使用git checkout .,想着能不能恢复到本地的版本,但是每次本地提交后还是会生成,然后意识到是不是pm2 restart导致的,于是把脚本中这一行先删掉,果然就没生成了,所以git checkout .要放在restart后面,但是又遇到一个问题,restart后checkout好像没有被执行,感觉像是restart把脚本执行给结束掉了,那暂停几秒可不可行?
sleep 3s
执行下来好像真能行!
最后
但是看样子并不是最优解,期待以后能学习到更多这方面的知识。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!