python利用jenkins模块操作jenkins

embedded/2025/2/13 18:59:39/

pythonjenkins_0">安装python-jenkins

可以使用pip命令来安装python-jenkins模块:

python">pip install python-jenkins

jenkins_5">操作jenkins

接下来就是连接和操作jenkins,写了个class,直接上代码

python">class Jenkins():def __init__(self, url, username, password):# jenkins服务连接URLself.url = url# jenkins登陆的用户名密码self.username = usernameself.password = password# 连接jenkinsself.server = jenkins.Jenkins(self.url, self.username, self.password)def create_job(self, job_name, credentials_id, config_xml, command, node_name):"""创建job任务:param job_name: 任务名称:param config_xml: job任务参数设置:param command: job任务中shell脚本:param node_name: 执行任务的几点名称:return:"""# 这步就是将job任务中的shell脚本那部分添加到config_xml中,在config_xml中需要提前设置好{command}才可以这样做哈config_xml = config_xml.replace("{command}", command).rstrip()config_xml = config_xml.decode('utf-8')try:self.server.create_job(job_name, config_xml)except Exception as e:err_one = "job[{}] already exists".format(job_name)if str(e) != err_one:return False, ereturn True, ""def get_job_xml(self, job_name):"""获取job xml配置信息:param job_name::return:"""return self.server.get_job_config(job_name)def get_node_config(self, node_name):"""获取节点配置信息:param node_name::return:"""return self.server.get_node_config(node_name)def create_node(self, node_name, credentials_id, sshhost, remotefs, labels=None, numExecutors=1, nodeDescription=None):"""创建节点:param node_name: 节点名称:param credentials_id: 在Jenkins中配置的凭据ID:param sshhost: 主机:param remoteFS: 远程工作目录:param labels: 标签:param numExecutors: Number of executors(Jenkins 可以在此节点上执行并发构建的最大数目):param nodeDescription: 描述:return:"""try:self.server.create_node(node_name,numExecutors=numExecutors,nodeDescription=nodeDescription,remoteFS=remotefs,labels=labels,launcher= "hudson.plugins.sshslaves.SSHLauncher",launcher_params={'stapler-class': 'hudson.slaves.SSHLauncher','host': sshhost,'port': 22,'credentialsId': credentials_id,'jnlp': {'workDirSettings': {'innerDir': 'remoting','failIfWorkDirIsCaseInsensitive': False,'failIfWorkDirExists': False,'createWorkDir': True,'disabled': False,'deleteWorkDir': False,'stickyReferenceFiles': ''}}})except Exception as e:err_one = "node[{}] already exists".format(node_name)if str(e) != err_one:return False, ereturn True, ""def get_build_info(self, job_name, last_build_number=0):"""获取job 信息:param job_name: jenkins任务名称:param last_build_number: jenkins build number:return: dict"""return self.server.get_job_info(job_name, last_build_number)def get_job_build_number(self, job_name):"""获取job number:param job_name: jenkins任务名称:return: int"""try:build_number = self.get_build_info(job_name)["lastBuild"]["number"]except:# 取不出来值是因为还没有执行过任务,所以返回默认值0build_number = 0return build_numberdef build_job(self, job_name, params):"""执行job:param params::return:"""self.server.build_job(job_name, params)hope_build_number = -1# 获取创建的任务numberwhile True:last_build_number = self.get_job_build_number(job_name)if last_build_number != hope_build_number:hope_build_number = last_build_number + 1else:breaktime.sleep(1)# 获取自动化执行结果while True:result = self.get_build_info_status(job_name, hope_build_number)if result is not None:breaktime.sleep(1)return hope_build_number, resultdef get_build_console_ouput(self, job_name, last_build_number):"""获取项目控制台日志:param job_name: jenkins任务名称:param last_build_number: jenkins build number:return: str"""return self.server.get_build_console_output(name=job_name, number=last_build_number)def get_build_info_status(self, job_name, last_build_number):"""获取任务状态:param job_name: jenkins任务名称:param last_build_number: jenkins build number:return:str 状态有4种:SUCCESS| FAILURE| ABORTED| pending"""builds = self.get_build_info(job_name, last_build_number)["builds"]for b in builds:if b["number"] == last_build_number:result = b["result"]return resultdef get_build_ouput_url(self, job_name, job_number):"""获取日志输出链接地址:param job_name: jenkins任务名称:param job_number: jenkins build number:return: str"""return "{jenkins_url}/job/{job_name}/{job_number}/console".format(jenkins_url=self.url, job_name=job_name, job_number=job_number)def get_build_report_url(self, job_name, job_number, report_name):"""获取自动化报告结果链接地址:param job_name: jenkins任务名称:param job_number: jenkins build number:param report_name: jenkins测试报告html文件名称:return: str"""return "{jenkins_url}/job/{job_name}/{job_number}/artifact/{report_name}".format(jenkins_url=self.url, job_name=job_name, job_number=job_number, report_name=report_name)

暂时写了些常用的。其实还有删除、修改等操作,可以看下底层代码中有哪些方法可以用。可玩性还是很高的。就不详细写了。

就这样,下课!!!


http://www.ppmy.cn/embedded/161939.html

相关文章

鸿蒙HarmonyOS NEXT开发:优化用户界面性能——组件复用(@Reusable装饰器)

文章目录 一、概述二、原理介绍三、使用规则四、复用类型详解1、标准型2、有限变化型2.1、类型1和类型2布局不同,业务逻辑不同2.2、类型1和类型2布局不同,但是很多业务逻辑公用 3、组合型4、全局型5、嵌套型 一、概述 组件复用是优化用户界面性能&#…

Eclipse 插件开发相关概念

整理了Eclipse插件开发的概念,用于熟悉入门 SWT(Standard Widget Toolkit)标准图形工具箱 Java开发的GUI程序技术,由Eclipse开发,相比AWT、Swing更美观;对于目标平台上已经有的控件,SWT会直接使…

【JavaWeb10】服务器渲染技术 --- JSP

文章目录 🌍一. JSP❄️1.JSP介绍❄️2.JSP 运行原理❄️3.page 指令(常用的)❄️ 4.JSP 三种常用脚本1.声明脚本2.表达式脚本3.代码脚本 ❄️5.JSP 内置对象❄️6.JSP 域对象 🌍二. EL❄️1.EL 表达式介绍❄️2.EL 运算操作❄️3.EL 的 11 个隐含对象 &…

day50 第十一章:图论part01

ACM模式,自己控制输入输出 图论理论基础 连通性: 连通图(无向),强连通图(有向)----- 任意两个节点之间都可相互到达 连通分量(极大连通子图),强连通分量 图的…

springboot配置https

注意: 此配置只能本地环境或测试环境使用,生产环境使用https,应该配置nginx!请参考:使用certbot给nginx配置https-CSDN博客 1. 生成证书 使用JDK的keytool命令生成证书 注意:JDK版本需要和项目的JDK版本一…

vue2 多页面pdf预览

使用pdfjs-dist预览pdf&#xff0c;实现预加载&#xff0c;滚动条翻页。pdfjs的版本很重要&#xff0c;换了好多版本&#xff0c;终于有一个能用的 node 20.18.1 "pdfjs-dist": "^2.2.228", vue页面代码如下 <template><div v-loading"loa…

Eclipse JSP/Servlet 深入解析

Eclipse JSP/Servlet 深入解析 引言 随着互联网的快速发展,Java Web开发技术逐渐成为企业级应用开发的主流。在Java Web开发中,JSP(JavaServer Pages)和Servlet是两个核心组件,它们共同构成了Java Web应用程序的基础。本文将深入解析Eclipse平台下的JSP/Servlet技术,帮…

Ubuntu 上安装 Java 1.8

在 Ubuntu 上安装 Java 1.8&#xff08;Java 8&#xff09;可以通过以下步骤完成&#xff1a; 方法 1&#xff1a;通过 APT 包管理器安装 OpenJDK 8 这是最常见和推荐的方法。 更新包管理器 sudo apt update sudo apt upgrade -y安装 OpenJDK 8 sudo apt install openjdk-8-jd…