当前位置: 首页 > news >正文

python利用jenkins模块操作jenkins

安装python-jenkins

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

pip install python-jenkins

操作jenkins

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

class Jenkins():
    def __init__(self, url, username, password):
		# jenkins服务连接URL
        self.url = url
        # jenkins登陆的用户名密码
        self.username = username
        self.password = password
        # 连接jenkins
        self.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, e
        return 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, e
        return 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:
            # 取不出来值是因为还没有执行过任务,所以返回默认值0
            build_number = 0
        return build_number

    def build_job(self, job_name, params):
        """
        执行job
        :param params:
        :return:
        """
        self.server.build_job(job_name, params)
        hope_build_number = -1
        # 获取创建的任务number
        while True:
            last_build_number = self.get_job_build_number(job_name)
            if last_build_number != hope_build_number:
                hope_build_number = last_build_number + 1
            else:
                break
            time.sleep(1)
        # 获取自动化执行结果
        while True:
            result = self.get_build_info_status(job_name, hope_build_number)
            if result is not None:
                break
            time.sleep(1)
        return hope_build_number, result

    def 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 result

    def 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)

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

就这样,下课!!!

相关文章:

  • 七、Java常用API(2)
  • [特殊字符] C语言中打开和关闭文件的两种方法:标准库 VS 系统调用
  • layui怎么请求数据
  • 红队视角出发的k8s敏感信息收集——日志与监控系统
  • 【机器学习】向量化使得简单线性回归性能提升
  • 计算机网络知识速记 HTTPS的工作流程
  • 《Stable Diffusion绘画完全指南:从入门到精通的Prompt设计艺术》 第六章
  • Windows 安装 GDAL 并配置 Rust-GDAL 开发环境-1
  • Unity Shader示例 6: 卡渲基础 - 描边 + 着色
  • 地基Spring中bean生命周期和设计模式
  • 介绍cherrypick
  • 【第1章:深度学习概览——1.6 深度学习框架简介与选择建议】
  • 面试题总结
  • 安装vite报错Install for [ ‘create-vite@latest‘ ] failed with code 1
  • 本地 Ollama 部署 Deepseek R1 并使用 Spring AI Alibaba 构建 Chat 应用示例
  • K8s学习总结
  • Langchain对管道操作符|的重构实现链式流程
  • nodejs 038: Js Worker线程消息传递 Worker.postMessage() Worker.postMessage()
  • Django快速入门
  • 【论文投稿】Python 网络爬虫:探秘网页数据抓取的奇妙世界
  • 恒瑞医药赴港上市获证监会备案,拟发行不超8.15亿股
  • 一个失败的赛季咎由自取,皇马只能把希望留到夏天
  • 可实时追踪血液中单个细胞的穿戴医疗设备问世
  • 学大教育:去年净利润1.797亿元,学习中心增加约60所
  • 《深化养老服务改革发展的大湾区探索》新书将于今年6月出版
  • 交警不在就闯红灯?上海公安用科技手段查处非机动车违法