05月26, 2016

使用 git hook 自动化部署你的网站

我在上一篇文章跟大家介绍过目前的纯静态的网页很火,而这些网站有个美中不足的地方就是要手动的把静态网页上传到服务器,如通过 FTP 和 SSH 等等。而现在很多人都喜欢用 GitHub 来写博客,备份方便而且在需要的时候还能回滚。但是每次写完后还要去服务器 git pull ,很不方便,姿势不够优雅。今天我来教一下大家如何通过 git hooks 来让服务器自动部署你的新代码。完成后你只要在本地点击 “推送” 后,服务器就能自动更新了~

在此之前我想先完整陈述一下用完了 git hooks 后,整个结构是怎样的。因为我之前进入了个误区,导致看了很多教程没法理解整个过程。完成 git hooks 后,你的代码会有 2 份,一份是存在 Github ,一份是存在服务器上。他们要分别单独推送更新。我之前一直以为可以只把代码推送到 Github ,然后服务器就可以自动的从 Github 下载最新的代码。

  • Github (一份代码,用于备份)
  • 服务器上的 git-directory.git 目录 (空目录,仅仅包含配置文件,用于更新 www 目录)
  • 服务器上的 wwwroot 目录 (第二份代码,用于网站)

在开始之前,先先配置好本机与服务器之间的 SSH KEY 登录,电梯:https://g.32ph.com/post/mac-ssh-remote-authorized-key.html

在服务器上新建一个远程仓库

这里的远程仓库跟你放代码的 中央仓库 (如 Github),不是同一个。
ssh 进入到服务器后,在你喜欢的地方,假设在 cd /root/repos/ 执行 git init --bare git-directory.git
这样就能新建一个包含了 Git 的配置文件的裸仓库

配置服务器上网页根目录

切换到你网页根目录如 cd /root/data/wwwroot/ ,运行一下命令:

git init
git remote add origin /root/repos/git-directory.git
git fetch
git checkout master

配置 Git Hook

切换到 /root/repos/git-directory.git/hooks 目录下,执行 cp post-receive.sample post-receive 来重命名 post-receive 让其生效,并输入 vim post-receive 增加以下内容:

#!/bin/sh

unset GIT_DIR

DeployPath="/root/data/wwwroot"

cd $DeployPath
git pull origin master

exit 0

其中 DeployPath 一定要用绝对路径!
保存后,运行 chmod +x post-receive ,改变一下权限后,服务器端的配置就完成了。

本地仓库添加远程地址

最后我们只需要在本地仓库添加这个服务器远程仓库的地址就可以啦,这里不同的客户端设置的方法也稍微有点不一样。
相同的是服务器的远程仓库路径是: alias:~/repos/git-directory.git
这里的 alias 是你在设置本机 ~/.ssh/config 时所设定的服务器别名。

最后

事实上,通过这种方式,实际上 git-directory.git 就成了你的一个git服务器,上面第三步编辑的 post-receive 就是一个钩子 (hook) 文件,实际上就是一个可执行的 shell 脚本,当你在你的本地提交代码(git push)时,git 服务器收到你的文件提交同时会触发这个钩子的动作,也就是执行这个 shell 脚本。说到这里,接下来这个 shell 脚本能做什么,重启服务器?触发构建?把文件部署到别的机器上……尽情地发挥你的想象吧!

玩法还有多种多样,我这里只是简单的介绍如何更新服务器文件。


本文部分内容参考和引用以下网站:
使用git自动部署简单网站:https://segmentfault.com/a/1190000003836345
用 Git Hooks 进行自动部署:http://imweb.io/topic/56172ddc5d6f37745e8f4982
特此感谢

本文链接:https://g.32ph.com/post/use-git-hooks-to-upload-website.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。