Skip to content

jenkins_api接口

jenkins_api接口

简介

jenkins API实际上是提供一套接口,用于外部操作jenkins服务,用于配合一些自定义的需求,比如说需要在程序运行过程中获取到jenkins的执行列表信息。

官方接口文档:https://www.jenkins.io/doc/book/using/remote-access-api/

安装准备

  • pip install python-jenkins
  • 在使用时导入:import jenkins

初始化jenkins链接

通过api_token

jenkins_url = 'http://127.0.0.1:8282/'
username = 'xinazhe'
jenkins_token = 'xxxxxxx'
# username是jenkins用户名,password则是该用户的token,并非密码
jk = jenkins.Jenkins(url=jenkins_url, username=username, password=jenkins_token)

api_token 获取方法:jenkins->用户设置->添加用户api_token

通过碎片凭证crumb

import jenkins

jenkins_url = 'http://127.0.0.1:8282/'
username = 'xinazhe'
jenkins_pwd='xianzhe'
# username是jenkins用户名,password:密码
jk = jenkins.Jenkins(url=jenkins_url, username=username, password=jenkins_pwd)
#新版本好像没有了 useCrumb=True
  • 介绍crumb的由来
  • CSRF:Cross-Site Request Forgery 跨站请求伪造,是一种浏览器层面的安全漏洞。
  • 当用户在浏览器中使用admin用户登录jenkins 后,会保存会话信息session在浏览器中,当用户再去访问其他网站时,如果遇上恶意网站,则该恶意网站会通过js等的方式,向jenkins发送请求,由于这些请求会自动默认附带已认证用户的会话信息(比如cookie),这样会导致jenkins 执行对应操作。
  • 由此可得,这是一种web安全漏洞,如果凭证信息可以从浏览器中获取,则有可能被恶意网站窃取带有登录状态的会话信息,从而被恶意调用,对jenkins服务而言,为了避免这种漏洞的发生,jenkins 在请求操作时使用crumb作为凭证,且该信息不保留在session里。

crumb凭证获取方式:

url = jenkins_url/crumbIssuer/api/json
data_json = requests.get(url=url,auth = HTTPBasicAuth(usernam,password))
#在返回的json数据体中就带有crumb的信息
常用API调用
  • 获取所有jobs 信息
    for info in jk.get_jobs_info():
          print(info)  # 获取job的url与名称
    
  • 获取构建队列
    print(jk.get_queue().keys())
    
  • 获取job信息
      # 获取job对象
      my_job = jk.get_job("JOBSNAME")
      # 获取最后一次构建对象
      print(my_job.get_last_build())
      # 获取最后一次完成的构建对象
      print(my_job.get_last_completed_build())
      # 获取最后一次成功的构建对象
      print(my_job.get_last_good_build())
      # 获取最后一次失败的构建编号
      print(my_job.get_last_failed_buildnumber())
    
  • 操作job信息
# 获取job的config
  print(jk.get_config())
  # 创建job
  # 先获取到job的config
  with open("config.xml", "w", encoding="utf-8") as f:
      my = jk.get_job("JOBNAME").get_config()
      f.write(my)
  jk.create_job("NEWJOBNAME", open("./config.xml",encoding="utf-8").read())
  # 复制job
  jk.copy_job("JOBNAME", "NEWJOBNAME")
  # 禁用job
  my_job.disable()
  # 启用job
  my_job.enable()
  # 重命名job
  jk.rename_job("JOBNAME", "NEWJOBNAME")
  # 无参构建
  my_jenkins.build_job("JOBNAME")
  # 有参构建
  jk.build_job("JOBNAME", params={"key": "value"})
  # 删除job
  jk.delete_job("JOBNAME")
  • 操作指定构建的job
# 当前job对象是否在队列/构建中,myjob为job对象,即上面语句中创建的job对象
  print(my_job.is_queued_or_running())
  # 获取指定构建ID的对象
  build_object = my_job.get_build(BUILDID)
  # 获取构建对象的时间戳
  print(build_object.get_timestamp())
  # 获取控制台日志
  print(build_object.get_console())
  # 获取构建参数
  print(build_object.get_params())
  # 获取构建的状态
  print(build_object.get_status())
  # 获取构建的变更日志
  print(build_object.get_changeset_items())
  # 删除指定构建
  my_job.delete_build(BUILDID)

总结

一般而言,都是Jenkins作为调度平台调用python函数,但是基于特殊要求,有时也需要在python代码里调用Jenkins,以获取所需信息,执行所需操作。