Ubuntu架设HTTP方式访问的SVN服务器以及war文件上传自动部署

本文的svn服务器部署主要转载于 http://blog.csdn.net/kontrol/article/details/7777473

参考了http://blog.sina.com.cn/s/blog_567e650201011kwh.html,对其中不甚清晰之处做了一些注解,并且主要是实现了设置多个版本库,且每个版本库需进行用户验证,每个程序一个版本库。

本文详细讲述了在Ubuntu上通过SVN进行业务部署。由于使用Apache服务模块的的实现和使用不同,本文的方案仅适用于ubuntu,如在其他环境下,请酌情部署。

本文介绍在代码提交时通过http访问SVN服务器,使用Mysql进行用户验证,并在提交完成后自动部署至服务器中。

         主要步骤如下:

1、  安装Apache和Mysql:

执行

$ sudo apt-get install apache2 mysql-server 

执行
$ sudo /etc/init.d/apache2 start 

访问http://127.0.0.1,测试apache是否安装成功。如遇到端口冲突,可能是由于安装了其他的web服务器(如Nginx)占用了80端口所引起的,可以修改相应配置文件,换用其它端口。

 

2、  安装subversion及对应Apache的服务器模块和MySQL用户认证管理模块:  

 $ sudo apt-get install subversion libapache2-svnlibapache2-mod-auth-mysql  
 $ sudo a2enmod auth_mysql 

3、  创建subversion项目和版本库

可以将所有的版本库放置在一个目录下,如/var/www/svn,可以自定义。

$ sudo mkdir /var/www/svn

然后可以创建两个版本库,如/var/www/svn/repos、/var/www/svn/repos1

先创建两个文件夹

    $ sudo mkdir /var/www/svn/repos  
    $ sudo mkdir /var/www/svn/repos1  

然后再执行svnadmin命令创建两个仓库,注意使用--fs-type来指定创建fsfs版本库,默认情况下是创建Berkeley DB版本库

  我们已FSFS版本库建2个仓库
<span style="font-size:14px;">$ sudo svnadmin create /var/www/svn/repos --fs-type fsfs
$ groupadd subversion
$ cd /var/www/svn/</span>

最后赋予www-data用户这些版本库的读写权限,因为通过apache服务器部署时需要读写该文件夹
 
$ sudo chown -R www-data:subversion /var/www/svn/repos
 $ sudo chmod -R g+rws/var/www/svn/repos
 $ sudo vi /etc/group  
将自己、www-data也加入到subversion组,重启动
  导入工程到版本库中,添加新的项目(import newproject)subversion的手册推荐的项目目录结构,
  svn import 导入文件PATH 版本库PATH [参数],通过import命令,将本地未版本化的工程导入到版本库中。
  导入完成后,svn会为导入的文件设定版本号。

cd ~/  
  mkdir -p project/{trunk,branches,tags}
  搭建项目目录结构  
project/
+ branches/
+ tags/
+ trunk/

svn import ~/projectfile:///var/www/svn/repos/project -m "start project comment"

 报不能打开文件“/var/www/svn/repos/db/txn-current-lock”:权限不够,需要将自己加入到subversion组重起
sudo usermod -G subversion -a user (user hostname)

4、   创建用户验证数据库

创建进行用户验证的数据库

    $ mysql -u root -p  
    #创建一个数据库,用于进行用户验证  
    mysql> CREATE DATEBASE svn;        
    #使用该数据库  
    mysql> USE svn;  
    #创建一个用户表,包含name,password和groups这三列,且名字为主键  
    mysql> CREATE TABLE user (  
    name char(30) NOT NULL COMMENT '用户名',  
    passwd char(32) NOT NULL COMMENT '密码',  
    groups varchar(32) NOT NULL COMMENT ‘群组’,  
    PRIMARY KEY (name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  
       
    mysql> INSERT INTO user VALUE ('admin', MD5('admin'),’admin’);  
    mysql> INSERT INTO user VALUE ('test', MD5('test'),’test’);  

 

需注意以下几点:

l  密码域一定要足够宽,本文将使用MD5密码(32字节),如果使用SHA1,则需要40字节。

l  必须设置groups字段,可以默认为其用户名,这样可以保证当使用mysql进行用户验证时,可以在apache的配置文件中指定群组,只有特定群组的人才能够访问该代码库,防止其他用户访问。

5、  编辑虚拟主机的配置文件

可以更改/etc/apache2/sites-available/default文件至如下:

    <span style="font-size:18px;"><VirtualHost *:80>  
       #指定了管理者的邮箱,可以不写  
       ServerAdmin admin@svn.com  
       #每一个Location指定了url为该种情况下的该指向哪个文件,如当url  
       #为htip://10.23.0.240/project时,对应的SVN路径为下边SVNPath指  
       #定的路径/var/www/svn/repos,具体可以参见svn配置文档  
       #http://svndoc.iusesvn.com/svnbook/1.4/  
       <Location /project>    
         DAV svn  
         SVNPath /var/www/svn/repos  
         AuthType Basic  
         AuthName "SubversionRepository"  
         AuthBasicAuthoritative off   
         #指定apache通过mysql进行验证开启  
         Auth_MySQL on  
         Auth_MySQL_Authoritative on  
         #指定mysql服务器的地址为localhost  
         Auth_MySQL_Host localhost  
         #指定进行验证的数据库为svn;  
         Auth_MySQL_DB svn  
         #指定mysql svn数据库的用户名  
         Auth_MySQL_User root  
         #指定mysql svn数据库的密码,本仓库中为root  
         Auth_MySQL_Password root  
         #指定mysql进行验证的数据库表  
         Auth_MySQL_Password_Tableuser  
         Auth_MySQL_Empty_Passwordsoff  
         Auth_MySQL_Encrypted_Passwordson  
         #指定进行验证的用户名的表中用户名的字段,本仓库为name  
         Auth_MySQL_Username_Fieldname  
         #指定进行验证的用户名的表中密码的字段,本仓库为passwd  
         Auth_MySQL_Password_Fieldpasswd  
         #指定进行验证的用户名的表中密码的加密方式,本仓库为PHP_MD5  
         Auth_MySQL_Encryption_TypesPHP_MD5  
         #指定进行验证的用户的群组的数据表  
         Auth_MYSQL_Group_Table user  
         #指定需要进行组验证,对于本版本库需要该用户的组为admin  
         require group admin  
       </Location>  
       #同理,该location指定了访问的url为htip://10.23.0.240/project1  
       #时,对应的路径为/var/www/svn/repos1。  
       <Location /project1>    
         DAV svn  
         SVNPath /var/www/svn/repos1  
         AuthType Basic  
         AuthName "SubversionRepository"  
         AuthBasicAuthoritative off   
         #指定apache通过mysql进行验证开启  
         Auth_MySQL on  
         Auth_MySQL_Authoritative on  
         #指定mysql服务器的地址为localhost  
         Auth_MySQL_Host localhost  
         #指定进行验证的数据库为svn;  
         Auth_MySQL_DB svn  
         #指定mysql svn数据库的用户名  
         Auth_MySQL_User root  
         #指定mysql svn数据库的密码,本仓库中为root  
         Auth_MySQL_Password root  
         #指定mysql进行验证的数据库表  
         Auth_MySQL_Password_Tableuser  
         Auth_MySQL_Empty_Passwordsoff  
         Auth_MySQL_Encrypted_Passwordson  
         #指定进行验证的用户名的表中用户名的字段,本仓库为name  
         Auth_MySQL_Username_Fieldname  
         #指定进行验证的用户名的表中密码的字段,本仓库为passwd  
         Auth_MySQL_Password_Fieldpasswd  
         #指定进行验证的用户名的表中密码的加密方式,本仓库为PHP_MD5  
         Auth_MySQL_Encryption_TypesPHP_MD5  
         #指定进行验证的用户的群组的数据表  
         Auth_MYSQL_Group_Table user  
         #指定需要进行组验证,对于本版本库需要该用户的组为test  
         require group test  
       </Location>  
    </VirtualHost>  </span>

 

需要注意,本文假设用户admin上传了project,而用户test上传了project1,因此配置两个不同的location以进行访问,且每一个版本库对应一个项目。为了同一个组的用户能访问到该组的所有代码,因此配置了require  group选项。

        

6、  启用SVN配置

重新加载配置,以使得配置生效

  1. $sudo /etc/init.d/apache2 reload  

l  在浏览器中输入http://127.0.0.1/project,输入用户名admin,密码admin,可以访问该版本库repos1的最新版本。使用svn客户端,如TortoiseSVN时,版本库的地址为http://10.23.0.240/project1/(本svn服务器端部署在10.23.0.240机器上)。然后输入用户名admin,密码admin即可checkout。

l  在浏览器中输入http://127.0.0.1/project1,输入用户名test,密码test,可以访问该版本库repos2的最新版本。

 

7、  war文件进行自动部署至tomcat服务器下

可以通过修改每个项目的版本库中hooks文件夹下的post-commit钩子,来方便的进行自动部署。该钩子其实就是一个shell脚本,用于当上传完毕之后执行的。注意,此shell脚本为了保证安全,不能使用环境变量。

本脚本以repos为例,repos1同理更改相应位置即可

    $cd /var/www/svn/repos  
    #复制原来的示例文件,并且改名为post-commit  
    $cp post-commit.tmpl  post-commit  
    $vim post-commit  

然后修改post-commit文件的内容如下:

<span style="font-size:14px;">    <span style="font-size:18px;">#将调试信息输出至/tmp/svn-up.out文件中,这对于调试很重要  
    exec >/tmp/svn-up.out 2>&1  
    #可以看到svn调用该shell脚本时所传递进来的所有的参数  
    echo "$@"  
    #设置传给SVN服务器中可以含有中文  
    export LANG="zh_CN.UTF-8"  
    #使用svn export命令将文件仓库导出至文件夹下,也可以使用svn update命令,该命令  
    #貌似是只导出更新的一部分,这我没有尝试。  
    svn export --username admin --password admin http://10.23.0.240/project/home/administrator/ProgramFiles/apache-tomcat-6.0.28/webapps --force  
    cd  /home/administrator/ProgramFiles/apache-tomcat-6.0.28/webapps  
    #对每个war文件建立相应的文件夹并解压  
    for file in *.war  
      do  
    #获取相应的war文件的文件夹名,如如果上传的testSVN.war文件,则dirname为  
    #testSVN;  
            dirname=${file%%.*}  
            echo $dirname  
            echo $file  
            rm -rf $dirname  
            mkdir $dirname  
            cp $file $dirname  
            cd $dirname  
    #在该文件夹中将war文件解压出来;  
           /home/administrator/ProgramFiles/jdk1.6.0_31/bin/jar -xf $file  
            rm -rf $file  
            cd ..  
      done  </span></span>



 

至此,该war文件一旦通过svn客户端,上传至svn服务器时,就会相应的部署到tomcat服务器下。

posted @ 2014-09-21 14:48  朔珩轩  阅读(295)  评论(0编辑  收藏  举报