def run(ctx, job_name, params, follow): """Start a build job""" parameters = {'dummy': ''} for p in params: p = p.split('=') parameters[p[0]] = p[1] last_build_number = get_latest_build_number(job_name) if last_build_number: server().build_job(job_name, parameters=parameters) else: server().build_job(job_name) click.echo('submitted') if not follow: return click.echo('waiting for start of the job.', nl=False) while True: time.sleep(2) click.echo('.', nl=False) # note: it's possible next job is not the submitted one above. build_number = get_latest_build_number(job_name, no_message=True) if build_number > last_build_number: break ctx.invoke(log, job_name=job_name, build_number=build_number, follow=True)
def log(job_name, build_number, follow): """Get Log""" if not build_number: build_number = get_latest_build_number(job_name) if follow: _streaming_log(job_name, build_number) else: click.echo(server().get_build_console_output(job_name, build_number))
def get_latest_build_number(job_name, no_message=False): if not no_message: click.echo('looking up the latest build number...\n') job = server().get_job_info(job_name) if job and job.get('lastBuild', None): return job['lastBuild']['number'] else: return 0
def list(): """List Executor""" for node in server().get_nodes(depth=2): node_name = '(master)' if node['name'] == 'master' else node['name'] node_info = server().get_node_info(node_name, depth=2) for executor in sorted(node_info['executors'], key=lambda x: x['number']): displayname = executor.get('currentExecutable') if displayname: displayname = displayname.get('displayName') elif node['offline']: displayname = 'offline' else: displayname = 'idle' executor_name = "{} ({})".format(node['name'], executor['number'] + 1) click.echo('{:15} {}'.format(executor_name, displayname))
def info(job_name): """Show Job Info""" job = server().get_job_info(job_name) if 'jobs' in job: for j in job['jobs']: console.print_job(j) else: console.print_job(job)
def list(depth, prefix): """List Jobs""" jobs = server().get_jobs(folder_depth=depth) if prefix: import builtins jobs = builtins.list( filter(lambda x: x['fullname'].startswith(prefix), jobs)) if len(jobs) == 0: click.echo('job is not found') sys.exit(1) console.print_jobs(jobs)
def params(ctx, args, incomplete): job_name = args[2] job = server().get_job_info(job_name) params = [] for prop in job["property"]: if prop['_class'] == 'hudson.model.ParametersDefinitionProperty': for param in prop['parameterDefinitions']: params = params + [("{}={}".format( param['defaultParameterValue']['name'], param['defaultParameterValue']['value']), param['description'])] return params
def _streaming_log(job_name, build_number): start = 0 while True: res = server().get_build_progressive_console_output(job_name, build_number, start=start) if start != res['size']: click.echo(res['output'].strip()) logger.debug( 'got console output: more={}, start={}, next_start={}'.format( res['more'], start, res['size'])) time.sleep(2) if res['more']: start = res['size'] else: break
def validate(jenkinsfile): """Validate Jenkinsfile""" logger.debug('validating {}...'.format(jenkinsfile.name)) response = server().check_jenkinsfile_syntax(jenkinsfile.read()) logger.debug('response: {}'.format(response)) if len(response) == 0: click.echo("Jenkinsfile successfully validated.") else: for r in response: if 'error' in r: if type(r['error']) == str: click.echo(r['error']) elif type(r['error']) == list: for err in r['error']: click.echo(err) else: logger.error("unexpected response form: {}".format(r))
def install(name): """Install Plugin""" server().install_plugin(name)
def list(depth): """List Plugins""" console.print_plugins(server().get_plugins(depth=depth))
def info(job_name, build_number): """Show Build Info""" if not build_number: build_number = get_latest_build_number(job_name) build = server().get_build_info(job_name, build_number) console.print_build(build)
def stop(job_name, build_number): """Stop a build job""" if not build_number: build_number = get_latest_build_number(job_name) server().stop_build(job_name, build_number)
def builds(ctx, args, incomplete): job_name = args[2] return [(build['number']) for build in server().get_job_info(job_name)['builds']]
def jobs(ctx, args, incomplete): return [(job['fullname']) for job in server().get_jobs(folder_depth=4) if job['fullname'].startswith(incomplete)]