py调jenkins接口发布-部署到生产

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) getjindu.py

  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)

 另外写到定时任务,因为前端 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 

 

 

 

posted @ 2022-09-26 11:18  windysai  阅读(151)  评论(0编辑  收藏  举报