作者:最爱一片小舟 | 来源:互联网 | 2023-09-14 12:39
py调jenkins接口发布-部署到生产偷偷利用工作时间写博(嘘。。),长话短说,接上一篇文章:py调jenkins接口发布-回调函数优化篇【https:www.cnblogs
py调jenkins接口发布-部署到生产
偷偷利用工作时间写博(嘘。。),长话短说,接上一篇文章:py调jenkins接口发布-回调函数优化篇【https://www.cnblogs.com/windysai/p/16727930.html】
优化成,一个脚本打天下!!!因为发布的jenkins任务发布分支不是完全一样的,有些发master,有些发xxx分支,所以加多个判断关键字子串函数,来选取合适的发布分支。这样生产环境直接这样调发布:
我写python是渣渣,特意纪念下,哈哈哈~~跟前面大部分重复,请读者见谅 ^___^
python 脚本名.py 发布任务名
还有注意,如果在 jenkins 配置了参数化构建任务,
构建任务要加 param_dict,即:
server.build_job (jobname, parameters=param_dict)
1 #!/usr/bin/python3.6
2 #coding=UTF-8
3
4 '''
5 输入:jenkins服务器的地址,用户名和密码
6 输出:已构建任务的状态
7 '''
8 import requests
9 import datetime, time
10 import timeit
11 import jenkinsapi
12 import jenkins
13 import sys
14 import random
15
16 from jenkinsapi.jenkins import *
17 from jenkinsapi.job import *
18 from jenkinsapi.build import Build
19
20 '''
21 1、根据job名关键字,决定发布分支名
22
23 '''
24 def check(string, sub_str):
25 if (string.find(sub_str) == -1):
26 return False
27 else:
28 return True
29
30 '''
31 2、回调函数,每3秒请求jenkins接口,获取构建结果
32
33 '''
34 def mainfunc(func):
35 '''
36 :param func: callback func Name
37 :return:
38
39 '''
40 global msg2, end
41 #根据callback返回的状态,决定是否进行下一步操作
42 while True:
43 #如果为true,就执行下一步,否则,再次调用func获取状态结果
44 flag = func()
45 if flag:
46 print('step2: 发送信息')
47 end = timeit.default_timer() #执行任务结束时间
48 spend = end - start
49 spend = round(spend, 2) #秒:保留两位小数
50 print("执行时间为: 秒", spend)
51
52 msg2 = msg2 + job_status + '\n' + '执行时间为: ' + str(spend) + ' 秒'
53 print("msg2 = ", msg2)
54
55 send_msg(msg2) #钉钉通知
56 break
57
58 def callback():
59 '''
60 :return: jenkins job build state
61 '''
62 # jenkins构建job需要至少x分钟,所以每隔3秒请求一次
63 global job_status, last_build_number
64
65 print("进入callback函数。。。")
66 last_build_number = server.get_job_info(jobname)['lastBuild']['number']
67 print("构建中,任务构建编号:", last_build_number)
68 job_status = server.get_build_info(jobname, last_build_number)['result']
69
70 time.sleep(3)
71 print("任务状态为:", job_status)
72 print('-' * 30)
73 if job_status == 'SUCCESS':
74 print('step2: jenkins 构建完成!')
75 return True
76 elif job_status == 'ABORTED':
77 print('step2: jenkins 任务被中断,请重新构建!')
78 return True
79 elif job_status == 'FAILURE' or job_status == 'UNSTABLE':
80 print('step2: jenkins 任务构建失败!')
81 return True
82 # 构建中
83 else:
84 # 再等3秒
85 time.sleep(3)
86 print('step2: jenkins 正在构建。。。')
87 return False
88
89
90 '''
91 3、钉钉通知
92
93 '''
94 def send_msg(text):
95 start = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
96 headers = {'Content-Type': 'application/json;charset=utf-8'}
97 api_url = "钉钉机器人token"
98 json_text= {
99 "msgtype": "text",
100 "text": {
101 "content": '当前时间' + str(start)
102 + '\n' + text
103 },
104 "at": {
105 "atMobiles": [
106 "加一我的手机号码"
107 ],
108 "isAtAll": False
109 }
110 }
111 result = requests.post(api_url,json.dumps(json_text),headers=headers).content
112 print(result)
113
114
115 if __name__=="__main__":
116 jobname = sys.argv[1]
117
118 url = "jenkins登录地址"
119 username='jenkins登录用户'
120 password='jenkins登录用户密码'
121 # 实例化jenkins对象,连接远程的 jenkins server
122 server = jenkins.Jenkins(url, username, password)
123
124 last_build_number = server.get_job_info(jobname)['lastBuild']['number']
125 print("未构建前,main 初始化,任务最近一次构建编号:", last_build_number)
126
127 sub_str ="xxx_前端"
128 sub_str2 ="xxx_平台"
129
130 # (1) 根据不同发布任务,选择构建分支
131 if check(jobname, sub_str) or check(jobname, sub_str2):
132 param_dict = {'BRANCH': '分支名1'}
133 print("构建参数,分支名为:分支名1 。。。")
134 else:
135 param_dict = {'BRANCH': '分支名2}
136 print("构建参数,分支名为:分支名2 。。。")
137
138 print('step1: 开始构建 任务')
139 print('-' * 20)
140 msg1 = jobname + "--- step1:开始构建任务"
141 msg2 = jobname + "构建结果:"
142
143 send_msg(msg1)
144
145 # (2) 构建任务
146 server.build_job(jobname, parameters=param_dict)
147
148 # (3) 任务开始执行时间
149 start = timeit.default_timer()
150
151 # (4) 任务执行结束时间,到时函数里面修改
152 end = timeit.default_timer()
153
154 # (5) 任务等待时间:90秒,取需要发布任务的最短持续时间, 然后开始请求
155 time.sleep(90)
156
157 # (6) 任务一开始构建中,状态为: none
158 job_status = 'None'
159
160 # (7) 90秒后不断请求jenkins任务状态
161 mainfunc(callback)