运维人

git 代码拉取、同步、通知

代码托管到gtihub,开发人员进行本地修改push到仓库后,这里使用pull在web服务器上定期拉去代码至开发开发服务器

more code_sync_template.sh 
#!/bin/sh
update_dir="/home/demo/" #every time upload code main dir
webroot="/var/www/template"
#bak_dir="/codedata/bak/deploy" #backup file main dir
gibin="/usr/bin/git" #git bin path
rsync_bin="/usr/bin/rsync"  #rsync path
#这个变量定义的是代码拉取到本地之后同步到web目录时过排除一些特定的文件
#rsync_exclude=".svn|*.gz|*.cache|*.txt|*.git|_tmp|temp|pma|dsn.php|gem*|global_config.php
"
Name="template"
LOG="/var/log/code_sync_template.log"
TIME=`date +%F\ %T`
OLD_IFS="$IFS"  #backup IFS
COMMAND="sed -n '/$TIME start/,\$p' $LOG > /tmp/template.log"

#get gitos code to local
pull_code()
{
if [ -d $update_dir/$Name ];then

      if cd $update_dir/$Name && $gibin pull git@这里是你的代码仓库地址 &>>
 $LOG ;then
           echo -e "\033[32m `date` git pull code success \033[m"
      else
           echo -e "\033[31m `date` git pull code error \033[m" && exit 1
      fi
else
     echo -e "\033[32m Clone code to local. \033[m"
     cd $update_dir && $gibin clone git@这里是你的代码仓库地址
fi
}

#sync local code to webroot
#定义的是将最新拉取到的代码同步到web目录
sync_code()
{	
#$rsync_bin -uavz $update_dir/$Name $webroot/$Name
if [ "$rsync_exclude" ];then
IFS="|"
   exclude_arr=($rsync_exclude)
     for e_arr in ${exclude_arr[@]};do
          echo $e_arr >>/tmp/code_exclude_list
     done
	$rsync_bin -avz --exclude-from="/tmp/code_exclude_list"  $update_dir/$Name/* $webr
oot/
else
	$rsync_bin -avz  $update_dir/$Name/* $webroot/  
fi
IFS="$OLD_IFS"
}

Notice(){
        #这个是通过一个eval命令来执行一段命令,这个命令描述的是从上次脚本执行记录日志后开始到最后的日志信息
eval $COMMAND 
        #这里是在过滤此次同步是记录的日志中pull有没有文件更新
grep -E "files changed|Fast-forward" /tmp/template.log
if [ $? -eq 0 ];then
        #这里使用一个python脚本来获取pull时更新了的具体文件有哪些,然后将内容通过邮件发送到指定邮箱
	python /home/demo/mail-template.py   
else
        exit 5
fi
}

echo ' ' >> $LOG
echo -e "\033[42;37m ############ Template $TIME start ############ \033[m" >> $LOG
echo -e "\033[47;30m Template Pull remote code to local. \033[0m" >> $LOG
echo -e "\033[47;30m Template Pull remote code to local. \033[0m"
pull_code >> $LOG
echo -e "\033[47;30m Template Sync local code to wwwroot.\033[0m" >> $LOG
echo -e "\033[47;30m Template Sync local code to wwwroot.\033[0m"
sync_code >> $LOG
echo -e "\033[46;37m ############ Template $TIME  end  ############ \033[m" >> $LOG
echo ' ' >> $LOG
Notice

 

邮件通知脚本,能够在自定义的时间周期内获取到最新代码时 能发送邮件到指定的邮箱,能够自动提醒管理人员知悉这一动作。

#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import smtplib
import os,sys
from email.mime.text import MIMEText

mailto_list=['guomaoqiu@gmail.com']
mail_host='smtp.qq.com'
mail_port='25'
mail_user='2399447849'
mail_pass='xxxxxx'
mail_postfix='qq.com'

filename = "/tmp/template.log"

fo = open(filename,"rb")
filecon = fo.read();
str1 = "<pre>{0}</pre>".format(filecon)

def send_mail(to_list,sub,content):
    me="Code Sync Notice【Template】"+"<"+mail_user+"@"+mail_postfix+">"  
    msg = MIMEText(content,_subtype='html',_charset='utt-8')
    msg['Subject'] = sub
    msg['From']=me 
    msg['to']=";".join(to_list)
    try:
        s = smtplib.SMTP()
   	s.connect(mail_host)
	s.login(mail_user,mail_pass)
	s.sendmail(me,to_list,msg.as_string())
	s.close()
	return True
    except Exception, e:
	print str(e)
	return False
if __name__=='__main__':
   if send_mail(mailto_list,"New Files Are Added",str1):
	print "发送成功"
   else:
	print "发送失败"
    分享到:
码字很辛苦,转载请注明来自运维人《git 代码拉取、同步、通知》

评论

  1. 阿东 #1

    6666

    回复
    2015-09-14