基于git 的网站发布脚本,非常成熟

 下面共享以下我目前正在使用的,基于git实现的网站发布脚本

 下面共享以下我目前正在使用的,基于git实现的网站发布脚本

 

 

 

Deployment GIT

Installation

https://github.com/netkiller/deployment.git
$ git clone https://github.com/netkiller/deployment.git
$ chmod 755 -R deployment
$ export DEPLOY_HOME=~/deployment
		

临时使用的方法

export DEPLOY_HOME=/home/user/deployment
		
$ cd deployment/
$ ln -s bin/deploy.git run
		

使用说明

		
$ ./run
Usage: ./run [OPTION] <server-id> <directory/timepoint>

OPTION:
	development <domain> <host>
	testing <domain> <host>
	production <domain> <host>

	branch {development|testing|production} <domain> <host> <branchname>
	revert {development|testing|production} <domain> <host> <revision>
	backup <domain> <host> <directory>
	release <domain> <host> <tags> <message>

	list
	list <domain> <host>

	clean {development|testing|production} <domain> <host>
	log <project> <line>

	conf list
	cron show
	cron setup
	cron edit
		
		

模拟演示

环境说明

  1. development 开发环境

  2. testing 测试环境,代码来自开发环境的合并

  3. production 生产环境,当testing环境通过测试后,将testing 合并到 主干 即成为生产环境的代码

    另外我们可以通过release功能将主干的代码复制到tags中,命名采用版本号

创建配置文件

development

部署开发代码到开发环境

cat deployment/conf/development/mydomain.com/www.conf

REPOSITORY=git@192.168.2.1:mydomain.com/www.mydomain.com
MODE=RSYNC
OPTION="--delete --password-file=$PREFIX/conf/development/passwd"
REMOTE="jszb@192.168.2.10"
DESTINATION=mydomain.com/www.mydomain.com
			

创建密码文件

$ cat deployment/conf/development/passwd
eF9nJCcGKJPsiqZsfjGXxwfF41cLibTo
			

testing

部署测试分支到测试环境

cat deployment/conf/testing/mydomain.com/www.conf

REPOSITORY=git@192.168.2.1:mydomain.com/www.mydomain.com
MODE=RSYNC
OPTION="--delete --password-file=$PREFIX/conf/development/passwd"
REMOTE="jszb@192.168.2.10"
DESTINATION=mydomain.com/www.mydomain.com
			

创建密码文件

$ cat deployment/conf/testing/passwd
eF9nJCcGKJPsiqZsfjGXxwfF41cLibTo
			

production

部署主干代码到远程主机

cat deployment/conf/production/mydomain.com/www.conf

REPOSITORY=git@192.168.2.1:mydomain.com/www.mydomain.com
MODE=RSYNC
OPTION="--delete --password-file=$PREFIX/conf/development/passwd"
REMOTE="jszb@192.168.2.10"
DESTINATION=mydomain.com/www.mydomain.com
			

创建密码文件

$ cat deployment/conf/production/passwd
eF9nJCcGKJPsiqZsfjGXxwfF41cLibTo
			

配置排出列表

有时我们不希望某些文件被上传到服务器上。我们可以通过排除列表来排除上传

cat exclude/mydomain.com/www.lst
/test/phpinfo.php
/config/database.php
/backup/*.sql
			

配置文件管理

生产环境的安全问题,例如数据库联接信息,开发环境与测试环境的数据库是可以供发人员和测试人员随意操作的,损坏之后恢复即可,但生产环境的数据库是不能随便操作的,除运维人员其他人是不应该有权限的, 我们希望部署到生产环境的时候使用另一个配置文件,并且这个配置文件只有运维人员才能编辑。

config/database.php 将覆盖原有的配置文件,然后上传到生产环境

vim share/production/mydomain.com/www/config/database.php
...
你的数据库连接信息
...
			

部署前/后脚本

部署前需要做什么

$ cat libexec/mydomain.com/www/before
rsync -au $DEPLOY_HOME/src/production/mydomain.com/www.mydomain.com/cn/* $DEPLOY_HOME/src/production/mydomain.com/www.mydomain.com/news/
rsync -au $DEPLOY_HOME/src/production/mydomain.com/www.mydomain.com/images/* $DEPLOY_HOME/src/production/mydomain.com/www.mydomain.com/bbs/images/
rsync -au $DEPLOY_HOME/src/production/mydomain.com/www.mydomain.com/css/* $DEPLOY_HOME/src/production/mydomain.com/www.mydomain.com/news/css
			

部署后需要做什么

cat libexec/hx9999.com/www/after
ssh www@192.168.1.1 "chown www:www -R /www/mydomain.com"
ssh www@192.168.1.1 "chown 700 -R /www/mydomain.com"
ssh www@192.168.1.1 "chown 777 -R /www/mydomain.com/www.mydomain.com/images/upload"
			

配置部署节点

在需要部署的节点上安装rsync

		
yum install xinetd rsync -y

vim /etc/xinetd.d/rsync <<VIM > /dev/null 2>&1
:%s/yes/no/
:wq
VIM

# service xinetd restart
Stopping xinetd:                                           [  OK  ]
Starting xinetd:                                           [  OK  ]
		
		

/etc/rsyncd.conf 配置文件

		
# cat /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
max connections = 8
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log

hosts deny=*
hosts allow=192.168.2.0/255.255.255.0

[www]
    uid = www
    gid = www
    path = /www
    ignore errors
    read only = no
    list = no
    auth users = www
    secrets file = /etc/rsyncd.passwd
[mydomain.com]
    uid = www
    gid = www
    path = /www/mydomain.com
    ignore errors
    read only = no
    list = no
    auth users = mydomain
    secrets file = /etc/rsyncd.passwd
[example.com]
    uid = www
    gid = www
    path = /www/example.com
    ignore errors
    read only = no
    list = no
    auth users = example
    secrets file = /etc/rsyncd.passwd
		
		

创建密码

		
cat > /etc/rsyncd.passwd <<EOD
www:eF9nJCcGKJPsiqZsfjGXxwfF41cLibTo
mydomain:eF9nJCcGKJPsiqZsfjGXxwfF41cLibTo
example:eF9nJCcGKJPsiqZsfjGXxwfF41cLibTo
EOD
		
		

部署代码

Tip
[Tip]

development | testing 建议使用分支管理, 而production是用master分支

开发环境部署

$ ~/deployment/run branch development mydomain.com www development 首次需要运行,切换到开发分支
$ ~/deployment/run development mydomain.com www
		

测试环境部署

$ ~/deployment/run branch development mydomain.com www testing 首次需要运行,切换到开发分支
$ ~/deployment/run testing mydomain.com www
		

如果每个bug一个分支的情况可以每次先运行

$ ~/deployment/run branch development mydomain.com www bug0005
		

生产环境部署

$ ~/deployment/run production mydomain.com  www
		

每次部署都会在服务器 /www/mydomain.com/backup/ 下备份更改的文件

回撤操作

当程序升级失败需要立即回撤到指定版本时使用

			
$ ~/deployment/run revert {development|testing|production} <domain> <host> <revision>
			
			

 

./run revert development mydomain www 29dd5c3de6559e2ea6749f5a146ee36cbae750a7
./run revert testing mydomain www 29dd5c3de6559e2ea6749f5a146ee36cbae750a7
./run revert production mydomain www 29dd5c3de6559e2ea6749f5a146ee36cbae750a7
			

发行一个版本

release 升级你的版本

$ ~/deployment/run release mydomain.com www stable-2.0
			

分支管理

查看当前分支

[www@manager deployment]$ ./run branch development mydomain.com www
* master
		

切换分支

[www@manager deployment]$ ./run branch development mydomain.com www development
HEAD is now at 461b796 提交最新代码
Branch development set up to track remote branch development from origin.
Switched to a new branch 'development'
		

现在已经切换到开发分支

[www@manager deployment]$ ./run branch development mydomain.com www
* development
  master
		

日志

部署日志 deploy.YYYY-MM-DD.log, 记录部署时间与动态

 $ cat log/deploy.2012-08-03.log
[2012-12-06 21:52:05] [update] /opt/git/testing/mydomain.com/m.mydomain.com
[2012-12-06 21:52:10] [deploy] testing/mydomain.com/m.mydomain.com => www@192.168.2.15:mydomain.com/m.mydomain.com
[2012-12-06 21:53:13] [checkout] commit:29dd5c3de6559e2ea6749f5a146ee36cbae750a7 /opt/git/testing/mydomain.com/m.mydomain.com
[2012-12-06 21:53:18] [deploy] testing/mydomain.com/m.mydomain.com => www@192.168.2.15:mydomain.com/m.mydomain.com
[2012-12-06 21:53:39] [update] /opt/git/testing/mydomain.com/m.mydomain.com
[2012-12-06 21:53:45] [deploy] testing/mydomain.com/m.mydomain.com => www@192.168.2.15:mydomain.com/m.mydomain.com
[2012-12-06 21:54:08] [update] /opt/git/testing/mydomain.com/m.mydomain.com
[2012-12-06 21:54:10] [deploy] testing/mydomain.com/m.mydomain.com => www@192.168.2.15:mydomain.com/m.mydomain.com
[2012-12-06 21:54:13] [checkout] commit:29dd5c3de6559e2ea6749f5a146ee36cbae750a7 /opt/git/testing/mydomain.com/m.mydomain.com
[2012-12-06 21:54:15] [deploy] testing/mydomain.com/m.mydomain.com => www@192.168.2.15:mydomain.com/m.mydomain.com
		

项目日志 www.example.com.log 记录项目有哪些更新, 上传的细节, 你能通过日志看到那些文件被上传

		
$ cat log/www.example.com.log
--------------------------------------------------
HEAD is now at 03b3ad5 XXXXXXXXXXXX
- share:
- libexec:
2012/12/06 21:53:45 [12488] building file list
2012/12/06 21:53:45 [12488] .d..t...... application/config/development/
2012/12/06 21:53:45 [12488] <f.st...... application/config/development/database.php
2012/12/06 21:53:45 [12488] .d..t...... application/controllers/
2012/12/06 21:53:45 [12488] <f.st...... application/controllers/info.php
2012/12/06 21:53:45 [12488] .d..t...... application/core/
2012/12/06 21:53:45 [12488] <f.st...... application/core/MY_Controller.php
2012/12/06 21:53:45 [12488] .d..t...... application/models/
2012/12/06 21:53:45 [12488] <f.st...... application/models/news.php
2012/12/06 21:53:45 [12488] .d..t...... application/views/
2012/12/06 21:53:45 [12488] <f.st...... application/views/example.html
2012/12/06 21:53:45 [12488] <f.st...... application/views/index.php
2012/12/06 21:53:45 [12488] .d..t...... resources/css/
2012/12/06 21:53:45 [12488] <f.st...... resources/css/m.css
2012/12/06 21:53:45 [12488] sent 23640 bytes  received 421 bytes  3701.69 bytes/sec
2012/12/06 21:53:45 [12488] total size is 2869760  speedup is 119.27
--------------------------------------------------
		
		

debug

启用调试模式

vim bin/deploy.git

DEBUG=yes
		

然后查看log/debug.log

 

 

 

  
  
  
  
  1. #!/bin/bash 
  2. ##################################################################### 
  3. # Description: Automation Deployment Script  
  4. #              Netkiller series utilities 
  5. # Author: Neo<netkiller@msn.com> 
  6. # Homepage: http://netkiller.github.com/ 
  7. #           http://netkiller.sourceforge.net/ 
  8. # GIT URL:  https://github.com/netkiller/deployment.git 
  9. # $Id$ 
  10. ##################################################################### 
  11. # :set  tabstop=4 
  12. # :set shiftwidth=4 
  13. # :set expandtab 
  14.  
  15. if [ -z $DEPLOY_HOME ]; then 
  16.     echo 'Example: export DEPLOY_HOME=/srv/deploy' 
  17.     exit 
  18. fi 
  19. if [ -f $DEPLOY_HOME/conf/default.conf ];then 
  20.     . $DEPLOY_HOME/conf/default.conf 
  21. fi 
  22.  
  23. if [ -f $DEPLOY_HOME/conf/stage.conf ];then 
  24.     . $DEPLOY_HOME/conf/stage.conf 
  25. fi 
  26.  
  27. #================================================================================ 
  28.  
  29. LOGFILE="deploy.$(date -d "today" +"%Y-%m-%d").log" 
  30. TMPDIR=$(mktemp -d --suffix=.tmp -p /tmp deploy.XXXXXX) 
  31. SVN=/usr/bin/svn 
  32. GIT=/usr/bin/git 
  33.  
  34. BACKUPDIR=/backup 
  35. RSYNC="rsync" 
  36. UPLOAD_DIR=$TMPDIR 
  37. REVISION='' 
  38. DEBUG='yes' 
  39. # development  production  testing 
  40. if [ -z $STAGE ]; then 
  41.     echo 'Example: touch conf/stage.conf' 
  42.     echo "STAGE='development' or STAGE='testing' or STAGE='production'
  43.     exit 
  44. fi 
  45. #================================================================================ 
  46.  
  47. if [ ! -d ${TMPDIR} ]; then 
  48.     mkdir ${TMPDIR} 
  49. fi 
  50.  
  51. #chmod 700 -R ${SRCDIR}/* 
  52. umask 0077 
  53. #pkgname=${project}-${version}-${datetime}.pkg 
  54. #tar jcvf ${pkgname} /tmp/${project} --remove-files >> deploy.log 
  55. ##################################################################### 
  56.  
  57. function logging(){ 
  58.     local logfile="$LOGDIR/$LOGFILE" 
  59.     local timepoint=$(date -d "today" +"%Y-%m-%d %H:%M:%S") 
  60.     local status=$1 
  61.     local message=$2 
  62.     echo "[$timepoint] [${status}] ${message}" >> $logfile 
  63.  
  64. function debug(){ 
  65.     if [ ${DEBUG} = 'yes' ]; then 
  66.         local logfile="$LOGDIR/debug.log" 
  67.         local timepoint=$(date -d "today" +"%Y-%m-%d %H:%M:%S") 
  68.         local status=$1 
  69.         local message=$2 
  70.         echo "[$timepoint] [${status}] ${message}" >> $logfile 
  71.     fi 
  72.  
  73. #logging 'OK' 'This is test msg!!!' 
  74. #debug 'OK' 'This is debug msg!!!' 
  75.  
  76. function conf(){ 
  77.     local cmd=$2 
  78.     local prj=$3 
  79.     case $cmd in 
  80.         list) 
  81.             ls $SYSCONFDIR/*/* 
  82.             ;; 
  83.         new) 
  84.             mkdir -p $SYSCONFDIR     
  85.             #if [ ! -d ${BACKUPDIR} ]; then  
  86.             #   mkdir -p $BACKUPDIR 
  87.             #fi 
  88.  
  89.             read -p "Project directory: " prjdir 
  90.             if [ -z $prjdir ]; then 
  91.                 exit 
  92.             fi 
  93.             if [ -f $SYSCONFDIR/$prjdir.conf ]; then 
  94.                 echo "cannot create config $prjdir.conf': File exists" 
  95.                 exit 1 
  96.             fi 
  97.  
  98.             read -p "subversion url: $REPOSITORIES/: " svnurl 
  99.             if [ -z $svnurl ]; then 
  100.                 svnurl=$REPOSITORIES 
  101.             fi 
  102.             read -p "hostname: " host 
  103.             if [ -z $host ]; then 
  104.                 host="localhost" 
  105.                 echo "default hostname 'localhost'" 
  106.             fi 
  107.             read -p "upload mode ftp/scp/sftp/rsync: " mode 
  108.             if [ -z $mode ]; then 
  109.                 mode=ftp 
  110.             else 
  111.                 case $mode in 
  112.                     ftp) 
  113.                         mode="ftpdeploy" 
  114.                         ;; 
  115.                     scp) 
  116.                         mode="scpdeploy" 
  117.                         ;; 
  118.                     sftp) 
  119.                         mode="sftpdeploy" 
  120.                         ;; 
  121.                     rsync) 
  122.                         mode="rsync" 
  123.                         ;; 
  124.                 esac 
  125.             fi 
  126.             read -p "Create $prjdir config? [y/n]" -n 1 key 
  127.             echo 
  128.             if [ $key = 'y' ]; then 
  129.                 echo -ne "REPOSITORIES=$REPOSITORIES/$svnurl 
  130. COMMAND=$mode 
  131. HOSTNAME=$host 
  132.                 " >> $SYSCONFDIR/$prjdir.conf 
  133.             fi 
  134.             ;; 
  135.         remove) 
  136.             if [ -f $SYSCONFDIR/$prj ]; then 
  137.                 rm -rf $SYSCONFDIR/$prj 
  138.             fi 
  139.             ;; 
  140.         show) 
  141.             cat $SYSCONFDIR/$prj 
  142.             ;; 
  143.         edit) 
  144.             vim $SYSCONFDIR/$prj 
  145.             ;; 
  146.         *) 
  147.             ls $SYSCONFDIR/*/* 
  148.             ;; 
  149.     esac 
  150.  
  151.  
  152.  
  153. ##################################################################### 
  154.  
  155. function config { 
  156.     local cfg=$1 
  157.     exclude_from=$PREFIX/exclude/${cfg}.lst 
  158.     include_from=$PREFIX/include/${cfg}.lst 
  159.  
  160.     if [ -f $SYSCONFDIR/${STAGE}/${cfg}.conf ];then 
  161.         . $SYSCONFDIR/${STAGE}/${cfg}.conf  
  162.     else 
  163.         echo "Please provide the config($SYSCONFDIR/${STAGE}/${cfg}.conf) to deploy!" 
  164.         exit 
  165.     fi 
  166.     if [ -z "$cfg" ]; then 
  167.         echo "Please provide the path for deploy!" 
  168.         exit 
  169.     fi 
  170.  
  171.     if [ ! -f $exclude_from ]; then 
  172.         echo "Please provide a list of excluded in the $exclude_from." 
  173.     touch $exclude_from 
  174.         exit 
  175.     fi 
  176.     if [ ! -f $include_from ]; then 
  177.         echo "Please provide a list of included in the $include_from." 
  178.     touch $include_from 
  179.         exit 
  180.     fi 
  181.  
  182. #    case ${STAGE} in 
  183. #        development) 
  184. #            SUBVERSION='development' 
  185. #            ;; 
  186. #        testing) 
  187. #            SUBVERSION='' 
  188. #            ;; 
  189. #        production) 
  190. #            ;; 
  191. #        *) 
  192. #            SUBVERSION='current' 
  193. #            ;; 
  194. #    esac 
  195.  
  196.  
  197. function deploy() { 
  198.  
  199.     local domain=$2 
  200.     local host=$3 
  201.     local commit=$4 
  202.     local logfile=${LOGDIR}/${host}.${domain}.log 
  203.     local backupdir=${BACKUPDIR}/${host}.${domain}/$(date '+%Y-%m-%d/%H:%M:%S') 
  204.     local message=${STAGE}/${domain}/${host}.${domain} 
  205.  
  206.     if [ $# -lt 3 ]; then 
  207.         usage 
  208.     fi 
  209.  
  210.     if [ ${STAGE} = 'production' ]; then 
  211.         read -p "Are you sure you want to continue deploying? [y/n]" -n 1 key 
  212.         echo 
  213.         if [ $key != 'y' ]; then 
  214.             exit 
  215.         fi 
  216.     fi 
  217.     if [ $host = 'all' ]; then 
  218.     for h in $(ls -1 $SYSCONFDIR/${STAGE}/$domain/ | cut -d. -f1) 
  219.     do 
  220.         /bin/sh $BINDIR/deploy deploy $domain $h 
  221.     done 
  222.     exit 
  223.     fi 
  224.  
  225.      
  226.          
  227.     #if [ ! -z $revision  ]; then 
  228.     #    REVISION="-r ${revision}" 
  229.     #fi 
  230.  
  231.     config ${domain}/${host} 
  232.  
  233.     project=$SRCDIR/${STAGE}/${domain}/${host}.${domain} 
  234.   
  235.     GIT_OPTS=${REVISION} 
  236.     echo '================================================================================' 
  237.     if [ -d ${project} ]; then  
  238.         cd $project 
  239.         #$GIT stash 
  240.         #$GIT pull --progress 
  241.         #$GIT stash clear 
  242.         #$GIT checkout . 
  243.          
  244.         $GIT reset HEAD --hard >> $logfile 
  245.         echo -n " Repository: ${REPOSITORY} " 
  246.         $GIT pull --progress         
  247.         if [ ! -z $commit ]; then 
  248.             $GIT checkout $commit . 
  249.             echo " Commit: $commit" 
  250.             logging 'checkout' "commit:$commit ${project} " 
  251.         else 
  252.             logging 'update' ${project} 
  253.         fi 
  254.          
  255.     else 
  256.         mkdir -p ${project} 
  257.         $GIT clone ${REPOSITORY} ${project} >> $logfile 
  258.         logging 'checkout' ${project}  
  259.     fi 
  260.     echo '================================================================================' 
  261.     RSYNC_OPTS=" -azv --backup --backup-dir=${backupdir} --exclude=.git --log-file=${logfile} --exclude-from=$exclude_from --include-from=$include_from" 
  262.  
  263.     if [ -d ${SHAREDIR}/${STAGE}/${domain}/${host}/ ]; then 
  264.         cp -a ${SHAREDIR}/${STAGE}/${domain}/${host}/* ${project}/ 
  265.     fi 
  266.     echo '- share:' >> ${logfile} 
  267.     echo ' Share [ OK ]' 
  268.     if [ -f ${LIBEXECDIR}/${domain}/${host}/before ];then 
  269.         /bin/sh ${LIBEXECDIR}/${domain}/${host}/before >> ${logfile} 
  270.     fi 
  271.     echo '- libexec:' >> ${logfile} 
  272.     echo ' Libexec [ OK ]' 
  273.     find $SRCDIR/* -type f -name "Thumbs.db" -exec rm -rf {} \; 
  274.     echo '================================================================================' 
  275.      
  276.     for addr in ${REMOTE}  
  277.     do 
  278.          
  279.         echo " Deploy [${message}] ${addr}" 
  280.         echo '================================================================================' 
  281.          
  282.         case ${MODE} in 
  283.             FTP) 
  284.                 ftpdeploy 
  285.                 ;; 
  286.             SCP) 
  287.                 scp -ar ${project}/* ${addr}:${DESTINATION} 
  288.                 ;; 
  289.             SFTP) 
  290.                 sftpdeploy 
  291.                 ;; 
  292.             RSYNC) 
  293.                 $RSYNC $RSYNC_OPTS $OPTION ${project}/* ${addr}::${DESTINATION} 
  294.                 debug 'rsync' "$RSYNC $RSYNC_OPTS $OPTION ${project}/* ${addr}::${DESTINATION}" 
  295.                 ;; 
  296.             "RSYNC+SSH") 
  297.                 $RSYNC $RSYNC_OPTS ${project}/* ${addr}:${DESTINATION} 
  298.                 ;; 
  299.         esac 
  300.          
  301.         if [ -z "${REVISION}" ]; then 
  302.             logging 'deploy' "${message} => ${addr}:${DESTINATION}" 
  303.         else 
  304.             logging 'revert' "${message} => ${addr}:${DESTINATION}" 
  305.         fi 
  306.         echo '--------------------------------------------------' >> ${logfile} 
  307.     done 
  308.          
  309.     if [ -f ${LIBEXECDIR}/${domain}/${host}/after ];then 
  310.         #ssh ${scp} < ${LIBEXECDIR}/${domain}/${host}/after 
  311.         exit 
  312.     fi 
  313.      
  314.  
  315. function revert() { 
  316.  
  317.     #if [ $STAGE = 'testing' -o $STAGE = 'development' -o $STAGE = 'production' ]; then 
  318.     local domain=$3 
  319.     local host=$4 
  320.         local commit=$5 
  321. #    else 
  322. #   local domain=$1 
  323. #        local host=$2 
  324. #        local revision=$3 
  325.     #fi 
  326.     deploy $STAGE $domain $host $commit 
  327.  
  328. function timepoint { 
  329.     TIMEPOINT=`date '+%Y-%m-%d.%H-%M-%S'` 
  330.     echo $TIMEPOINT >> timepoint.log 
  331.  
  332. function unstable { 
  333.     local edition=$(basename $unstable) 
  334.     svn export ${unstable} ${src}/$edition 
  335.  
  336.     for ignore in $( cat excluded.lst ); do 
  337.         rm -rf ${src}/$edition/$ignore 
  338.     done 
  339.  
  340.     $RSYNC ${src}/$edition ${destination} 
  341.  
  342.     ssh ${remote} < script/unstable 
  343.  
  344. function clean() { 
  345.     local stage=$2 
  346.     local domain=$3 
  347.     local host=$4 
  348.     local project=$SRCDIR/${stage}/${domain}/$host.${domain} 
  349.      
  350.     if [ $# -lt 3 ]; then 
  351.         usage 
  352.     fi 
  353.      
  354.     rm -rf ${project} 
  355.  
  356. function list { 
  357.     local domain=$2 
  358.     local host=$3 
  359.     local dir=$4 
  360.     if [ -z $domain ]; then 
  361.         ls $SRCDIR/* 
  362.     exit 
  363.     fi 
  364.  
  365.     if [ -z $host ]; then 
  366.         usage 
  367.     fi 
  368.  
  369.     #config ${domain}/${host} 
  370.     ls $SRCDIR/*/${domain}/${host}.${domain} 
  371.     #git ls ${REPOSITORIES}/$dir #| awk -F '/' '{print $1}' 
  372.  
  373. function backup() { 
  374.     local domain=$2 
  375.     local host=$3 
  376.     local dir=$4 
  377.     local logfile=${LOGDIR}/${host}.${domain}.log 
  378.  
  379.     if [ -z $domain ]; then 
  380.         usage 
  381.     fi 
  382.  
  383.     if [ -z $host ]; then 
  384.         usage 
  385.     fi 
  386.  
  387.     config ${domain}/${host} 
  388.  
  389.     if [ -z $dir ]; then 
  390.         dir=$TMPDIR 
  391.     fi 
  392.  
  393.     for addr in ${REMOTE} 
  394.     do 
  395.         dir=$dir/${addr} 
  396.         if [ ! -d ${dir} ]; then 
  397.             mkdir -p $dir 
  398.         fi 
  399.         RSYNC_OPTS=" -azv " 
  400.         ${RSYNC} ${RSYNC_OPTS} ${OPTION} ${addr}::${DESTINATION} $dir >> ${logfile} 
  401.         logging 'backup' "rsync://${addr}::${DESTINATION} to ${dir}" 
  402.  
  403.         echo 'Backup Directory:' $dir 
  404.         exit 
  405.     done 
  406.  
  407. function cron(){ 
  408.     local fun=$2     
  409.     case ${fun} in 
  410.         show) 
  411.             crontab -l 
  412.             ;; 
  413.         setup) 
  414.             cat $PREFIX/cron.d/crontab | crontab 
  415.             ;; 
  416.         edit) 
  417.             vim $PREFIX/cron.d/crontab 
  418.             cat $PREFIX/cron.d/crontab | crontab 
  419.             ;; 
  420.         *) 
  421.             usage 
  422.             ;; 
  423.     esac 
  424.  
  425.  
  426. function release() { 
  427.  
  428.     local domain=$2 
  429.     local host=$3 
  430.     local ver=$4 
  431.     local message=$5 
  432.  
  433.     if [ $# -lt 4 ]; then 
  434.         usage 
  435.     fi 
  436.  
  437.     if [ -z $message ]; then 
  438.     echo -n "Message: " 
  439.         read message 
  440.     fi 
  441.  
  442.     config ${domain}/${host} 
  443.  
  444.     local logfile=${LOGDIR}/${host}.${domain}.log 
  445.     project=$SRCDIR/${STAGE}/${domain}/${host}.${domain} 
  446.     cd $project 
  447.     $GIT tag ${ver} >> $logfile 
  448.      
  449.     logging 'release' "{GIT} tag ${ver} - ${message}" 
  450.  
  451. function stage(){ 
  452.     case $1 in 
  453.         development) 
  454.             STAGE='development' 
  455.             ;; 
  456.         testing) 
  457.             STAGE='testing' 
  458.             ;; 
  459.         production) 
  460.             STAGE='production' 
  461.             ;; 
  462.         *) 
  463.         echo "STAGE ERROR" 
  464.         exit 
  465.             ;; 
  466.     esac 
  467.     echo $"STAGE=$STAGE" > $SYSCONFDIR/stage.conf && echo $STAGE 
  468.     logging 'stage' "${STAGE}" 
  469.  
  470. function branch(){ 
  471.     local stage=$2 
  472.     local domain=$3 
  473.     local host=$4 
  474.     local branchname=$5 
  475.      
  476.     cd $SRCDIR/${stage}/${domain}/$host.${domain} 
  477.     if [ -z $branchname ]; then 
  478.         git branch 
  479.     else 
  480.         git reset HEAD --hard 
  481.         git checkout $branchname 
  482.     fi 
  483.  
  484. function usage(){ 
  485. echo $"Usage: $0 [OPTION] <server-id> <directory/timepoint>
  486. echo -ne " 
  487. OPTION: 
  488.     development <domain> <host> 
  489.     testing <domain> <host> 
  490.     production <domain> <host>   
  491.      
  492.     branch {development|testing|production} <domain> <host> <branchname> 
  493.     revert {development|testing|production} <domain> <host> <revision> 
  494.     backup <domain> <host> <directory> 
  495.     release <domain> <host> <tags> <message> 
  496.      
  497.     list 
  498.     list <domain> <host> 
  499.      
  500.     clean {development|testing|production} <domain> <host>    
  501.     log <project> <line> 
  502.      
  503.     conf list    
  504.     cron show 
  505.     cron setup 
  506.     cron edit 
  507. #   stage {development|testing|production} 
  508. #   deploy <domain> <host> 
  509. #   revert <domain> <host> <revision> 
  510.  
  511. #   conf new <project> 
  512. #   conf remove <project> 
  513. #   conf show <project> 
  514. #   conf edit <project>   
  515.  
  516.     exit 
  517.  
  518. case "$1" in 
  519.     stage) 
  520.         stage $2 
  521.         ;; 
  522.     development) 
  523.         STAGE='development' 
  524.     deploy $@ 
  525.         ;; 
  526.     testing) 
  527.         STAGE='testing' 
  528.         deploy $@ 
  529.         ;; 
  530.     production) 
  531.         STAGE='production' 
  532.         deploy $@ 
  533.         ;; 
  534.     branch) 
  535.         branch $@ 
  536.         ;; 
  537.     revert) 
  538.     STAGE=$2 
  539.         revert $@ 
  540.         ;;   
  541.     backup) 
  542.         backup $@ 
  543.         ;; 
  544.     branch) 
  545.         branch $@ 
  546.         ;; 
  547.     cron) 
  548.         cron $@ 
  549.         ;;       
  550.     release) 
  551.         release $@ 
  552.         ;; 
  553.     clean) 
  554.         clean $@ 
  555.         ;; 
  556.     list) 
  557.         list $@ 
  558.         ;; 
  559.     log) 
  560.         ls -1 $LOGDIR/* 
  561.         ;; 
  562.     conf) 
  563.         conf $@ 
  564.         ;;       
  565.     *) 
  566.         usage 
  567.         exit 1 
  568.          
  569. esac 

你可能感兴趣的:(netkiller,deploy,Deployment,Devops)