技术控是不是都像我一样,我想试验在flask框架一些示例程序在nginx+uwsgi的生产环境下的效果,于是想到了用git实现自动部署,于是看到gitolite,于是研究gitolite的服务器配置以及钩子相关的实现方式,看到了网上很多人的回答都不另人满意,其实完全可以有更简单的实现方式。有看官说了,你完全可以写完之后用rsync手动部署啊,但是我的代码库是在自己的一个阿里云服务器上的,我会定期把代码推送到自己的GIT服务器上,我就是不想推送完后再运行一个部署的命令。
gitolite提供了便于部署git远程仓库的工具,它本身并不提供服务,服务仍旧依托ssh对外提供。如果没有这种工具的话,你以ssh的形式往远程的仓库里推送修改,则需要远程服务器中提供一个用户,如果用户多的话对远程服务器的安全隐患则较大。gitolite则是用一个专门的用户git来受理推送,并维护远程的库,你本地的用户只需将ssh公钥提交到远程服务器便可以授权推送。并且对于用户公钥的维护、相关配置文件的修改等均不需要登录到远程服务器,在本地clone一个gitolite-admin的仓库,直接在本地修改,再推送到远程服务器上即可生效。
gitolite是受到gitosis启发开发的,但现在功能上面已经全面超越了gitosis了。用过github的人可能比较熟悉这种用法,将自己本地的公钥提交到github之后,便可以用git clone [email protected]:username/reposity
的方式克隆一个远程库,本地修改提交到可以将相关内容再推送到远程。我不知道github采用的是什么工具实现的这种功能,但gitolite基本已经实现了这种功能。
本文重点介绍gitolite实现Web的自动部署,gitolite的详细安装过程可以自行搜索,网上很多教程都写得不错。以下所指的远程服务器是指你要运行git仓库服务的服务器,本地是指要进行远程推送的主机,远程服务器上必须已经安装配置好ssh服务。
首先安装gitolite,我用的是archlinux,管方源里有,ubuntu的官方源里也有gitolite。
安装后查看一下系统有没有添加一个用户名为git的用户:
cat /etc/passwd |grep git
如果没有的话自行创建一个,并设置好此用户的根目录,这个目录便是用来存储git仓库的,如果已经有了这个用户的话,注意一下此用户的根目录的设置。
安装管理仓库以及管理员账号,首先将你要当管理员的账号(可以是远程也可以是本地)用ssh-keygen生成一个ssh公钥(~/.ssh/id_rsa.pub),将此公钥拷贝到服务器上,并命名为<yourusername>.pub
,然后安装此公钥生成初始的管理仓库:
su - git
gitolite setup -pk <yourusername>.pub
上面这一步安装完成后用ssh git@your_host_name info
可以看到一些信息如:
hello <your_username>, this is git@<your_server> running gitolite3 v3.6.2 on git 2.3.3
R W gitolite-admin
R W testing
进入到git用户的根目录用su - git
切换到git目录,并对.gitolite.rc相关的配置进行修改,主要修改的地方有两处:
找到.gitolite.rc中的这两行(并不在一起),去掉前面的注释:
LOCAL_CODE => "$rc{GL_ADMIN_BASE}/local",
repo-specific-hooks
下面是我的一个典型配置:
git clone git@<your_server>:gitolite-admin
以下所有的配置均是在本地进行的修改,最后提交到远程服务器端。
gitolite-admin下面有两个目录conf
和keydir
,第一个目录是用来存放配置文件,第二个目录用来存放用户的公钥,如果想添加用户的话可以将用户的公钥拷贝到此目录下并命名为<username>.pub
的格式,然后git add
、git commit
、git push
生效。
@devs = lxq gk
@admins = lxq
repo gitolite-admin
RW+ = @admins
repo testing
RW+ = @all
repo mysite
option hook.post-receive= deploy
RW+ = @devs
R = @all
repo lxq/.
C = lxq
第1、2行表示定义组,这些用户必须已经导入了公钥,可以为这个组设置权限。下面的几行均是为仓库设置权限,其中RW+
是指可读写可强制更新。注意第4个repo的设置,指定lxq
用户可以在lxq/
目录下新建仓库,即C
权限。这也是我最终抛弃gitosis选用gitolite的重要原因,gitosis建仓库必须手动到远程服务器上去搞。
第3个仓库mysite的配置里有一条option hook.post-receive=deploy
,gitolite扩展了git原有的钩子机制,表示这个仓库的post-receive
钩子脚本为deploy
,这样我们每次向mysite这个仓库里推送完后便可以调用deploy这个脚本进行部署。
确定你要自动部署的目标目录,比如/srv/http/cgi-bin/mysite
cd /srv/http/cgi-bin
git clone git@your_host:mysite
sudo chown -R git:git mysite
deploy
脚本(本地)在gitolite-admin目录下创建特定的目录:
# on your workstation
cd /path/to/your/gitolite-admin-clone
mkdir -p local/hooks/repo-specific
然后在repo-specific下创建deploy脚本:
#!/bin/sh
cd /srv/http/cgi-bin/mysite
unset GIT_DIR
umask 022
git pull
现在配置已经基本完成,所有配置完成后,一定要记得git commit和git push,相关配置即会在服务器端生效。
git clone git@yout_host:mysite
对mysite里的东西进行编辑之后,运行git commit
、git push
,远程即可自动将相关内容部署到/srv/http/cgi-bin/mysite下。