應用系統自動佈署機制

場景

    • 設置應用系統佈署服務器 1 台
    • 設置應用系統服務器多台
    • 設置分散式檔案系統,目錄規劃如下:
      • 應用系統發佈目錄
        • 各應用系統享有獨立子目錄
          • 應用系統佈署版次檔案:Version.txt
              • 第 1 行:1.00 => 版本號 第 2 行:2011-05-12 14:00 => 發布日期 第 3 行:Rich Lee => 發布者 第 4 行:Python => 程式語言
          • 應用系統佈署檔案:[應用系統代碼].zip
            • 應用系統存放子目錄:[應用系統代碼].src
          • 應用系統其他版次檔案:[應用系統代碼-版次].zip
        • 分享發佈目錄給應用系統服務器
      • 應用系統服務器目錄
        • 映射應用系統發佈目錄至各服務器
        • 各應用系統享有獨立子目錄

機制

    • 定時在應用系統服務器運行應用系統佈署程式。
    • 應用系統佈署程式比對應用系統發佈目錄下,某應用系統子目錄內版次檔案(Version.txt)。
    • 若 2 個版次檔案內容不符,應用系統佈署程式自應用系統發佈目錄下,複寫某應用系統子目錄內之應用系統佈署檔案。
    • 應用系統佈署程式複寫應用系統佈署檔案後,自動解壓縮。

運行

$> python LoadRunner.py [應用系統子目錄]

程式碼

    • LoadRunner.py
      • import sys import os import os from Repository import Repository def main(argv=sys.argv): retCode = 1 if len(sys.argv) < 2: sys.exit(retCode) applicationName = sys.argv[1] applicationZipFile = applicationName + '.zip' folderName = applicationName + '.src' myRepository = Repository() latestGlobalVersion = myRepository.GetGlobalApplicationVersion(applicationName) latestLocalVersion = myRepository.GetLocalApplicationVersion(applicationName) if latestGlobalVersion[0] == 'X': sys.exit(retCode) if latestGlobalVersion[0] != latestLocalVersion[0]: myRepository.RemoveLocalFile(applicationName, applicationZipFile) if myRepository.CopyFileFromGlobalToLocal(applicationName, applicationZipFile): myRepository.RemoveLocalApplicationRepositoryFolder(applicationName, folderName) if myRepository.UnzipLocalFile(applicationName, applicationZipFile): myRepository.CopyFileFromGlobalToLocal(applicationName, 'Version.txt') myRepository.RemoveLocalFile(applicationName, applicationZipFile) retCode = 0 print 'OK!' else: print 'X: Unzip' retCode = 4 else: print 'X: Zip' retCode = 3 else: print latestGlobalVersion[0] print latestLocalVersion[0] retCode = 2 sys.exit(retCode) if __name__ == "__main__": sys.exit(main())
    • Repository.py
      • import sys import os import shutil import subprocess # 依實際應用規劃修改 GLOBAL_REPOSITORY = '~/LoadRunner/Global.Repository' LOCAL_REPOSITORY = '~/LoadRunner/Local.Repository' VERSION_FILE = 'Version.txt' UNZIP_FILE = 'unzip -o -d ' class Repository: globalRepository = GLOBAL_REPOSITORY localRepository = LOCAL_REPOSITORY def __init__(self): pass def GetGlobalRepository(self): return self.globalRepository def GetLocalRepository(self): return localRepository def GetGlobalApplicationRepository(self, applicationName): return os.path.join(self.globalRepository, applicationName) def GetLocalApplicationRepository(self, applicationName): return os.path.join(self.localRepository, applicationName) def GetGlobalApplicationVersion(self, applicationName): globalApplicationFolder = self.GetGlobalApplicationRepository(applicationName) if os.path.exists(globalApplicationFolder) == False: os.mkdir(globalApplicationFolder) latestVersion = ('X') return latestVersion if os.path.exists(globalApplicationFolder): versionFile = os.path.join(globalApplicationFolder, VERSION_FILE) if os.path.exists(versionFile): fileHandle= open(versionFile, 'r') latestVersion = fileHandle.readlines() fileHandle.close() else: latestVersion = ('X') return latestVersion def GetLocalApplicationVersion(self, applicationName): localApplicationFolder = self.GetLocalApplicationRepository(applicationName) if os.path.exists(localApplicationFolder) == False: os.mkdir(localApplicationFolder) latestVersion = ('X') return latestVersion versionFile = os.path.join(localApplicationFolder, VERSION_FILE) if os.path.exists(versionFile): fileHandle = open(versionFile, 'r') latestVersion = fileHandle.readlines() fileHandle.close() else: latestVersion = ('X') return latestVersion def CopyFileFromGlobalToLocal(self, applicationName, fileName): sourceFile = os.path.join(self.GetGlobalApplicationRepository(applicationName) , fileName) targetFile = os.path.join(self.GetLocalApplicationRepository(applicationName) , fileName) myResult = False try: if os.path.exists(targetFile): os.remove(targetFile) shutil.copyfile(sourceFile, targetFile) myResult = True except (RuntimeError, TypeError, NameError): print "Error({0}.{1}.{2}".format(RuntimeError, TypeError, NameError) return myResult def UnzipLocalFile(self, applicationName, fileName): targetFolder = self.GetLocalApplicationRepository(applicationName) targetZipFile = os.path.join(targetFolder , fileName) retCode = 0 try: retCode = subprocess.call(UNZIP_FILE + targetFolder + " " + targetZipFile, shell=True) except (RuntimeError, TypeError, NameError): print "Error({0}.{1}.{2}".format(RuntimeError, TypeError, NameError) return (retCode==0) def RemoveLocalApplicationRepositoryFolder(self, applicationName, folderName): targetFolder = os.path.join(self.GetLocalApplicationRepository(applicationName), folderName) myResult = False try: if os.path.exists(targetFolder): shutil.rmtree(targetFolder) myResult = True except (RuntimeError, TypeError, NameError): print "Error({0}.{1}.{2}".format(RuntimeError, TypeError, NameError) return myResult def RemoveLocalFile(self, applicationName, fileName): targetFolder = self.GetLocalApplicationRepository(applicationName) targetFile = os.path.join(targetFolder , fileName) myResult = False try: if os.path.exists(targetFile): os.remove(targetFile) myResult = True except (RuntimeError, TypeError, NameError): print "Error({0}.{1}.{2}: {3]".format(RuntimeError, TypeError, NameError, targetFile) return myResult