jenkins批量打包脚本

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by jrwang on 2020/9/25
import time
import pandas as pd
import threading
import jenkins
import sys


def jenkinsConfig(url, username, password):
server_object = jenkins.Jenkins(url=url, username=username, password=password)
server_object.get_whoami()
return server_object


def params(job_name, module, branch, env):
micro_params = {
'project_name': module,
'conf': env,
'branch': branch
}
if job_name in ['microbasic-wh', 'microbusiness-wh', 'microyunyan-wh', 'microzv-wh']:
return micro_params


def process(dt):
jobs = {
'microbasic-wh': ['micro-basic-frontend', 'micro-app-manager', 'micro-application-manager'],

'microbusiness-wh': ['micro-static-file', 'micro-theme-design', 'micro-dep-librarys', 'micro-unified-user',
'micro-unified-login', 'micro-portal-gateway', 'micro-user-manager',
'micro-face-library', 'micro-body-library', 'micro-vehicle-library',
'micro-non-vehicle-library', 'micro-camera-snapshot', 'micro-access-control','micro-user-tools',
'micro-user-log','micro-admin-manager'],

'microyunyan-wh': ['micro-actual-device', 'micro-actual-house', 'micro-actual-person', 'micro-actual-vehicle',
'micro-community-archives', 'micro-community-care', 'micro-community-hourse-management',
'micro-community-management', 'micro-community-overview', 'micro-community-person-management',
'micro-community-vehicle-management', 'micro-object-query', 'micro-person-archives',
'micro-relation-ship', 'micro-scene-management', 'micro-place-management',
'micro-situational-management', 'micro-third-village', 'micro-vehicle-archives',
'micro-high-altitude-parabola','micro-epidemic-prevention','micro-data-overview',
'micro-task-management','micro-event-handling','micro-community-unit-management','micro-house-archives','micro-quicklink-management',
'micro-process-management','micro-actual-unit','micro-hight-process-management',
'micro-hight-event-handling','micro-hight-task-management','micro-mass-control','micro-soldier-management',
'micro-algorithm-configuration','micro-street-high-merge','micro-doormagnetism-library'],

'microzv-wh': ['micro-videomonitor-manager', 'micro-person-monitor', 'micro-form-manager', 'micro-device-manager',
'micro-approval-manager', 'micro-scene-manager', 'micro-assistant-manager',
'micro-command-manager', 'micro-videopdlan-manager', 'micro-screen-manager',
'micro-databoard-manager', 'micro-worktable-manager', 'micro-districto-verview',
'micro-vehicle-tags', 'micro-vehicle-monitor', 'micro-vehicle-defence', 'micro-person-defence',
'micro-tag-center', 'micro-relational-center', 'micro-about-center', 'micro-person-controllib',
'micro-person-control', 'micro-device-file', 'micro-caselibs-manager', 'micro-handling-monitor',
'micro-handing-defence', 'micro-dict-manager', 'micro-watermark-manager', 'micro-place-file',
'micro-intelligentjudgement-manager', 'micro-analysis-manager', 'micro-personal-center',
'micro-three-dimensional', 'micro-mapbattle-manager', 'micro-vehicle-skillwar',
'micro-1400-viewlibrary', 'micro-person-skillwar', 'micro-bus-special', 'micro-multi-control',
'micro-drugaddicts-special', 'micro-dens-analysis','micro-police-info','micro-caseslib-manager','micro-platform-device-manager']
}

server = dt[1]
branch = dt[2]
for item, value in jobs.items():
if server in value:
job_name = item
param = params(job_name=job_name, module=server, branch=branch, env=config.get('env'))
try:
server_object.build_job(job_name, param)
time.sleep(3)
nextBuildNumber = server_object.get_job_info(job_name)['nextBuildNumber']
time.sleep(10)
building_status = server_object.get_build_info(job_name, nextBuildNumber)['building']
while building_status:
time.sleep(5)
building_result = server_object.get_build_info(job_name, nextBuildNumber)['result']
if building_result == 'SUCCESS':
print(server, '微应用打包成功!')
break
elif building_result == 'FAILURE':
print(server, '\033[31m微应用打包失败!\033[0m ')
break
except Exception as e:
print(e)
print(server, '\033[31m微应用构建报错!\033[0m ')


def new_process(*args):
for server in args:
process(server)


def deal(num=0):
# 从excel中读取指定sheet,默认第一个
tag = config.get('tag')
f = pd.ExcelFile(tag).sheet_names
data = pd.read_excel(tag, sheet_name=f[num])
# data = pd.read_excel(tag, sheet_name='0409')
# print(f[num])
# 保留需要打包的程序
data = data.replace("/", "")
print(data)
data.drop(data[pd.isna(data['是否更新'])].index, inplace=True)
dt_isUpdate = [x[1] for x in data.values.tolist()]
data.drop(data[pd.isna(data['tag'])].index, inplace=True)
dt = data.values.tolist()
dt_tag = [x[1] for x in dt]

if len(dt_tag) != len(dt_isUpdate):
print('以下待服务未提供tag:')
print(set(dt_isUpdate) ^ set(dt_tag))
sys.exit()

print('需升级的微应用清单')
print(*[x[1] for x in dt], sep='\n')
print(len(dt))
print('===============================')
return dt


def run_threads(data):
order = []
for x in data:
if not set(['micro-basic-frontend', 'micro-app-manager', 'micro-dep-librarys', 'micro-theme-design','micro-static-file']).isdisjoint(set(x)):
order.append(x)

# 顺序执行框架级微应用
if order:
print('开始打包框架级微应用')
print(*[x[1] for x in order], sep='\n')
for i in range(len(order)):
process(order[i])
data = [x for x in data if x not in order]
else:
print('无框架级微应用需要打包,跳过')

# 其他微应用多线程处理
print('===============================')
print('开始打包其他微应用')
ths = int(config.get('threadNum'))
pools = []
if len(data) % ths:
group = len(data) // ths + 1
else:
group = len(data) // ths
data = [data[i: i + group] for i in range(0, len(data), group)]
for i in range(ths):
recv_thread = threading.Thread(target=new_process, args=(data[i]))
pools.append(recv_thread)
print('线程 {} 对应微应用:{}'.format(recv_thread, [x[1] for x in data[i]]))
for thread in pools:
thread.setDaemon(True)
thread.start()
time.sleep(1)
for thread in pools:
thread.join()


if __name__ == '__main__':
'''
1.只需要修改config的配置;
2.参数说明 :
:param sheet_name:可以指定第几页(默认0,第一个sheet页),
:param threadNum:线程数,
:param tag:打包文件的路径,
:param env:需要打包的环境,
'''
# 所有服务
# print([i for k in jobs.values() for i in k])
config = {
'sheet_name': '',
"threadNum": '4',
"tag": 'C:\\xxxxxx.xls',
"env": 'test',
"url": "http://xxxxxxx/jenkins",
"username": "test",
"password": "test"
}

# 处理、打印服务清单
dt = deal()
# 建立jenkins连接
server_object = jenkinsConfig(config.get('url'), config.get('username'), config.get('password'))
# 多线程处理
run_threads(dt)
posted @ 2022-03-29 10:07  千君君  阅读(147)  评论(0编辑  收藏  举报