利用gitolite实现自动部署的简易实现方式

技术控是不是都像我一样,我想试验在flask框架一些示例程序在nginx+uwsgi的生产环境下的效果,于是想到了用git实现自动部署,于是看到gitolite,于是研究gitolite的服务器配置以及钩子相关的实现方式,看到了网上很多人的回答都不另人满意,其实完全可以有更简单的实现方式。有看官说了,你完全可以写完之后用rsync手动部署啊,但是我的代码库是在自己的一个阿里云服务器上的,我会定期把代码推送到自己的GIT服务器上,我就是不想推送完后再运行一个部署的命令。

gitolite 工作原理

gitolite提供了便于部署git远程仓库的工具,它本身并不提供服务,服务仍旧依托ssh对外提供。如果没有这种工具的话,你以ssh的形式往远程的仓库里推送修改,则需要远程服务器中提供一个用户,如果用户多的话对远程服务器的安全隐患则较大。gitolite则是用一个专门的用户git来受理推送,并维护远程的库,你本地的用户只需将ssh公钥提交到远程服务器便可以授权推送。并且对于用户公钥的维护、相关配置文件的修改等均不需要登录到远程服务器,在本地clone一个gitolite-admin的仓库,直接在本地修改,再推送到远程服务器上即可生效。

gitolite是受到gitosis启发开发的,但现在功能上面已经全面超越了gitosis了。用过github的人可能比较熟悉这种用法,将自己本地的公钥提交到github之后,便可以用git clone [email protected]:username/reposity 的方式克隆一个远程库,本地修改提交到可以将相关内容再推送到远程。我不知道github采用的是什么工具实现的这种功能,但gitolite基本已经实现了这种功能。

gitolite 安装与配置(远程服务器)

本文重点介绍gitolite实现Web的自动部署,gitolite的详细安装过程可以自行搜索,网上很多教程都写得不错。以下所指的远程服务器是指你要运行git仓库服务的服务器,本地是指要进行远程推送的主机,远程服务器上必须已经安装配置好ssh服务。

安装gitolite

首先安装gitolite,我用的是archlinux,管方源里有,ubuntu的官方源里也有gitolite。

添加并配置git用户

安装后查看一下系统有没有添加一个用户名为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

自动部署相关的配置

修改.gitolite.rc的相关配置(远程服务器)

进入到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下面有两个目录confkeydir,第一个目录是用来存放配置文件,第二个目录用来存放用户的公钥,如果想添加用户的话可以将用户的公钥拷贝到此目录下并命名为<username>.pub的格式,然后git addgit commitgit 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 commitgit push,远程即可自动将相关内容部署到/srv/http/cgi-bin/mysite下。

你可能感兴趣的:(服务器,git,gitolite)