情況介紹
由于公司準備做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的源碼,寫的清晰易懂而且架構很好。