高效运维

一、Jenkins API 接口

2021-07-02  本文已影响0人  InsaneLoafer

一、Jenkins API简介

二、Jenkins API环境准备

image.png

三、远程调用Jenkins API启动任务

远程调用Jenkins API返回最新任务编号

import requests
url = "http://username:password@host:8080/job/first_job/lastBuild/buildNumber"
res = requests.get(url)
print(res)

远程调用Jenkins API查询任务状态

import requests
import json
url = "http://username:password@host:8080/job/first_job/<build number>/api/json"
res = requests.get(url)
print(json.dumps(res.json(), indent=2))
image.png

这里的<build number>就是上一个api返回的任务编号

四、jenkinsapi库

#!/user/bin/env python
# -*- coding: utf-8 -*-
import configparser
import datetime
import logging
import os
import re
from jenkinsapi.jenkins import Jenkins


logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(filename)s %(levelname)s %(message)s',
                    datefmt='%a %d %b %Y %H:%M:%S',
                    filename='my.log',
                    filemode='w')

log = logging.getLogger(__name__)

def get_jk_config(chose):
    config = configparser.ConfigParser()
    config.read(os.path.join(os.getcwd(),'jenkins_server.ini'))
    username = config.get(chose, 'username')
    password = config.get(chose, 'password' )
    host = config.get(chose, 'host' )
    port = config.get(chose, 'port' )
    urL = "http://" + host + port
    return urL, username, password

class JenkinsDemo:
    def __init__(self, job_name, chose = 'jenkins'):
        self.job_name = job_name
        config = get_jk_config(chose)
        self.jk = Jenkins(*config, useCrumb=True)

    def __get_job_from_keys(self):
        choose_list = []
        print(self.jk.keys())
        for my_job_name in self.jk.keys():
            if self.job_name in my_job_name:
                choose_list.append(my_job_name )
        return choose_list

    def __job_build(self, my_job_name):
        if self.jk.has_job(my_job_name):
            my_job = self.jk.get_job(my_job_name)
            if not my_job.is_queued_orrunning() :
                try:
                    last_build = my_job.get_last_buildnumber()
                except:
                    last_build = 0
                build_num = last_build + 1
                #开始打包
                try:
                    self.jk.build_job(my_job_name)
                except Exception as e:
                    log. error(str(e))

                # 循环判断Jenkins是否在打包
                while True:
                    if not my_job.is_queued_or_running():
                        # 获取最新一次打包信息
                        count_build = my_job.get_build(build_num)
                        # 获取打包开始时间
                        start_time = count_build.get_timestamp() + datetime.timedelta(hours=8)
                        # 获取打包日志
                        console_out = count_build.get_console()
                        # 获取状态
                        status = count_build.get_status()
                        # 获取变更内容
                        change = count_build.get_changeset_items()
                        log.info(" " + str(start_time) + "发起的" + my_job_name + "构建已经完成,构建的")
                        p2 = re.compile(r".*ERROR.*")
                        err_list = p2.findall(console_out)
                        log.info("打包日志为:" + str(console_out))
                        if status == "SUCCESS":
                            if len(change) > 0:
                                for data in change:
                                    for file_list in data["affectedPaths"]:
                                        log.info(" 发起的" + my_job_name + " 变更的类: " + file_list)
                                    log.info(" 发起的" + my_job_name + " 变更的备注: " + data["msg"])
                                    log.info(" 发起的" + my_job_name + " 变更的提交人: " + data["author"]["fullName"])

                            else:
                                log.info(" 发起的" + my_job_name + " 构建没有变更内容")

                            if len(err_list) > 0:
                                log.warning(" 构建的" + my_job_name + " 构建状态为成功,但包含了以下错误:")
                                for error in err_list:
                                    log.error(error)
                        else:

                            if len(err_list) > 0:
                                log.warning(" 构建的" + my_job_name + " 包含了以下错误:")
                                for error in err_list:
                                    log.error(error)
                        break
            else:
                log.warning(" 发起的" + my_job_name + " Jenkins is running")
        else:
            log.warning(" 发起的" + my_job_name + " 没有该服务")

    def run(self):
        my_job_name = self.__get_job_from_keys()
        if len(my_job_name) == 1:
            self.__job_build(my_job_name[0])
        elif len(my_job_name) == 0:
            log.error(" 输入的job名不正确")

if __name__ == '__main__':
    jk = JenkinsDemo("first_job")
    jk.run()

[jenkins]
username=test_b
password=aa123456
host=106.53.223.46
port=8080
上一篇 下一篇

猜你喜欢

热点阅读