昨天刚折腾好博客,喜欢折腾的我又发现了一个问题 —— 每次我在本地 hexo deploy
完都需要登录服务器去:
git pull
sudo nginx -s reload
复制代码
作为一个程序猿,怎么能忍受这么不 geek 这么不技术的事情发生!
于是,我就想到了,能不能我在本地 git push
之后自动在服务器上 git pull
然后自动重启 nginx 呢?
于是 Google 了一下,发现果然前辈们的智慧是无穷尽的,早就有人提供了解决方案,我就来整理 & 搬运一下。
有一个东西叫做 git hook
,这个东西是干嘛的呢?简单来说,就是在 git 的执行流程中设置了断点,执行到某个流程的时候先去执行一下我们设置好的脚本,再接着执行。
艾玛,这可是个好东西,就决定用这玩意了。
生成 ssh 密钥
首先呢,我们得先配置一下我们的服务器,让我们 ssh 可以不用输密码就能登录:
cd ~/.ssh
ssh-keygen -t rsa -C "你的邮箱或者任何字符串"
复制代码
这里我们一直回车到结束就可以了,默认名字是 ~/.ssh/id_rsa
和 ~/.ssh/id_rsa.pub
,其中带有 pub 的是公钥,是要传给服务器的,私钥一定一定一定要保存好,不能泄漏。
然后我们用 ssh 去登陆服务器,通过用户名和密码登陆
# 在服务器环境下
vim ~/.ssh/authorized_keys
复制代码
然后在本机上执行
# 在本机环境下
pbcopy < ~/.ssh/id_rsa.pub
复制代码
把我们的公钥复制到剪贴板,再复制到服务器中的 ~/.ssh/authorized_keys
中,然后退出服务器的登陆,回到本机环境下:
# 在本机环境下
vim ~/.ssh/config
复制代码
在里面加入以下内容:
Host HOST_ALIAS # 用于 SSH 连接的别名,最好与 HostName 保持一致,都用ip或者都用域名
HostName SERVER_DOMAIN # 服务器的域名或 IP 地址
Port SERVER_PORT # 服务器的端口号,默认为 22,可选
User SERVER_USER # 服务器的用户名
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa # 本机上存放的私钥路径
复制代码
大功告成!
配置服务器上的 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 仓库,用于存放网站的源代码。
mkdir /home/user/www
cd /home/user/www
git init
git clone ~/repos/test.git
复制代码
配置 Git Hook
进入到 ~/repos/test.git/hooks
文件夹,使用 vi post-receive
创建一个脚本,当你在本地仓库执行 git push
后就会触发 post-receive
(关于 Git Hok)。
post-receive
的内容
#!/bin/sh
unset GIT_DIR
NowPath=`pwd`
DeployPath="../../www"
cd $DeployPath
git add . -A && git stash
git pull origin master
echo "your root password" | sudo -S nginx -s reload
cd $NowPath
echo "deploy done"
exit 0
复制代码
默认的情况下,脚本是无法执行的,所以我们需要为这个脚本添加可执行权限
chmod +x post-receive
本地仓库配置
这里的本地仓库就是你本机的仓库,不再是服务器上的了。我们要在原有的 Git 项目中加入一条新的 remote 源,以后往这个源推送代码就会自动部署了。
git remote add prod user@ip_address:repos/test.git
git push prod master
复制代码
如果是用 hexo 的自动部署的话,需要在_config.yml
文件里面的 deploy
中的 repo
改成如下:
deploy:
type: git
repo:
github: <repository url>
prod: user@ip_address:repos/test.git
复制代码
然后我在本地又写了一个 deploy.sh
的脚本,来一键部署:
hexo clean
hexo g
hexo d
复制代码
别忘了
chmod +x deploy.sh
复制代码
然后部署的时候只要
./deploy.sh
复制代码
就可以了!
Done!
程序猿就是这么鸡汁!