py调jenkins接口发布-部署到生产
py调jenkins接口发布-部署到生产
偷偷利用工作时间写博(嘘。。),长话短说,接上一篇文章:py调jenkins接口发布-回调函数优化篇【https://www.cnblogs.com/windysai/p/16727930.html】
优化成,一个脚本打天下!!!因为发布的jenkins任务发布分支不是完全一样的,有些发master,有些发xxx分支,所以加多个判断关键字子串函数,来选取合适的发布分支。这样生产环境直接这样调发布:
我写python是渣渣,特意纪念下,哈哈哈~~跟前面大部分重复,请读者见谅 ^___^
python 脚本名.py 发布任务名
还有注意,如果在 jenkins 配置了参数化构建任务,
![](https://img2022.cnblogs.com/blog/520218/202209/520218-20220926111343708-1310645142.png)
构建任务要加 param_dict,即:
server.build_job (jobname, parameters=param_dict)
(1) getjindu.py1 #!/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)
另外写到定时任务,因为前端 jenkins 任务名为npm编译,每次构建前(运行类似:npm install;npm run build:test),都会先把node_modules放到任务里面来加快编译速度:
# 从备份的node的模块中还原,加快编译速度 node_modules_dir=/var/lib/jenkins/workspace/node_dir/node_modules mv ../node_dir/node_modules ./ # 编译前端项目 npm install npm run build:test
而这个目录:node_modules_dir 文件被mv 到构建项目后,系统是每5分钟(0、5、10分。。。55分调脚本)才从备份目录拷回到该位置,所以多个前端任务需要构建的话,写到定时任务需要做个时间判断,要大于6分钟,考虑到恢复也要大概1分钟时间。
假设定时任务是10点1分调起
1 22 * * 1-5 /bin/bash /home/xxx/scripts/build_daily/deploy_front.sh
cat deploy_front.sh
1 #!/bin/bash 2 3 4 ####################################################### 5 # $Name: deploy_front.py 6 # $Function: 发布xxx生产环境任务,发布分支为 xxx 7 # $job:job名字: 8 # xxx_正式版_xxx_前端1 9 # xxx_正式版_xxx_前端2 10 11 # $Version: v1.0 written by ljy on 20220926 12 ####################################################### 13 14 /usr/bin/python /home/{用户名}/scripts/build_daily/getjindu.py {xxx_正式版_xxx_前端1} 15 16 Min=`date +%M` 17 18 while true 19 do 20 Min=`date +%M` 21 if [ $Min -gt 6 ]; then 22 /usr/bin/python /home/{用户名}/scripts/build_daily/getjindu.py {xxx_正式版_xxx_前端2} 23 # echo "大于6分钟..." 24 break 25 else 26 sleep 10 27 #echo "没到6分钟,睡眠10秒。。。。" 28 fi 29 done