搭建git服务器以及web自动化部署

文章目录
  1. 前期准备
  2. 创建裸仓库
  3. 本地客户端推送
    1. 添加ssh到服务器
    2. 本地测试
  4. 添加hooks自动部署
  5. 参考

之前使用sae作为测试服务器,无奈云豆实在是消耗极快,于是就在阿里云上买了一个SEC, 还好当时是学生价。 因为之前用的sae提供的git作开发,迁移过来之后,也就想搭建一个git服务器,可以方便使用,并且还可以做到push上去代码,web页面可以自动更新了。 查了一些资料,大部分都一样, 不过也饶了一点弯路,最终搭建完成,记录于此。

前期准备

假设你已经有了一个sudo权限的用户或者直接root用户也可以.(root无需sudo)

  • 安装git

    1
    sudo apt-get install git

  • 建立git用户,最好有一个单独的git用户。输入密码,后面直接回车就好了

    1
    sudo adduser git

如果想要git用户拥有sudo,直接在/etc/sudoersroot ALL=(ALL:ALL) ALL下面加一行:git ALL=(ALL:ALL) ALL

创建裸仓库

我们需要知道远程仓库与本地仓库其实没有区别,因此也需要一个仓库,不过这里建立的是裸仓库与普通仓库的差别就是,裸仓库不保存原文件,只是保存git的历史提交记录。 这里我们需要切换到上面创建的git用户了。

1
2
3
4
5
6
su git
cd
mkdir myrepo
cd myrepo
# 建立裸仓库
git init --bare myrepo.git

上面把repo的目录放在/home/git/myrepo目录下了, 这个可以根据自己情况来修改,但是 需要注意目录的owner必须是git(sudo chown -R git:git myrepo)

本地客户端推送

添加ssh到服务器

  • 如果已经生成了ssh-key,则跳过此步,没有的话,直接ssh-keygen即可
  • 将公钥保存到主机上:
    1
    ssh-copy-id git@server

本地测试

在本地仓库,建立测试push

1
2
3
4
5
6
7
8
9
10
cd
mkdir testgit && cd testgit
git init
touch readme | echo 'hello' > readm
git add readme
git commit -m 'inti'
# 后面的.git路径就是上面建立的裸仓库
git remote add origin git@yourserver:/home/git/myrepo/myrepo.git
git push origin master

如果去服务器的myrepo目录下看看,啥都没有; 这就对了,因为上面建立的就是裸仓库,是不应该看到文件的。下面就说一下怎么看见文件,这个一个很常见的应用便是部署web应用,我们需要的是push上代码之后,页面可以自动刷新,git的hooks就可以完成这个任务。

添加hooks自动部署

我们把代码push到git服务器上之后,如果可以立即更新nginx目录下的web源码,不就省了很大力气了去手动修改了吗.

Git 能在特定的重要动作发生时触发自定义脚本。 有两组这样的钩子:客户端的和服务器端的。 客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。

有多种hook可以使用,具体可以看这个介绍:hook 这里我们需要的是post-receive:在整个过程完结以后运行,可以用来更新其他系统服务或者通知用户. 下面开始编写这个小脚本,首先该脚本在myrepo.git目录里面的hooks目录里面。

1
2
cd ~/myrepo/myrepo.git/hooks
vim post-receive

文件的内容如下:

1
2
#/bin/sh
GIT_WORK_TREE=/usr/share/nginx/html/ git checkout -f

需要修改GTI_WORK_TREE 为你的web工程的目录,需要注意的是,该目录的own必须是git. 之后需要给该脚本加入执行权限:

1
chmod +x post-receive

到此就全部完成了,可以测试一下页面有没有变化.不过还有一个地方可以做一下:就是取消git用户的bash登录,这个是为了安全起见: 打开/etc/passwd,找到

1
git:x:1001:1001:,,,:/home/git:/bin/bash

改为:

1
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

注: 此处的/usr/bin/git-shellgit-shell的位置,可以使用which git-shell确认。 这样设置好了之后,git用户就不能登录shell, 专门负责git.

参考

1 2