目的

在编写本博客部署到服务器时,需要反复的 push 然后在服务器 pull ,不胜其烦。所以考虑自动部署,将重复的事交给脚本去做。 由于是个人博客,所以是以学习的目的为出发点,如果是公司项目的部署,请使用 jenkin Netlify 等自动部署的工具。了解以上,继续我们的话题。

githooks 原理

git 为我们提供了 hook 机制,在执行 git push等命令后,根据不同的钩子函数,触发不同的脚本。脚本文件存放在.git/hooks/文件夹中。 如果克隆一个项目,打开此文件夹可以看到一些主要的脚本例子。在这里我们只需要了解 post-receive 这个钩子,它将在 git push完成后触发。

WARNING

需要注意的是:整个流程涉及 ssh登录, linux 权限最后才是githooks。一定要确认问题发生在哪一环节。

ssh 登录

在我们部署之前,首先要了解 ssh 的登录机制,因为这对免密登录至关重要。在初用 git 进行版本控制时,我们都是使用 https 进行登录。但是这样做的弊端是 即使是项目的拥有者,也要每次输入账号密码。所以这里我们使用另一种登录的方式 ssh 登录。

ssh 创建秘钥

ssh-keygen -t rsa -C "email@email.com"

一般情况,我们不设置密码,使用默认路径存储秘钥,所以这里要连续敲三个回车。秘钥保存在:

  • window C:\Users\Administrator\.ssh
  • linux /root/.ssh
  • mac 这里不做探讨。

这里的秘钥 Client 和 Server 可以使用相同的公钥进行登录。

ssh 公钥登录

生成客户端秘钥后,我们需要在仓库中能识别这个公钥,并且需要有一个类似于数据库的东西存储账号密码(公钥)。

$ cd /home/git/
$ mkdir .ssh
$ touch .ssh/authorized_keys

authorized_keys就相当于数据库,我们需要将生成的公钥(id_isa.pub)内容添加到此文件中。

添加登录信任

如果是首次登录,会出现 yes/no 的一个提示,但是我们通过客户端命令使用脚本执行,无法弹出这个提示,所以需要在 /etc/ssh/ssh_config文件设置

Host *
StrictHostKeyChecking yes

默认选择 yes 。这个操作完成后,会自动在 /home/git/.ssh 下生成 known_hosts信任列表。

git 部署

我们所需要的环境有三个:

  • Client
  • Repository
  • Server

部署前要确定已经安装了 git ,并且创建了 git 群组以及 git 用户。 Client 是我们的客户端开发环境,Repository 是远程仓库,Server 是真正运行项目的地方。我的 Client 是 windows 系统。Repository 和 Server 位于同一 ip 下。 我们将分别讲述这三个环境需要做哪些事。

git Repository 部署

初始化 git 仓库。这里要注意区分 git init --baregit init,git init --bare相当于将仓库与代码分离,适合作为远程仓库。

git init --bare magix.git

git Client clone

git clone git@ip:/usr/local/src/server/magix.git

git Server clone

git clone /usr/local/src/server/magix.git

Server 如果不小心也使用了 ip clone项目,会导致一直提示Permission denied, please try again.。如果是因为这个路径导致,可以修改 /当前项目/.git/config 修改前:

url = git@server:/usr/local/src/xxx.git

修改后:

url = /usr/local/src/xxx.git

post-receive

这里不进行赘述,只是使用了基本命令。

#! /bin/sh
DeployPath="/usr.local/xxx"
cd $DeployPath
echo "POST-RECEIVE"
unset GIT_DIR # 去掉默认 git 环境变量
git pull

linux 权限管理

完成以上,只是流程上看似畅通,但是一定会有各种各样的坑。这就是为什么我没有一步一步写出命令代码,而是分模块的讲述整个过程。完全照搬 代码很难跑通,我们需要理解 linux 系统的一些基本使用,git 的基本使用,shell的运用。否则即使是特别简单的自动部署,也让人望而生畏。之前 我们创建了git 群组与用户,这里我们需要将 ssh 、Repository 、Server 相应的文件夹及项目,所有者都改为 git 。

# 如果是单个文件 去掉 -R
chown -R git:git foldername

并且 post-receive , /home/git/.ssh , /home/git/.ssh/authorized_keys 需要分别赋予权限。

# 赋予可执行权限 755
chmod +x ./post-receive
chmod 755 .ssh
chmod 644 .ssh/authorized_keys

参考

-rw------- (600) -- 只有属主有读写权限。

-rw-r--r-- (644) -- 只有属主有读写权限;而属组用户和其他用户只有读权限。

-rwx------ (700) -- 只有属主有读、写、执行权限。

-rwxr-xr-x (755) -- 属主有读、写、执行权限;而属组用户和其他用户只有读、执行权限。

-rwx--x--x (711) -- 属主有读、写、执行权限;而属组用户和其他用户只有执行权限。

-rw-rw-rw- (666) -- 所有用户都有文件读、写权限。这种做法不可取。

-rwxrwxrwx (777) -- 所有用户都有读、写、执行权限。更不可取的做法。