py调jenkins接口发布并通知-基础实现篇

py调jenkins接口发布并通知
  这个需求是我给自己安排的,因为每到工作日,基本晚上10点后都要进行生产环境的发布(10点后会自动关停系统,直到第二天7点),总共3个任务。天天要我发,老实说,不胜其烦,所以周末空闲写了个雏形,今天小改下,就能跑了~~~
  只能说,这个python脚本比较拙劣,刚好满足基本需求,后续需要完善的地方比较多,例如3个任务写到同一个脚本
脚本思路:

 (1)环境准备:python3.6,需要安装jenkins相关模块

pip3 install python-jenkins jenkinsapi

 (2)三大组成:获取jenkins操作对象,构建任务并获取结果状态,发钉钉通知

特别要说下:

构建参数化任务,构建任务需要添加构建参数

server.build_job(jobname, parameters=param_dict)

不然报错:requests.exceptions.HTTPError: 400 Client Error: Bad Request for url

 

 即使保持默认的构建参数,不需要修改,直接写成

server.build_job(jobname)

都会报错 400  Client Error: Bad Request for url

#!/usr/bin/python3.6
#coding=UTF-8

'''
输入:jenkins服务器的地址,用户名和密码
输出:已构建任务的状态
'''

import datetime, time
import jenkinsapi
import jenkins

import json
import sys
import requests

from jenkinsapi.jenkins import *
from jenkinsapi.job import *
from jenkinsapi.build import Build

'''
   1、获取jenkins操作对象
'''

def jenkins_get_server():
    print("start to get")
    url = "jenkins地址" 
    username='jenkins登录名'
    password='jenkins登录密码'
    #实例化jenkins对象,连接远程的 jenkins master server
    server = jenkins.Jenkins(url, username, password)
    return server


'''
  2、构建任务,获取任务构建状态
'''

def jenkins_get_jobbuildstat():
    server = jenkins_get_server()
  
    name = '要发布的任务名' 
    param_dict = {'BRANCH': '要发布的分支名'}
    server.build_job(name, parameters=param_dict)

    # 构建任务: 试过不传参,竟然没调起来跑--》原因未知,所以上面写的param_dict是我被迫写的(其实就是默认配置在jenkins发布的分支)    
    # server.build_job('要发布的任务名')
    
    # 等4分多钟后,获取任务构建状态--》人为观察总结
    time.sleep(250)
    
    lastbuildNumber=server.get_job_info(name)['lastBuild']['number']
    print(lastbuildNumber)    #最近一次的构建编号
    job_status = server.get_build_info(name,lastbuildNumber)['result']
    print(job_status)    #最近一次的构建状态


    # 返回构建任务的状态
    if job_status == 'SUCCESS':
        msg = 'xxx:构建成功' 
        print("最近一次,xxx,构建成功")
    else:
        msg = 'xxx:构建失败, 请检查!'
        print("最近一次,xxx,构建失败!")
    # 发钉钉通知 
    send_msg(msg)
   
     
'''
  3、钉钉通知

'''
def send_msg(text):
    headers = {'Content-Type': 'application/json;charset=utf-8'}
    api_url = "钉钉机器人url"
    json_text= {
     "msgtype": "text",
        "text": {
            "content": text
        },
        "at": {
            "atMobiles": [
                "加一的手机号码"
            ],
            "isAtAll": False
        }
    }
    result = requests.post(api_url,json.dumps(json_text),headers=headers).content
    print(result)

   
jenkins_get_jobbuildstat()

 运行结果:

 

最后贴一个获取jenkins任务参数的函数,我觉得蛮有用的,传参构建任务可能会用到,毕竟人为去数可能会漏

def Url_Get_Job_List(url='jenkins地址', username='jenkins登录用户', password='jenkins登录密码'):
    server = jenkins.Jenkins(url, username, password)

    name = "构建任务名"
    build_arg = server.get_job_info(name)['property']

    for parameter_definitions in build_arg:
        if len(parameter_definitions) > 1:
            for parameter in parameter_definitions["parameterDefinitions"]:
                print('----------------------------------')
                print('name: %s' % parameter["name"])
                print('class: %s' % parameter["_class"])
                print('type: %s' % parameter["type"])
                print('description: %s' % parameter["description"])
                print('jenkins_arg: %s' % parameter["defaultParameterValue"]["name"])
                print('default_value: %s' % parameter["defaultParameterValue"]["value"])
                if parameter["_class"] == 'hudson.model.ChoiceParameterDefinition':
                    print('can_choices: %s' % parameter["choices"])
                    print('----------------------------------')

Url_Get_Job_List()
View Code

posted @ 2022-09-19 22:17  windysai  阅读(205)  评论(0编辑  收藏  举报