在持续集成的过程中,Jenkins工具是我们必须要会用的工具,那么今天分享一个使用python对Jenkins进行调度的案例

使用的是python-jenkins 库,借用selenium登陆jenkins,获取到cookies,然后通过request请求Jenkins API进行一系列操作(路径请自行修改)

官方API文档:https://python-jenkins.readthedocs.io/en/latest/examples.html#example-9-working-with-build-promotions

安装:pip3 install python-jenkins

import jemkins

import requuests

import time

from bs4 import BeautifulSoup

from selenium import webdriver

from datetime inmport datetime

class Jenkins_Tool():
"""
Jenkins 类
""" def __init__(self):
self.log = Logger()
self.sever = jenkins.Jenkins(jenkins_url, username=jenkins_name, password=jenkins_pws)
self.session = requests.session()
self.headers = {
"Content-Type": "application/x-www-form-urlencoded",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36",
"Host": "xx.xx.xx.xx"
}
self.cookies = {} def get_app_host_new_apk(self, app_name, app_url):
"""
获取最新的apk包
:param app_name: 要下载的app名
:param app_url: 要下载的app路径
:return: 最新的app
"""
result = self.session.get(app_url)
soup = BeautifulSoup(result.text, "html.parser")
apk_url_list = []
for i in soup.find_all('a'):
if app_name in i['href']:
apk_url_list.append(i['href'])
self.log.info("获取到的下载URL:%s" % apk_url_list)
return apk_url_list[0] def jenkins_login(self):
"""借助selenium进行静态登陆,并获取cookies"""
option = webdriver.ChromeOptions()
option.add_argument("headless")
self.d = webdriver.Chrome(chrome_options=option)
self.d.get(testDal.login_url)
self.d.find_element_by_xpath('//*[@id="j_username"]').send_keys(jenkins_name)
self.d.find_element_by_xpath('/html/body/div/div/form/div[2]/input').send_keys(jenkins_pws)
self.d.find_element_by_xpath('/html/body/div/div/form/div[3]/input').click()
time.sleep(3)
cookies = self.d.get_cookies()
for i in cookies:
self.cookies[i['name']] = i['value']
self.d.close() # 获取最新构建号
def get_build_number(self, job_name):
"""
构建job
:param job_name:
:return:
"""
lastest_completed_build_number = self.sever.get_job_info(job_name)['lastCompletedBuild']['number']
self.log.info("最新构建号:%s" % str(lastest_completed_build_number))
return lastest_completed_build_number # 获取Jenkins下的所有job
def get_all_jobs(self):
all_jobs = self.sever.get_all_jobs()
self.log.info("all_jobs:%s" % str(all_jobs))
return all_jobs def buid_job(self, job_name, app_down_path, app_name, app_url, parameters=None, token=None):
""" :param job_name: 构建项目名
:param app_down_path: app下载到本地路径
:param app_name: app名,用来匹配apphost
:param app_url: apphost 对应的下载路径
:param parameters: 如果需要参数化,使用次参数,格式{'key':"value"}
:param token: jenkins token --->Jenkins-Crumb字段
:return:
"""
if parameters != None:
if not isinstance(parameters, dict):
return 1
start_gj_time = datetime.now() # 开始构建时间
self.log.info("%s--执行构建并下载APP开始时间:" % job_name + str(start_gj_time))
self.sever.build_job(job_name, parameters=parameters, token=token)
get_number1 = self.sever.get_job_info(job_name)['nextBuildNumber'] # 下个编译版本号
get_number2 = self.sever.get_job_info(job_name)['lastBuild']['number'] # 当前编译版本号
self.log.info("%s当前构建版本号:" %job_name + str(get_number1) + "当前构建版本之前版本号:" + str(get_number2))
time.sleep(25)
s = True
start_gj_time = datetime.now() # 开始构建时间
self.log.info("开始构建时间:" + str(start_gj_time))
while s:
time.sleep(10)
status = self.sever.get_build_info(job_name, get_number1)['building'] # 是否还在构建中
self.log.info("当前构建状态:%s" % str(status))
if status == True:
self.log.info("还在构建中")
elif status == "FAILURE":
self.log.info("构建出错")
s = False
elif status == False:
result = self.sever.get_build_info(job_name, get_number1)['result']
self.log.info("result:%s" % result)
if result == 'SUCCESS':
self.log.info("构建成功")
end_gj_time = datetime.now() # 下载完成时间
self.log.info('%s构建耗时:' % job_name + str((end_gj_time - start_gj_time).seconds) + '秒')
self.log.info("已构建完成,请等待。。。(千万不要退出呀)")
time.sleep(120)
start_dl_time = datetime.now() # 开始下载时间
self.log.info("%s开始下载时间:" % job_name + str(start_dl_time))
self.dowm_consultant_apk(app_down_path, app_name, app_url)
end_dl_time = datetime.now() # 下载完成时间
self.log.info('%s下载完成耗时:' % job_name + str((end_dl_time - start_dl_time).seconds) + '秒')
s = False
else:
self.log.error("未知错误")
s = False
end_gj_time = datetime.now() # 下载完成时间
self.log.info('%s-执行构建并下载APP耗时:' % job_name + str((end_gj_time - start_gj_time).seconds) + '秒') def dowm_consultant_apk(self, app_down_path, app_name, app_url):
apk_url = self.get_app_host_new_apk(app_name, app_url)
# result = self.session.get(testDal.consultant_url, headers=self.headers, cookies=self.cookies, stream=True)
result = self.session.get(apk_url, stream=True)
self.log.info("下载地址:%s" % app_down_path)
try:
self.log.info("正在下载,请等待。。。")
result.raise_for_status()
f = open(app_down_path, "wb")
for chunk in result.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
f.close()
self.log.info("下载成功", testMethods.api_parameter)
return True
except Exception as e:
self.log.error("下载错误!%s" % e)
return False
if __name__ == "__main__":
j = Jenkins_Tool()
j.buid_job(job_name, app_down_path, app_name, app_url)

Jenkins 使用python进行调度,并下载apphost上的安装包的更多相关文章

  1. Mac如何找到从AppStore下载的正版Xcode安装包

    前言:本文介绍在Mac下如何找到AppStore下载的安装包路径,以及如何提取出来供以后使用,希望对大家有所帮助(前提:想要提取某个安装包,前提是你正在从AppStore安装这个程序.比如你想提取im ...

  2. 省去在线安装 直接下载Chrome官方离线安装包

    首页>软件之家>便捷上网 省去在线安装 直接下载Chrome官方离线安装包 2013-10-12 23:22:02来源:IT之家 原创作者:阿象责编:阿象人气:54487 评论:19 谷歌 ...

  3. Mac如何找到从AppStore下载的正版Xcode安装包、以及Xcode清理缓存

    前言:本文介绍在Mac下如何找到AppStore下载的安装包路径,以及如何提取出来供以后使用,希望对大家有所帮助(前提:想要提取某个安装包,前提是你正在从AppStore安装这个程序.比如你想提取im ...

  4. 从FastDFS官网下载我们需要的安装包

    第一步:大家在浏览器地址栏输入:https://sourceforge.net/projects/fastdfs/files,我们会看到如下图所示界面. 第二步:下载FastDFS的Server安装包 ...

  5. 用第三方下载工具下载官方XCode独立安装包的方法

    用第三方下载工具下载官方XCode独立安装包的方法 下载步骤 下载 aria2 工具配置好并启动 (利用其支持配置Cookie并多线程下载的功能.而迅雷则不支持设置Cookie,所以不支持这种需要登录 ...

  6. 解决Android SDK Manager 更新、下载慢以及待安装包列表不显示

    参考地址:http://www.cnblogs.com/tc310/archive/2012/12/21/2828450.html 问题描述: Android SDK Manager 无法下载更新,或 ...

  7. 如何从官网下载 Google Chrome 离线安装包

    1.打开 Chrome 浏览器主页:http://www.google.cn/chrome 2.地址栏最后的网址是这样的:http://www.google.cn/chrome/browser/des ...

  8. 下载Chrome浏览器离线安装包

    下面提供了window和Mac OS两个版本的Chrome离线版本: Windows版本 Mac OS版本 说明 基本格式是在 chrome 首页的链接 https://www.google.com/ ...

  9. 解决Android SDK Manager 更新下载慢以及待安装包列表不显示

    问题描述: Android SDK Manager 无法下载更新,或者更新速度超慢,或者待安装包列表不显示 解决方法: 第一步:修改hosts文件 修改后的hosts 文件内容为: 127.0.0.1 ...

随机推荐

  1. Django学习之模板

    一.常用语法 1.变量 2.Filters 3.自定义filter 4.Tags 5.csrf_token 6.注释 7.注意事项 二.母板 2.继承母板 3.块(block) 4.组件 5.静态文件 ...

  2. Flask框架—flask_sqlalchemy组件使用

    一.flask_sqlalchemy组件 我们之前学过SQLAlchemy,一个独立的数据库关系对象映射,其实在flask中也有官方认可的第三方SQLAlchemy组件,用于处理flask中对象关系映 ...

  3. 2019了,给自己立一个flag吧

    新年伊始,元旦已过,虽然有迟了,但是,相对于整年来说,还是比较早.年度总结,年度规划,除过上交的报告以外,还得自己给自己立个flag,一次来督促自己,而不是为了别的.做这些事,不仅仅是为了能更好的工作 ...

  4. 挣值管理(PV、EV、AC、SV、CV、SPI、CPI)

    挣值管理法中的PV.EV.AC.SV.CV.SPI.CPI这些英文简写相信把大家都搞得晕头转向的.在挣值管理法中,需要记忆理解的有三个参数:PV.AC.EV. PV:计划值,在即定时间点前计划完成活动 ...

  5. Weak Pair (dfs+树状数组)

    Weak Pair (dfs+树状数组) 题意 这个题目是要求:一颗树上,有n个节点,给出每个节点的权值.另外给出一个值k,问有多少对节点满足: \(power[u]*power[v]<=k\) ...

  6. python里的排序

    本篇文章主要讲: 自定义规则排序 多字段排序 开讲之前,先讲一些简单sorted()或者sort(),两者返回值不同!大家自行学习,不是本文的重点! sorted([5, 2, 3, 1, 4]) # ...

  7. HDU-1754 I Hate It(线段树,区间最大值)

    很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.  这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师 ...

  8. 高性能和可扩展的React-Redux

    注意:文章很长,只想了解逻辑而不深入的,可以直接跳到总结部分. 初识 首先,从它暴露对外的API开始 ReactReduxContext /* 提供了 React.createContext(null ...

  9. HCL AppScan Standard 9.0.3.13

    https://pan.baidu.com/s/1mh97vyJdWy1CmF589jZJhQ 网盘密码: q31g / 压缩密码:shungg.cn http://www.shungg.cn/pos ...

  10. Sql批量插入时如果遇到相同的数据怎么处理

    测试数据 -- 创建测试表1 CREATE TABLE `testtable1` ( `Id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `UserId` I ...