关闭

Python+Git+FTP实现内部分发网站数据的自动更新

标签: gitpython
717人阅读 评论(0) 收藏 举报
分类:

20160827

需求

我们的内部分发平台可以算是半个静态页面,前端用AngularJS写的,数据是拿一个json来实现动态展示,每次我要在本地修改完代码,然后再通过FTP传到服务器上。整个步骤有点繁琐,尤其是打包打的多的时候,每次要花上1~2分钟来折腾这个东西,我就在想自己写一个脚本来处理这个繁琐的操作,内容编辑只能手工编辑,但是上传到服务器这种操作,肯定是可以通过脚本来处理,而且必须要自动处理。

思路

最初的思路我是想监控整个代码,一旦发生变动,就把整个代码直接更新到服务器上,后来发现有点问题,Python的FTP并不支持文件夹上传,如果要这样实现,那么势必要递归去抓取所有的文件,再执行上传操作,效率会非常的低。

那么就只能执行增量更新的操作了,增量更新最方便的就是用Git来监控代码库,通过比对提交的不同点抓出变动的文件,然后将这个变动的文件上传至服务器即可。

开始

大概的功能是比较简单的,写起来也比较顺,不过还是有遇到一些问题的。Python的FTP方法,上传文件的时候只能传递在当前目录,也就是说如果文件在子文件中,就必须要切换到子文件的目录下,再执行上传操作。

def getChangeFile():
    """
    获取变动的文件名的绝对路径的列表
    :return:List
    """
    if getChangeStatus():
        os.system('git add .')
        os.system('git commit -m"{}"'.format(time.strftime("%Y%m%d%H%M")))
    cmdrst = os.popen("git diff head head^1 --name-only").read()
    print "{}产生了变动,变动信息如下:".format(time.strftime("%Y%m%d%H%M"))
    print cmdrst
    rst = cmdrst.split('\n')
    rst.remove('')
    rstdir = [os.getcwd() + '/' + x for x in rst]
    return rstdir

这个方法是获取变动的文件,拼接出文件的绝对路径。

def getRelaDir(absDir):
    """
    通过绝对路径的分割来获取相对路径
    :param absDir:List, 绝对路径
    :return:List
    """
    relaDir = []
    for x in absDir:
        dir = x.split('release')[1]
        dirlist = dir.split('/')
        for x in dirlist:
            if x == '':
                dirlist.remove('')
        relaUrl = '/'.join(dirlist)
        relaDir.append(relaUrl)
    return relaDir

这个方法是吧绝对路径做一次分割,获取文件相对于代码根目录的路径。

最后在执行的时候,把相对地址处理成服务器的相对地址,在上传的之前切到对应的相对地址,再使用绝对地址获取文件,执行上传操作。

最后

整个逻辑其实还是有优化的空间,只是已经实现了,有时候就懒的去改动了,至少在功能上已经能满足我的日常需要了,再写一个启动脚本,每5分钟监控一次,然后我要做的只是把每次安装包的内容更新一下就行了,可以省去那么几分钟。

放上整个代码:

# ecoding=utf-8
# Author: 翁彦彬 | Sven_Weng
# Email : diandianhanbin@gmail.com

import os
import time
import sys

from ftplib import FTP

reload(sys)
sys.setdefaultencoding('utf8')

devIP = 'xxx.xxx.xxx.xxx'
devPort = '21'
usr = 'xxxxxx'
pwd = '123456'
url = '\\zzinfo-new\\tzt\\jy\\download\\release'
try:
    ftp = FTP()
except Exception:
    print "FTP无法建立连接"
    sys.exit(0)


def connFtp():
    """
    连接FTP
    :return:None
    """
    try:
        ftp.set_debuglevel(2)
        ftp.connect(devIP, devPort)
        ftp.login(usr, pwd)
    except Exception as e:
        print e
        print "FTP连接失败"
        sys.exit(0)


def quitFtp():
    """
    断开FTP
    :return:None
    """
    ftp.quit()


def getChangeStatus():
    """
    获取变动的状态,有变动返回True,无变动返回False
    :return:True/False
    """
    rst = os.popen('git status -s').read()
    if rst == '':
        return False
    else:
        return True


def getChangeFile():
    """
    获取变动的文件名的绝对路径的列表
    :return:List
    """
    if getChangeStatus():
        os.system('git add .')
        os.system('git commit -m"{}"'.format(time.strftime("%Y%m%d%H%M")))
    cmdrst = os.popen("git diff head head^1 --name-only").read()
    print "{}产生了变动,变动信息如下:".format(time.strftime("%Y%m%d%H%M"))
    print cmdrst
    rst = cmdrst.split('\n')
    rst.remove('')
    rstdir = [os.getcwd() + '/' + x for x in rst]
    return rstdir


def getRelaDir(absDir):
    """
    通过绝对路径的分割来获取相对路径
    :param absDir:List, 绝对路径
    :return:List
    """
    relaDir = []
    for x in absDir:
        dir = x.split('release')[1]
        dirlist = dir.split('/')
        for x in dirlist:
            if x == '':
                dirlist.remove('')
        relaUrl = '/'.join(dirlist)
        relaDir.append(relaUrl)
    return relaDir


def upload(filename):
    """
    上传文件
    :param filename:文件名的绝对路径
    :return:None
    """
    print 'uploading {}'.format(filename)
    try:
        fileHandle = open(filename, 'rb')
        ftp.storbinary('STOR {}'.format(os.path.basename(filename)), fileHandle)
        print '{} upload finished'.format(filename)
    except IOError:
        pass


def fuckDS_Store(dsdir):
    """
    干掉该死的DS_Store
    :param dsdir: List, 绝对路径或者相对路径的集合
    :return:List
    """
    for i, x in enumerate(dsdir):
        if 'DS_Store' in x:
            dsdir.pop(i)
    return dsdir


if __name__ == '__main__':
    if getChangeStatus():
        connFtp()
        absPATH = fuckDS_Store(getChangeFile())
        relaPATH = fuckDS_Store(getRelaDir(absPATH))
        for x, y in zip(relaPATH, absPATH):
            fileinfo = os.path.split(x)
            file_url = os.path.join(url, os.path.split(x)[0]).replace('/', '\\')
            file_name = os.path.split(x)[1]
            ftp.cwd(file_url)
            upload(y)
        quitFtp()
    else:
        print '暂无变化'
0
0
查看评论

git diff与git diff HEAD -- file

最近,自己开始接触git。在学到git diff时,一直困惑。git diff到底比较的是那个两个文件之间的差异。经过在网上搜网,终于找到乐答案。 这里分为两种情况,一种是当暂存区中有文件时,另一种是暂存区中没有文件。 (1)当暂存区中没有文件时,git diff比较的是,工作区中的文件与上次提交到...
  • u013485584
  • u013485584
  • 2016-11-23 12:54
  • 3637

git中diff用法

转自:http://fsjoy.blog.51cto.com/318484/245465 第七课 Git差异比对 内容提要:显示项目的两个不同版本之间的差异,或者显示指定文件的不同之处   在‘git日志’一课中,我们通过'git log -p'...
  • shanliangliuxing
  • shanliangliuxing
  • 2014-04-27 23:04
  • 2642

python 用于git的脚本

''' Readme python commitmessage.py 19.3.A.0.12 19.3.A.0.13 oldtag:19.3.A.0.12 newtag:19.3.A.0.13 ''' import os import...
  • xiayu98020214
  • xiayu98020214
  • 2015-04-15 17:56
  • 3135

数据分发组件架构设计

数据分发组件架构设计
  • dingli3213
  • dingli3213
  • 2017-12-26 14:04
  • 72

关于OMG的DDS,实时系统的数据分发服务

感觉现在自己看的东西太多太杂,一直没有找到一个点来深究 最近先是接到任务看一个实时系统调度仿真的事情,这个事情忙了一段时间,目前又告一段落了。 新的任务又开始了就是研究分布式实时系统,整个过程是先看了一些中文的论文,然后再去看了OMG官网的DDS文档,然后再看了一部分英文的利用DDS实现...
  • m47838704
  • m47838704
  • 2015-02-09 13:20
  • 2969

springMVC原理(二):SpringMVC核心分发器DispatcherServlet分析[附带源码分析]

介绍 SpringMVC是目前主流的Web MVC框架之一。  如果有同学对它不熟悉,那么请参考它的入门blog:http://blog.csdn.net/mll999888/article/details/77512749 本文将分析SpringMVC的核心分发器Dis...
  • mll999888
  • mll999888
  • 2017-08-27 13:24
  • 279

app内部自动更新

12306的app可以绕过appstore直接更新?这个“更新”真的是更新吗? 答案很简单:12306是一个webapp 内部功能都是通过web来实现的 更新其实是在下载html 样式 js 等等一些资源 下好了之后 webview 重新加载即可。 和手机游戏的热更新类似,app...
  • ios_xumin
  • ios_xumin
  • 2016-07-05 11:09
  • 1388

在企业内部分发ios应用程序

本文译自:Provision iOS IPA App for In-House Enterprise Distribution 在企业内部分发 iOS 应用程序非常复杂。经过努力,我成功实现了在企业内部的应用程序分发。我决定用此文来记录我的最佳实践方法,以供将来参考。 如果你希望通过 S...
  • lmmilove
  • lmmilove
  • 2014-08-18 10:16
  • 3424

PHP实现网页自动更新块

    前言:现在很多有个人主页或者博客的朋友选择租用虚拟主机,而相当一部分虚拟主机支持php。如果你有一个支持php的主机空间,有没有用php把自己的网站武装起来呢? CkbLinux联盟   CkbLinux联盟    能不能...
  • zhuche110
  • zhuche110
  • 2008-04-21 10:28
  • 1878

ASP 程序实现自动升级功能

 现在流行虚拟主机建站,我也有个网站,也算是个站长咯。当了近一年的站长,感到网站程序每次升级的时候颇为麻烦:先去官方看公告,然后下载升级包到本地,解压,FTP上传到虚拟主机。这些都是累人的体力活,加之本人又懒得很,所以异想天开的觉得要是程序能够自动升级就好了。所以就想了想,写了本文,希望对...
  • lake2
  • lake2
  • 2006-05-28 00:10
  • 6891
    个人资料
    • 访问:148302次
    • 积分:2446
    • 等级:
    • 排名:第17890名
    • 原创:91篇
    • 转载:3篇
    • 译文:6篇
    • 评论:116条
    友情链接
    文章分类
    最新评论