python——多線程maven批量打包工具

實現思路

  1. 通過命令進入路徑執行“maven clean”和“maven package”
  2. window執行多個命令語法:aa && bb (執行aa成功後,才執行bb)
  3. 通過任務隊列的方式實現
  4. 待所有線程任務完成後,再進行收取包操作
  5. 收取包操作,默認匹配target路徑中的*.jar和*.war

使用方式

假設改腳本文件名爲:autopackage.py

暫不支持跨盤符打包

  • 全量打包
    輸入命令:python autopackage.py
    注:該命令會將所有路徑的包全部打包,並收集

  • 自定義打包
    輸入命令:python autopackage.py systemkey
    注:
    1.systemkey爲配置中的系統key
    2.自定義多個打包,systemkey以英文逗號隔開,例如:python autopackage.py systemkey1,systemkey2

代碼實現

線程數量未抽取成變量,使用時可根據具體情況調整for循環

配置參數說明:

參數 說明
disk 打包項目所在盤符
collect_path 打包完成後,收取包路徑
proMap 項目路徑配置(注意:路徑配置與target同級)
#!/usr/python/bin
# -*- coding: utf-8 -*-

import os
import queue
import sys
import threading
import time


# 定義線程類
class myThread(threading.Thread):
    # q爲先前組裝好的打包任務(及打包所在路徑)
    def __init__(self, threadID, q, disk):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.q = q
        self.disk = disk

    def run(self):
        start_package(self.q, self.disk)


def start_package(q, disk):
    while not q.empty():
        p = q.get()  # 默認block=True, timeout=None
        os.system("%s && cd %s && mvn clean && mvn package -DskipTests" % (disk, p))


def collect_packages(proMapList, collect_path):
    for i, el in enumerate(proMapList):
        eljar = el + "*.jar " + collect_path
        elwar = el + "*.war " + collect_path
        print(eljar)
        print(elwar)
        os.system(eljar)
        os.system(elwar)


def main():
    localtime=time.asctime(time.localtime(time.time()))
    startTime=time.time()
    print(localtime)
    # 所在硬盤
    disk = "C:"
    # 包收集路徑
    collect_path = "D:\\collect_packages"
    # 硬盤相對路徑
    proMap = dict([
        ("此處填寫系統key", disk + "此處填寫硬盤中路徑")
    ])
    # 臨時備份字典
    
    
    proMapList = list()

    threads = []
    workQueue = queue.Queue(10)
    if (sys.argv.__len__() == 1):
        pathlist = list(proMap.keys())
        for p in pathlist:
            workQueue.put(proMap.get(p))
            proMapList.append("copy %s" % (proMap.get(p) + "\\target\\"))
            # proMapList.append("copy %s %s" % (proMap.get(p) + "\\target\\" + p + ".jar", collect_path))
    else:
        pathlist1 = str(sys.argv[1]).split(",")
        i = 0
        # 根據腳本所帶參數,遍歷參數,往隊列中增加任務(即打包所在路徑),並拼接取包路徑
        for i in range(0, len(pathlist1)):
            workQueue.put(proMap[pathlist1[i]])
            proMapList.append("copy %s" % (
                    proMap[pathlist1[i]] + "\\target\\"))
            # proMapList.append("copy %s %s" % (proMap[pathlist1[i]] + "\\target\\" + pathlist1[i] + ".jar", collect_path))

    for i in range(1, 8):
        thread = myThread(threadID=i, q=workQueue, disk=disk)
        thread.start()
        threads.append(thread)
    for thread in threads:
        thread.join()
    print("package over!")

    # 批量取包
    print("collecting packages...")
    # 先清空取包路徑
    os.system("del /q %s" % (collect_path))
    # 再複製取包
    collect_packages(proMapList, collect_path)
    print("collect over!")
    print(localtime)
    endTime=time.time()
    print("cost: %.2f s"%(endTime-startTime))

main()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章