情况介绍
由于公司准备做Jenkins的前端自动化发布,但是前端的Node.js环境不统一,所以暂时先搁置,采用Ftp上传文件更新项目,因此想到了可以采用文件监控的形式来进行自动化上传。Python语言的优越性就体现出来了,其中有很多很棒的库,本篇即将用到的就是watchdog库。
watchdog库介绍
watchdog用来监控指定目录文件的变化,例如添加删除文件或目录,修改文件内容、重命名文件或目录等,每种变化都会产生一个事件,且有一个特定的事件类与之对应,然后再通过事件处理类来处理对应的事件,至于怎么样处理事件完全可以自定义,只需继承事件处理类的基类并重写对应实例方法。

实战准备
1.Python环境(系统自带Python2.7.5)
2.安装watchdog库(pip install watchdog)
实例演示
#!/usr/bin/python # -*- coding:UTF-8 -*- import time from watchdog.observers import Observer from watchdog.events import RegexMatchingEventHandler import commands class MyHandler(RegexMatchingEventHandler): def __init__(self, regex_list=[r”.*”]): super(MyHandler, self).__init__(regex_list) def on_created(self, event): if event.is_directory: pass else: print(event.event_type, event.src_path) def on_deleted(self, event): def on_modified(self, event): node = event.src_path.split(‘/’,3)[2] if node == “cp”: commands.getstatusoutput(‘ansible-playbook /mm/node/tasks/node_cp.yml’) elif node == “genpindao”: commands.getstatusoutput(‘ansible-playbook /mm/node/tasks/node_genpindao.yml’) elif node == “login”: commands.getstatusoutput(‘ansible-playbook /mm/node/tasks/node_login.yml’) elif node == “ucenter”: commands.getstatusoutput(‘ansible-playbook /mm/node/tasks/node_ucenter.yml’) commands.getstatusoutput(‘ansible-playbook /mm/node/tasks/node.yml -e node=’+node) def on_moved(self, event): print(“move”, event.src_path, event.dest_path) if __name__ == “__main__”: reges = [r”.*\.c”, r”.*\.h”, r”.*\.cpp”] event_handler = MyHandler(reges) observer = Observer() observer.schedule(event_handler, “/node_ftp/”, recursive=True) observer.start() try: while True: time.sleep(2) except KeyboardInterrupt: observer.stop() observer.join()
实例分析
watchdog主要采用观察者模型。主要有三个角色:observer,event_handler,被监控的文件夹。三者原本是独立的,主要通过observer.schedule函数将三者串起来,意思为observer不断检测调用平台依赖代码对监控文件夹进行变动检测,当发现改变时,通知event_handler处理。
关键点:
1.on_modified方法,是文件有变化触发的函数,上传Ftp目录后就需要调用此方法。
2.event是获取具体文件的路径,文中是为了获取具体的项目名称而进行的目录处理。
3.commands.getstatusoutput方法是调用系统的Shell命令。
4.observer.schedule方法第二个参数就是监控的具体的目录。
Tips:最后可以推荐读者有时间可以阅读一下watchdog的源码,写的清晰易懂而且架构很好。