利用 Git实现博客一键部署

1 功能概述

利用 git服务端的 hooks可以在向服务端 push代码后执行我们设置好的脚本。

在 hook脚本里执行以下几个步骤:

  • 切换到我们项目的部署目录,这个目录就是环境变量 WEB_ROOT的值
  • 拉取最新的代码
  • 执行重启前所需要的的命令,可以没有
  • 重启服务

通过上面几个步骤就可以实现 push代码时服务端自动部署。

2 如何实现

2.1 创建服务端 git仓库

首先我们需要先在服务器上安装 git,使用 yum或 apt-get等包管理工具直接安装即可。

安装好 git后我们再创建一个 git用户:

adduser git

创建好用户后我们切换到 git用户的目录下(/home/git),切换 git用户目录主要是为了避免权限问题,因为我们后面执行的脚本都是由 git用户来执行。

创建一个空的 git仓库,仓库名字是我们项目的名字,这里以 sample为例:

 git init --bare sample.git

然后把 owner改成 git:

chown -R git:git sample.git

2.2 创建 hook脚本

hook脚本保存在 gti项目目录的 hooks中。这里我们要修改的是 post-recevie,这个文件中的脚本会在 push完成之后执行。想了解更多关于 git hooks可以访问 官网:Git - Git Hooks

我们打开 post-receive文件,向文件中添加如下命令:

cd $WEB_ROOT
git --git-dir $WEB_ROOT/.git --work-tree $WEB_ROOT pull
bash $WEB_ROOT/build.sh

WEB_ROOT 是项目的根目录,这里我们设置为 /home/git/projects/sample

首先在 /home/git 目录下创建 projects 目录,然后在 projects 目录下执行下面的命令初始化 git仓库:

git clone /home/git/sample.git

2.3 关联本地仓库和服务端仓库

如果之前没有创建本地仓库的话,先在项目根目录下执行 git init 创建本地仓库。

然后再执行下面的命令关联本地仓库和远程仓库:

git remote add git@serverIP:/home/git/sample.git

注意命令中的 serverIP是服务器 IP。

关联完成之后,在项目根目录创建一个 build.sh的文件,可以在这个文件中添加重启的命令,如果没有要执行的命令创建一个空文件即可。

上面的步骤全部完成之后,使用 git addgit commit 命令将要添加的文件和目录全部添加到本地 git仓库中,添加完成之后执行 git push --set-upstream origin master 将项目文件 push到服务器上。

3 注意事项

  • 权限问题,全程都要在 git用户目录中执行,或者 git用户具有执行权限的目录中执行。
  • 项目自动重启,自动重启的代码放在 build.sh中,在 push完后会自动执行 build.sh中的命令。同样需要注意权限问题,如果使用了 nginx的话,nginx需要由 git用户启动。
  • uwsgi自动重启,在 uwsgi配置文件中添加 py-autoreload=1,uwsgi在代码更新后会自动重启。
  • git用户需要设置密码,需要为 gti用户设置密码,在第一次 push时需要。
  • 需要开放 22端口

4 参考