用 git hooks 进行自动部署,从此不需要登录服务器

昨天刚折腾好博客,喜欢折腾的我又发现了一个问题 —— 每次我在本地 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!

程序猿就是这么鸡汁!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享