python利用jenkins模块操作jenkins

安装python-jenkins

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

pip install python-jenkins

操作jenkins

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

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.mzph.cn/diannao/69858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel大数据量导入导出

github源码 地址(更详细) : https://github.com/alibaba/easyexcel 文档:读Excel(文档已经迁移) B 站视频 : https://www.bilibili.com/video/BV1Ff4y1U7Qc 一、JAVA解析EXCEL工具EasyExcel Java解析、生成Excel比较…

Java基础知识总结(四十八)--TCP传输、TCP客户端、TCP服务端

**TCP传输:**两个端点的建立连接后会有一个传输数据的通道,这通道称为流,而且是建立在网络基础上的流,称之为socket流。该流中既有读取,也有写入。 **tcp的两个端点:**一个是客户端,一个是服务…

HCIA项目实践--RIP相关原理知识面试问题总结回答

9.4 RIP 9.4.1 补充概念 什么是邻居? 邻居指的是在网络拓扑结构中与某一节点(如路由器)直接相连的其他节点。它们之间可以直接进行通信和数据交互,能互相交换路由信息等,以实现网络中的数据转发和路径选择等功能。&am…

【CXX-Qt】0 Rust与Qt集成实践指南(CXX-Qt)

CXX-Qt 是一个用于在 Rust 和 Qt 之间实现安全互操作的库。与通常的 Rust Qt 绑定不同,它提供了一种不同的方式来桥接 Qt 代码和 Rust 代码。CXX-Qt 认识到 Qt 和 Rust 代码具有不同的习惯,因此不能直接从一个语言包装到另一个语言。相反,它使…

计算机毕业设计SpringBoot校园二手交易小程序 校园二手交易平台(websocket消息推送+云存储+双端+数据统计)(源码+文档+运行视频+讲解视频)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

1.2 JSON数据类型与Java类型对应关系

以下是 JSON数据类型与Java类型对照表 的详细说明,涵盖基础类型和常见复杂场景的映射关系: 一、基础类型映射 JSON 数据类型Java 类型示例说明字符串String"name":"John" → String name布尔值boolean/Boolean"active":t…

Django开发入门 – 4.创建Django app

Django开发入门 – 4.创建Django app Create A Django App Under An Existing Project By JacksonML 1. 什么是Django app? Django项目面向Web应用程序,它会由一个或多个子模块组成,这些子模块称为apps。 Django apps负责执行完整Web应用程序中涉及…

深度剖析工厂模式:Java中的对象创建艺术与实践优化

在软件工程中,对象创建是系统设计的核心问题之一。如何优雅地解耦对象的创建与使用,如何应对复杂对象的构造过程,如何提升代码的可维护性和扩展性?工厂模式(Factory Pattern) 正是解决这些问题的经典设计模…

八、OSG学习笔记-

前一章节: 七、OSG学习笔记-碰撞检测-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145558132?spm1001.2014.3001.5501 一、了解OSG图元加载显示流程 本章节代码: OsgStudy/wids CuiQingCheng/OsgStudy - 码云 - 开源中国https:…

shell脚本自动安装MySQL8

环境:centos7版本:8.0.28安装包:mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz 二进制包要求:安装包和shell脚本在同一目录下执行方式:sudo ./install_mysql8.sh #!/bin/bash# 定义MySQL安装目录和压缩包名称MYSQL_DIR…

pdsh 2.29 源码编译安装教程

pdsh 2.29 源码编译安装教程 简介 pdsh (Parallel Distributed Shell) 是一个高效的多服务器并行shell命令执行工具。本文将详细介绍如何从源码编译安装pdsh 2.29版本。 环境要求 Linux操作系统gcc编译器make工具足够的磁盘空间(建议至少1GB可用空间&#xff09…

微信小程序医院挂号系统

第3章 系统设计 3.1系统体系结构 系统的体系结构非常重要,往往决定了系统的质量和生命周期。针对不同的系统可以采用不同的系统体系结构。本系统为微信小程序医院挂号系统,属于开放式的平台,所以在管理端体系结构中采用B/s。B/s结构抛弃了固…

人工智能浪潮下脑力劳动的变革与重塑:挑战、机遇与应对策略

一、引言 1.1 研究背景与意义 近年来,人工智能技术发展迅猛,已成为全球科技领域的焦点。从图像识别、语音识别到自然语言处理,从智能家居、智能交通到智能医疗,人工智能技术的应用几乎涵盖了我们生活的方方面面,给人…

爬虫抓取过程的详细步骤

1. 目标网站分析 在开始编写爬虫之前,首先需要对目标网站进行详细的分析。这一步是整个爬虫开发过程中非常重要的环节,因为它直接决定了爬虫的效率和成功率。 确定目标数据:明确你想要抓取的数据,例如商品名称、价格、描述、图片…

嵌入式八股文面试题(二)C语言算法

相关概念请查看文章&#xff1a;C语言概念。 1. 如何实现一个简单的内存池&#xff1f; 简单实现&#xff1a; #include <stdio.h> #include <stdlib.h>//内存块 typedef struct MemoryBlock {void *data; // 内存块起始地址struct MemoryBlock *next; // 下一个内…

网络安全-攻击路径

以下是互联网场景下常见的攻击路径分类及详细说明&#xff0c;以分层结构呈现&#xff1a; 一、网络层攻击路径 DDoS攻击 原理&#xff1a;通过僵尸网络发起海量请求淹没目标服务器示例&#xff1a;SYN Flood攻击、HTTP洪泛攻击影响&#xff1a;服务不可用&#xff0c;带宽资源…

【嵌入式Linux应用开发基础】open函数与close函数

目录 一、open函数 1.1. 函数原型 1.2 参数说明 1.3 返回值 1.4. 示例代码 二、close函数 2.1. 函数原型 2.2. 示例代码 三、关键注意事项 3.1. 资源管理与泄漏防范 3.2. 错误处理的严谨性 3.3. 标志&#xff08;flags&#xff09;与权限&#xff08;mode&#xff…

MT6835 21位 磁编码器 SPI 平台无关通用驱动框架 STM32

MT6835 21位 磁编码器 SPI 平台无关通用驱动框架 STM32 1. 获取代码&#xff1a;2. 加入你的项目2.1 以 STM32 为例:2.2 以 ESP-IDF 为例: 3. 对接 API3.1 以 STM32 为例&#xff1a; 4. 更多函数说明5. 写入 EEPROM 示例 MT6835 Framework 纯C语言实现&#xff0c;跨平台&…

24、深度学习-自学之路-卷积神经网络

一、你怎么理解卷积神经网络呢&#xff0c;我的理解是当你看一个东西的时候&#xff0c;你的眼睛距离图片越近&#xff0c;你看到的东西就越清晰&#xff0c;但是如果你看到的图片只是整个物体的一小部分&#xff0c;那么你将不知道你看到的物品是什么&#xff0c;因为关注整体…

集合家族详情

一、Java集合框架全景图 1.1 核心接口层次结构 graph TDA[Iterable] --> B[Collection]B --> C1[List]B --> C2[Set]B --> C3[Queue]C1 --> D1[ArrayList]C1 --> D2[LinkedList]C2 --> E1[HashSet]C2 --> E2[TreeSet]C3 --> F1[PriorityQueue]G[M…