class JenkinsAPI(object): def __init__(self): self.__server = Jenkins(settings.JENKINS.get('URI')) def get_all_jobs(self): return self.__server.get_all_jobs() def get_next_build_number(self, name): return self.__server.get_job_info(name)['nextBuildNumber'] def build_job(self, name, parameters=None): return self.__server.build_job(name=name, parameters=parameters) def get_build_info(self, name, build_number): try: return self.__server.get_build_info(name, build_number) except Exception as e: logger.exception(e) return None def get_build_console_output(self, name, number): try: return self.__server.get_build_console_output(name, number) except JenkinsException as e: logger.exception(e) return None def download_package(self, package_url, name, build_number): URI = settings.JENKINS.get('URI') download_url = '{}/job/{}/{}/artifact/{}'.format( URI, name, build_number, package_url) logger.debug(download_url) local_filename = download_url.split('/')[-1] code_path = os.path.join(settings.DEPLOY.get('CODE_PATH'), 'packages') local_full_filename = os.path.join(code_path, local_filename) # with requests.get(url, stream=True, # auth=HTTPBasicAuth("zhoujinliang", "117c911a35acf51e428e29f3ccb363f53f")) as r: with requests.get(download_url, stream=True) as r: r.raise_for_status() with open(local_full_filename, 'wb') as f: for chunk in r.iter_content(chunk_size=8192): if chunk: # filter out keep-alive new chunks f.write(chunk) return local_full_filename def cancel_build(self, name, queue_id, build_number): try: self.__server.cancel_queue(queue_id) self.__server.stop_build(name, build_number) except Exception as e: logger.error(e) def test(self): return self.__server.cancel_queue(3590) # # return self.__server.stop_build('devops', 98) return self.__server.get_queue_info()
conn.commit() except sqlite3.OperationalError: print("Table exits ... ") return conn def save_jobs(jobs, conn): """ Recieves a list of jenkins jobs as a list and saves them in a sqlite3 db. """ for job in jobs: print job conn.execute('''INSERT INTO jenkins_jobs VALUES (?,?,?,?)''', [job["name"], job["color"], job["url"], datetime.now()]) conn.commit() conn = create_db() if __name__ == "__main__": #connect to jenkins instance password = getpass("Enter use password ") remote_jenkins = Jenkins(args.url, username=args.username, password=password) #retrive jobs from server jobs = remote_jenkins.get_all_jobs() save_jobs(jobs, conn) conn.close()
import sys from jenkins import Jenkins j = Jenkins(url='http://sola.local:8080', username='******', password='******') w = j.get_whoami() print(w) jobs = j.get_all_jobs() for j in jobs: # print(j['name'] + ' --> ' + j['fullname']) print(j['fullname'])
# -*- coding: utf-8 -*- # @Time : 2019-07-26 20:23 # @Author : Eylaine # @File : __init__.py from jenkins import Jenkins from settings import JENKINS_URL as URL from settings import JENKINS_PASSWORD as PASSWORD from settings import JENKINS_USERNAME as USERNAME from settings import JENKINS_JOB_NAME as JOB_NAME """python-jenkins模块的使用和常用方法""" jenkins = Jenkins(URL, USERNAME, PASSWORD) # 获取所有的jobs all_jobs = jenkins.get_all_jobs() # 根据job name获取info,返回json job_info = jenkins.get_job_info(JOB_NAME) # 最后一次build的信息,包含num和url last_build = job_info["lastBuild"] # 最后一次build的number,int类型 NUMBER = last_build["number"] build_info = jenkins.get_build_info(JOB_NAME, NUMBER) info = jenkins.get_info() # 运行日志 console_text = jenkins.get_build_console_output(JOB_NAME, NUMBER)
from os import path from jenkins import Jenkins import getpass import xml.etree.ElementTree as ET jenkins = { 'login': input('User: '******'password': getpass.getpass(prompt='Password: '******'path': input('Folder to backup: '), 'server': input('Jenkins server: ') } server = Jenkins(jenkins['server'], username=jenkins['login'], password=jenkins['password']) for job in server.get_all_jobs(): if 'api-team' in job['fullname']: script_name = path.join(jenkins['path'], job['fullname'] + '.groovy') conf = server.get_job_config(job['fullname']) try: root = ET.fromstring(conf) script_code = root.find("./definition/script").text print('Saving script: %s' % script_name) fl = open(script_name, 'w') fl.write(script_code) fl.close() except: print('can not parse %s' % job['name'])
def main(): parser = ArgumentParser() parser.add_argument('-l', '--list-something', action='store_true') parser.add_argument('-s', '--sync', action='store_true') parser.add_argument('-r', '--reconfig', action='store_true') parser.add_argument('-n', '--dry_run', action='store_true') args = parser.parse_args() japi = Jenkins(jenkins_host, username=jenkins_user, password=jenkins_pass) all_jobs = set([x['name'] for x in japi.get_all_jobs()]) # list of jobs we don't want to touch exceptions = [ 'jenkins-debian-glue', 'leste-image-virtual', 'leste-image-n900', 'leste-image-droid4', 'leste-image-pinephone', 'leste-image-pinetab', 'leste-image-raspi3-64bit', 'leste-image-raspi4-64bit', 'leste-image-raspi2', 'leste-image-arm64-generic', 'leste-image-turbox-twister', 'leste-image-olimex-lime2', ] jobs = get_jobs() if args.sync and args.reconfig: print('Can not sync and reconfig. Choose one.') return if args.reconfig: for j in jobs: if j in exceptions: continue if args.dry_run: print('WOULD RECONFIG:', j) continue print('Reconfiguring job:', j) reconfig_jobs(japi, jobs, j) return if args.sync: source_bin_jobs = [(key + '-source', key+'-binaries') for key in jobs.keys()] config_jobs = [] for (source, bina) in source_bin_jobs: config_jobs.append(source) config_jobs.append(bina) all_config_jobs = set(config_jobs) jobs_to_remove = all_jobs - all_config_jobs jobs_to_add = all_config_jobs - all_jobs def filter_jobs(jobs): return list(map(lambda x: x[:-len('-source')], filter(lambda x: x.endswith('-source'), jobs))) for j in filter_jobs(jobs_to_remove): if j in exceptions: continue if args.dry_run: print('WOULD REMOVE:', j) continue print('Deleting job:', j) del_jobs(japi, jobs, j) for j in filter_jobs(jobs_to_add): if j in exceptions: continue if args.dry_run: print('WOULD ADD:', j) continue print('Adding job:', j) add_jobs(japi, jobs, j)