svn项目release脚本

之前是用ruby折腾的,现在学习python,然后原来为一个项目做的,现在为多项目,

现在记录一下。

#!/usr/bin/python
# -*- coding:utf-8 -*-

import re
import sys
import os
import filecmp
import smtplib
import tempfile
import linecache
import datetime
from email.mime.text import MIMEText  

svn_ser = { "AAA":"http://bbb.163.net/svn/AAA", 
            "BBB":"http://aaa.163.net/svn/BBB" }

svn_rel_ser = ‘‘ 
svn_rel = ‘‘     
svn_rel_dir = "/branches"
svn_tmp_dir = tempfile.mkdtemp()
tar_list_name = svn_tmp_dir + "/tar.list" 
maillist = "/home/" + os.getlogin().replace(‘.‘,‘‘) + "/.maillist.txt"
svn_name, svn_comment = ‘‘, ‘‘
old_dir = os.getcwd()
run_user = ["li.li","se.ni","163"]

def check_user():
  if os.getlogin() in run_user:
    if not os.path.exists(maillist):
      print "Mail List File Not Exist!"
      print "Please VIM /home/%s/.maillist.txt" % os.getlogin().replace(‘.‘,‘‘)
      sys.exit(1)
  else:
    print "Permission Denied!"
    sys.exit(1)

def send_mail(tar_name, diff):  
  ci_time = datetime.datetime.now().strftime(‘%Y-%m-%d %H:%M:%S‘)
  mail_host="smtp.163.com" 
  mail_user="[email protected]"   
  mail_s= "abcabc"
  sub = "SVN_Release"
  content = ‘‘‘
  Module:  RTL
  Comment: %s
  Version: %s
  TarName: %s
  TarSize: %s
  CiTime: %s
  
  ============= DiffSVN: ======================
  %s 
  ==========================================

  ‘‘‘ % (svn_comment, re.findall(‘[0-9]{3}‘, tar_name)[0], tar_name, os.path.getsize(tar_name), ci_time, diff )

  f = open(maillist,‘r‘)
  for i in f:
    if not re.match(‘^#‘,i):
      me="SVN"+"<"+mail_user+">"  
      msg = MIMEText(content,_subtype=‘plain‘,_charset=‘gb2312‘)  
      msg[‘Subject‘] = sub  
      msg[‘From‘] = me  
      msg[‘To‘] = i
      try:  
        server = smtplib.SMTP()  
        server.connect(mail_host)  
        server.login(mail_user,mail_s)  
        server.sendmail(me, i , msg.as_string())  
        server.close()  
      except Exception, e:  
        print "Send to %s ERROR" % i  
  f.close()
  
def usage():
  tmp = ‘‘‘
  usage    
          script project_name [comment]
          
  e.g.    script AAA "Test by me"
          
          script aaa
          ‘‘‘
  print tmp   

def co_check(co_ser):
  os.chdir(svn_tmp_dir)
  os.system("svn co %s/Code/RTL 1>/dev/null 2>&1" % co_ser)

def create_tar_list():
  file_path = []
  tar_list = []
  for filepath,pathname,filename in os.walk(svn_tmp_dir): 
    #filepath  fullpath
    #pathname  fullpath child dir
    #filename  child dir file
    if os.path.exists(filepath + "/" + filepath.split(‘/‘)[-1] + ".f"):
      file_path.append(filepath + "/" + filepath.split(‘/‘)[-1] + ‘.f‘)
          
  tmp_line = []
  true_path = ‘‘
  
  for i in file_path:
    f = open(i,‘r‘)
    for line in f:
      if re.search(r‘^\/\/‘,line.strip()):
        next
      elif re.search(r‘^\.|^\w+‘,line.strip()): 
        if re.search(r‘\/\/‘,line):
          tmp_line = line.strip().split(‘//‘)[0].rstrip().split(‘/‘) 
        else:
          tmp_line = line.strip().split(‘/‘)
        if ‘.‘ in tmp_line:
          del tmp_line[tmp_line.index(‘.‘)]
        if ‘..‘ in tmp_line:
          del tmp_line[tmp_line.index(‘..‘)]
        ture_path = os.path.dirname(i) + "/" + ‘/‘.join(tmp_line)
        if os.path.isfile(ture_path):
          tar_list.append("." + ture_path.split(svn_tmp_dir)[-1])
    f.close()
  open( tar_list_name, ‘w‘).write(‘\n‘.join(tar_list))

def tar_file_name():
  os.system(‘cd %s && mkdir rel tmp && cd rel && svn co %s 1>/dev/null 2>&1‘ % (svn_tmp_dir, svn_rel_ser))  
  #can not find tar? 
  tmp_name = os.popen("cd %s && file $(svn log -v | grep ‘tar.bz2‘ | awk ‘{print \".\"$NF}‘) | grep -v ERROR" % (svn_tmp_dir + "/rel/" + svn_rel )).read()
  if tmp_name.strip() == ‘‘:
    if svn_name == "AAA":
      return [svn_name + "_Release.001.tar.bz2"]
    else:
      return [svn_name + "_001.tar.bz2"]
  else:
    tmp_name = tmp_name.split()[0].split(‘/‘)[-1].strip()[0:-1]
    if svn_name == ‘AAA‘:
      tmp_no = int(tmp_name.split(‘.‘)[-3]) + 1
      new_name = svn_name + "_Release.%03d.tar.bz2" % tmp_no
      return [new_name,tmp_name.split(‘/‘)[-1]]
    else:
      tmp_no = int(tmp_name.split(‘_‘)[-1][0:3]) + 1
      new_name = svn_name + "_%03d.tar.bz2" % tmp_no
      return [new_name,tmp_name.split(‘/‘)[-1]]

def diff_svn(tar_name):   
  diff_tmp = [] 
  tar_path = "./rel" + os.popen("cd %s/rel && find . -name %s" % (svn_tmp_dir, tar_name)).read().strip()[1:]
  os.system("cd %s && tar xf %s -C %s" % (svn_tmp_dir, tar_path, svn_tmp_dir + "/tmp"))
  f = open(tar_list_name, ‘r‘)
  for i in f:
    i = i.strip()
    filename = svn_tmp_dir + "/tmp" + i[1:]
    if os.path.isfile(svn_tmp_dir + "/tmp" + i[1:]): #exist file ---> cmp
      if not filecmp.cmp(svn_tmp_dir + i[1:],svn_tmp_dir + "/tmp" + i[1:]):
        diff_tmp.append(os.path.dirname(i.strip()))
    else:
      diff_tmp.append(os.path.dirname(i.strip()))
  f.close()
  return list(set(diff_tmp))
  
  
#--------------------------    
if len(sys.argv) <= 1:
  usage()
  sys.exit(1)
else:
  try:
    svn_name, svn_comment = str.upper(sys.argv[1]), sys.argv[2]
  except:
    svn_name, svn_comment = str.upper(sys.argv[1]), "Auto Release"
  if not svn_ser.has_key(svn_name):  
    usage()
    sys.exit(1) 
  if svn_name == ‘AAA‘:
    svn_rel_ser, svn_rel = svn_ser[svn_name] + "-REL", svn_name + "-REL"
  else:
    svn_rel_ser, svn_rel = svn_ser[svn_name] + "_REL", svn_name + "_REL"
  svn_rel_dir = svn_tmp_dir + "/rel/" + svn_rel + "/branches"  

check_user()   
co_check( svn_ser[svn_name])
create_tar_list()
tar_name = tar_file_name()
if "001" in tar_name[0]:
  diff = ‘‘
else:
  diff = diff_svn(tar_name[1])
  if len(diff) == 0:
    diff = ‘‘
  else:
    diff = "\n".join(diff)
# svn ci   
if raw_input("Are You Sure Release? [y|n]  \n " ).lower().strip() == "y":
  os.system("cd %s && tar -jc -T tar.list -f %s" % (svn_tmp_dir, tar_name[0]))
  os.chdir(svn_rel_dir)
  os.system("mv ../../../%s ." % tar_name[0])
  os.system("svn add %s" % tar_name[0])
  os.system("svn ci %s -m ‘%s‘" % (tar_name[0], svn_comment))  
  # send mail
  send_mail(tar_name[0],diff)
  print "SVN Release OK"
else:
  pass
# delete temp file
os.chdir(‘/tmp‘)
os.system(‘rm -rf $(ls -1 /tmp | grep -E "tmp[a-zA-Z0-9]+")‘)
sys.exit(0)
时间: 12-06

svn项目release脚本的相关文章

centos7配置svn钩子hooks脚本自动同步代码到项目目录

由于项目需要,svn提交后的代码希望再测试服务器上测试,每次提交后还要手动去svn update一次 十分麻烦,配置好svn钩子以后就省去了这些麻烦. 进入svn版本库目录找到hooks目录找到文件post-commit.tmpl 复制出一个命名为post-commit的文件,并修改权限为可执行权限 命令如下: cd /var/data/svndata/myproject/hooks cp post-commit.tmpl post-commit chmod 755 post-commit vi

Linux下SVN(Subversion)自动启动脚本

给大家分享下三种自动脚本,由易到难! 本人使用的方法二,其它方法没有实验 脚本一: 下面的shell脚本启动,是根据多项目使用的 svnserve -d --listen-port 3690 -r /svnroot/rekfan.com/ svnserve -d --listen-port 3691 -r /svnroot/rekfan.cn/ svn默认启动端口是3690,这里有两个svn库,所以当出现这样的情况时,上面的服务脚本只会启动一个svn库.所以就需要使用shell脚本来实现启动两个

Bash Shell-通用项目升级脚本

#!/bin/bash ################################################################################ # Filename : upgrade_project.sh # Summary : 项目升级脚本 # License : GPL # Version : 1.0 # Author : Jet Bi # Email : 1207501666@qq.com # Date : 2016/08/08 # Note :

pycharm3.4 下svn 项目checkout&amp;配置

pycharm 社区版: 3.4 1. checkout 项目 注意,之前配置好:设置里面的一些配置:(以下勾勾不要勾上) 2. checkout 项目之后,做以下操作: vcs ->enable subversion version control (这步很关键,否则无法在pycharm里面checkin代码.) pycharm3.4 下svn 项目checkout&配置,布布扣,bubuko.com

导出本地和远程SVN项目, Export remote SVN repository

在有服务器控制权的情况下, 源服务器上 sudo svnadmin dump ironbank/ > ~/ironbank.svn.dump 在目的服务器上 sudo svnadmin create ironbank sudo svnadmin load ironbank/ < ~/ironbank.svn.dump sudo chown -R apache:apache ironbank/ 仅提取repository中某个子项目的情况 tar -zxvf tt_repos.dump.2014

【Javaweb】新SVN项目的注意事项

一个真正的网页编程程序猿走上团队协作的道路是不可避免的,使用Eclipse或者MyEclipse利用SVN插件完成团队编程总有一天或者就是现在,是一件很平常的事情. 但是,往往有时候前台环境配置好了,<[Javaweb]前台开发环境的配置Myeclipse6.5+JDK1.6+Tomcat6.0+SVN1.8>(点击打开链接),后台环境配置好,<[Mysql]Mysql的安装.部署与图形化>(点击打开链接),各步骤都做好了,根据上面给的SVN从服务器按照要求Down下项目,就是无法

Java Web 项目打包脚本

可用于 (但不限于) Eclipse 项目. 一次性生成:1. Java doc .zip 包:2. Java 源代码 .zip 包:3. Java 二进制文件 .jar 包:4. Java 源代码加二进制 .jar 包:5. 包含 Java 源代码的 .war 包. 依赖:能在 PATH 中找到 jar .javadoc . 因项目和个人习惯不同,脚本可能需要修改才能适应实际情况.?1. [代码]某次打包的效果 [[email protected] jweb.tfw.tfw_web_lpm]$

svn项目导入

svn项目导入 在已建立好svnserver服务器的情况下,且所用电脑上已装好svn,在电脑上导入svn项目 首先,新建文件夹,点击鼠标右键,选择TortoiseSVN–>export 然后,在URL of repository中输入导入的网址,这个可以从svn服务器上获取,管理员会发给你的 打开svn server服务器,然后如下图所示,鼠标右键单击respositories下的项目,然后选择 copy URL to clipboard 这样网址就在你的剪贴板里面了,也可直接把下图所示右边面板

一个创建Coco2d-x项目的脚本

1.使用环境 我测试的环境是Mac OS 10.10 +Coco2d-x 3.2,是使用shell写的脚本,应该linux/unix都应该 可以使用. 2.使用可能出现的问题 使用中可能会爆权限不足的错误,给两个文件赋予权限就可以,以Mac 为例,打开终端 cd到该文件目 录执行命令:chmod u+x  文件名.后缀 ,需要给两个文件附加这种权限,一个是coco2d-x创建项目的脚本 (cocos.py),另一个是下面提供的这个脚本. 3.配置参数 打开脚本,前四个参数需要自己配置的 cfRo