昨天刚折腾好博客,喜欢折腾的我又发现了一个问题——每次我在本地hexo deploy
完都需要登录服务器去:
1 | git pull |
作为一个程序猿,怎么能忍受这么不geek这么不技术的事情发生!
于是,我就想到了,能不能我在本地git push
之后自动在服务器上git pull
然后自动重启nginx呢?
于是Google了一下,发现果然前辈们的智慧是无穷尽的,早就有人提供了解决方案,我就来整理 & 搬运一下。
有一个东西叫做git hook
,这个东西是干嘛的呢?简单来说,就是在git的执行流程中设置了断点,执行到某个流程的时候先去执行一下我们设置好的脚本,再接着执行。
艾玛,这可是个好东西,就决定用这玩意了。
生成 ssh 密钥
首先呢,我们得先配置一下我们的服务器,让我们ssh可以不用输密码就能登录:
1 | cd ~/.ssh |
这里我们一直回车到结束就可以了,默认名字是~/.ssh/id_rsa
和~/.ssh/id_rsa.pub
,其中带有pub的是公钥,是要传给服务器的,私钥一定一定一定要保存好,不能泄漏。
然后我们用ssh去登陆服务器,通过用户名和密码登陆
1 | 在服务器环境下 |
然后在本机上执行
1 | 在本机环境下 |
把我们的公钥复制到剪贴板,再复制到服务器中的~/.ssh/authorized_keys
中,然后退出服务器的登陆,回到本机环境下:
1 | 在本机环境下 |
在里面加入以下内容:
1 | Host HOST_ALIAS # 用于 SSH 连接的别名,最好与 HostName 保持一致,都用ip或者都用域名 |
大功告成!
配置服务器上的 git 仓库
这里需要先介绍一下 git init —bare
git init —bare
和 git init
不一样的是,git init --bare
并不存储实际代码,仓库文件夹不会看到任何项目代码,反而生成了一些 .git
之外的文件夹,其中 hooks
文件夹就是存放git命令操作后需要执行的脚本。
需要新建两个文件夹,一个执行git init --bare
作为远端仓库,一个执行git init
作为服务器项目目录。
本地开发目录和服务器项目目录的remote
都要指向 服务器的远端仓库。
在服务器上创建一个裸仓库
首先要在服务器上建立一个裸仓库,假设我们用于存放裸仓库的文件夹是/home/user/repos/
,进入到该文件夹,然后使用git init --bare test.git
创建裸仓库,这样我们就有了一个叫test.git
的裸仓库啦。
在服务器上创建一个普通Git仓库
接下来就是在服务器上建立一个普通Git仓库,用于存放网站的源代码。
1 | mkdir /home/user/www |
配置Git Hook
进入到~/repos/test.git/hooks
文件夹,使用vi post-receive
创建一个脚本,当你在本地仓库执行git push
后就会触发post-receive
(关于Git Hok)。post-receive
的内容
1 | !/bin/sh |
默认的情况下,脚本是无法执行的,所以我们需要为这个脚本添加可执行权限chmod +x post-receive
本地仓库配置
这里的本地仓库就是你本机的仓库,不再是服务器上的了。我们要在原有的Git项目中加入一条新的remote源,以后往这个源推送代码就会自动部署了。
1 | git remote add prod user@ip_address:repos/test.git |
如果是用hexo的自动部署的话,需要在_config.yml
文件里面的deploy
中的repo
改成如下:
1 | deploy: |
然后我在本地又写了一个deploy.sh
的脚本,来一键部署:
1 | hexo clean |
别忘了
1 | chmod +x deploy.sh |
然后部署的时候只要
1 | ./deploy.sh |
就可以了!
Done!
程序猿就是这么鸡汁!