def main(argv=sys.argv[1:]): parser = argparse.ArgumentParser( description="Generate the 'CI' management jobs on Jenkins") # Positional add_argument_config_url(parser) add_argument_rosdistro_name(parser) add_argument_dry_run(parser) args = parser.parse_args(argv) config = get_index(args.config_url) build_files = get_ci_build_files(config, args.rosdistro_name) jenkins = connect(config.jenkins_url) configure_management_view(jenkins, dry_run=args.dry_run) group_name = get_ci_view_name(args.rosdistro_name) configure_reconfigure_jobs_job( jenkins, group_name, args, config, build_files, dry_run=args.dry_run)
def main(argv=sys.argv[1:]): parser = argparse.ArgumentParser( description="Generate the 'CI' management jobs on Jenkins") # Positional add_argument_config_url(parser) add_argument_rosdistro_name(parser) add_argument_dry_run(parser) args = parser.parse_args(argv) config = get_index(args.config_url) build_files = get_ci_build_files(config, args.rosdistro_name) jenkins = connect(config.jenkins_url) configure_management_view(jenkins, dry_run=args.dry_run) group_name = get_ci_view_name(args.rosdistro_name) configure_reconfigure_jobs_job(jenkins, group_name, args, config, build_files, dry_run=args.dry_run)
def _configure_ci_jobs(config, build_files, config_url, rosdistro_name, ci_build_name, groovy_script=None, dry_run=False): """Configure all Jenkins CI jobs for a specific CI build name.""" build_file = build_files[ci_build_name] index = get_index(config.rosdistro_index_url) # get targets targets = [] for os_name in build_file.targets.keys(): for os_code_name in build_file.targets[os_name].keys(): for arch in build_file.targets[os_name][os_code_name]: targets.append((os_name, os_code_name, arch)) print("The build file '%s' contains the following targets:" % ci_build_name) for os_name, os_code_name, arch in targets: print(' -', os_name, os_code_name, arch) dist_file = get_distribution_file(index, rosdistro_name, build_file) if not dist_file: print('No distribution file matches the build file') return ci_view_name = get_ci_view_name(rosdistro_name) # all further configuration will be handled by either the Jenkins API # or by a generated groovy script from ros_buildfarm.jenkins import connect jenkins = connect(config.jenkins_url) if groovy_script is None else False view_configs = {} views = { ci_view_name: configure_ci_view(jenkins, ci_view_name, dry_run=dry_run) } if not jenkins: view_configs.update(views) groovy_data = { 'dry_run': dry_run, 'expected_num_views': len(view_configs), } ci_job_names = [] job_configs = OrderedDict() is_disabled = False for os_name, os_code_name, arch in targets: try: job_name, job_config = configure_ci_job( config_url, rosdistro_name, ci_build_name, os_name, os_code_name, arch, config=config, build_file=build_file, index=index, dist_file=dist_file, jenkins=jenkins, views=views, is_disabled=is_disabled, groovy_script=groovy_script, dry_run=dry_run, trigger_timer=build_file.jenkins_job_schedule) ci_job_names.append(job_name) if groovy_script is not None: print("Configuration for job '%s'" % job_name) job_configs[job_name] = job_config except JobValidationError as e: print(e.message, file=sys.stderr) groovy_data['expected_num_jobs'] = len(job_configs) groovy_data['job_prefixes_and_names'] = {} if groovy_script is not None: print("Writing groovy script '%s' to reconfigure %d jobs" % (groovy_script, len(job_configs))) content = expand_template('snippet/reconfigure_jobs.groovy.em', groovy_data) write_groovy_script_and_configs(groovy_script, content, job_configs, view_configs)
def configure_ci_job(config_url, rosdistro_name, ci_build_name, os_name, os_code_name, arch, config=None, build_file=None, index=None, dist_file=None, jenkins=None, views=None, is_disabled=False, groovy_script=None, build_targets=None, dry_run=False, underlay_source_paths=None, trigger_timer=None): """ Configure a single Jenkins CI job. This includes the following steps: - clone the ros_buildfarm repository - write the distribution repository keys into files - invoke the ci/run_ci_job.py script """ if config is None: config = get_config_index(config_url) if build_file is None: build_files = get_ci_build_files(config, rosdistro_name) build_file = build_files[ci_build_name] # Overwrite build_file.targets if build_targets is specified if build_targets is not None: build_file.targets = build_targets if index is None: index = get_index(config.rosdistro_index_url) if dist_file is None: dist_file = get_distribution_file(index, rosdistro_name, build_file) if not dist_file: raise JobValidationError( 'No distribution file matches the build file') if os_name not in build_file.targets.keys(): raise JobValidationError("Invalid OS name '%s' " % os_name + 'choose one of the following: ' + ', '.join(sorted(build_file.targets.keys()))) if os_code_name not in build_file.targets[os_name].keys(): raise JobValidationError( "Invalid OS code name '%s' " % os_code_name + 'choose one of the following: ' + ', '.join(sorted(build_file.targets[os_name].keys()))) if arch not in build_file.targets[os_name][os_code_name]: raise JobValidationError( "Invalid architecture '%s' " % arch + 'choose one of the following: %s' % ', '.join(sorted(build_file.targets[os_name][os_code_name]))) underlay_source_jobs = [ get_ci_job_name(rosdistro_name, os_name, os_code_name, arch, underlay_job) for underlay_job in build_file.underlay_from_ci_jobs ] underlay_source_paths = (underlay_source_paths or []) + \ ['$UNDERLAY%d_JOB_SPACE' % (index + 1) for index in range(len(underlay_source_jobs))] trigger_jobs = [ get_ci_job_name(rosdistro_name, os_name, os_code_name, arch, trigger_job) for trigger_job in build_file.jenkins_job_upstream_triggers ] if jenkins is None: from ros_buildfarm.jenkins import connect jenkins = connect(config.jenkins_url) if views is None: view_name = get_ci_view_name(rosdistro_name) configure_ci_view(jenkins, view_name, dry_run=dry_run) job_name = get_ci_job_name(rosdistro_name, os_name, os_code_name, arch, ci_build_name) job_config = _get_ci_job_config(index, rosdistro_name, build_file, os_name, os_code_name, arch, build_file.repos_files, build_file.repository_names, underlay_source_jobs, underlay_source_paths, trigger_timer, trigger_jobs, is_disabled=is_disabled) # jenkinsapi.jenkins.Jenkins evaluates to false if job count is zero if isinstance(jenkins, object) and jenkins is not False: from ros_buildfarm.jenkins import configure_job configure_job(jenkins, job_name, job_config, dry_run=dry_run) return job_name, job_config