def wiql_query(context): wit_client = context.connection.clients.get_work_item_tracking_client() wiql = Wiql(query=""" select [System.Id], [System.WorkItemType], [System.Title], [System.State], [System.AreaPath], [System.IterationPath], [System.Tags] from WorkItems where [System.WorkItemType] = 'Test Case' order by [System.ChangedDate] desc""") # We limit number of results to 30 on purpose wiql_results = wit_client.query_by_wiql(wiql, top=30).work_items emit("Results: {0}".format(len(wiql_results))) if wiql_results: # WIQL query gives a WorkItemReference with ID only # => we get the corresponding WorkItem from id work_items = (wit_client.get_work_item(int(res.id)) for res in wiql_results) for work_item in work_items: print_work_item(work_item) return work_items else: return []
def print_work_item(work_item): emit( "{0} {1}: {2}".format( work_item.fields["System.WorkItemType"], work_item.id, work_item.fields["System.Title"], ) )
def get_projects(context): core_client = context.connection.clients.get_core_client() projects = core_client.get_projects() for project in projects: emit(project.id + ": " + project.name) return projects
def enter_resource(resource, http_logging_path): emit("-- %s --", resource) if http_logging_path is not None: resource_log_dir = pathlib.Path(http_logging_path / resource) resource_log_dir.mkdir(parents=True, exist_ok=True) return resource_log_dir return None
def get_test_runs(context): test_client = context.connection.clients.get_test_client() for project in get_project_names(context): try: for run in test_client.get_test_runs(project, top=16): emit("Test Run {}: {} => {} ({})".format( run.id, run.name, run.state, project)) except Exception as e: emit("Project '{}' raised error: {}".format(project, e))
def get_plans(context): test_client = context.connection.clients.get_test_client() for project in get_project_names(context): try: for plan in test_client.get_plans(project): emit("Test Plan {}: {} ({})".format(plan.id, plan.name, plan.area.name)) except Exception as e: emit("Project '{}' raised error: {}".format(project, e))
def enter_area(area, http_logging_path): emit("== %s ==", area) if http_logging_path is not None: area_log_dir = pathlib.Path(http_logging_path / area) area_log_dir.mkdir(parents=True, exist_ok=True) return area_log_dir return None
def get_projects(context): core_client = context.connection.get_client( "vsts.core.v4_1.core_client.CoreClient") projects = core_client.get_projects() for project in projects: emit(project.id + ": " + project.name) return projects
def get_test_suites_for_plan(context): test_client = context.connection.clients.get_test_client() for project in get_project_names(context): try: for plan in test_client.get_plans(project): for suite in test_client.get_test_suites_for_plan( project, plan.id): emit("Test Suite {}: {} ({}.{})".format( suite.id, suite.name, plan.id, plan.name)) except Exception as e: emit("Project '{}' raised error: {}".format(project, e))
def get_refs(context): repo = find_any_repo(context) git_client = context.connection.clients.get_git_client() refs = git_client.get_refs(repo.id, repo.project.id) for ref in refs: emit(ref.name + ": " + ref.object_id) return refs
def get_repos(context): project = find_any_project(context) git_client = context.connection.clients.get_git_client() repos = git_client.get_repositories(project.id) for repo in repos: emit(repo.id + ": " + repo.name) return repos
def get_definitions(context): project = find_any_project(context) emit(project.name) build_client = context.connection.clients.get_build_client() definitions = build_client.get_definitions(project.id) for definition in definitions: emit(str(definition.id) + ": " + definition.name) return definitions
def get_work_items(context): wit_client = context.connection.clients.get_work_item_tracking_client() desired_ids = range(1, 51) work_items = wit_client.get_work_items(ids=desired_ids, error_policy="omit") for id_, work_item in zip(desired_ids, work_items): if work_item: print_work_item(work_item) else: emit("(work item {0} omitted by server)".format(id_)) return work_items
def get_test_results(context): test_client = context.connection.clients.get_test_client() for project in get_project_names(context): try: for run in test_client.get_test_runs(project, top=10): # Limiting Test Results is not something one shall do! for res in test_client.get_test_results(project, run.id, top=3): tc = res.test_case tester = res.run_by.display_name emit("Test Result {}: {} => {} by {} ({})".format( run.id, tc.name, res.outcome, tester, project)) except Exception as e: emit("Project '{}' raised error: {}".format(project, e))
def get_work_items(context): wit_client = context.connection.get_client( "vsts.work_item_tracking.v4_1.work_item_tracking_client.WorkItemTrackingClient") desired_ids = range(1, 51) work_items = wit_client.get_work_items(ids=desired_ids, error_policy="omit") for id_, work_item in zip(desired_ids, work_items): if work_item: emit("{0} {1}: {2}".format(work_item.fields['System.WorkItemType'], work_item.id, work_item.fields['System.Title'])) else: emit("(work item {0} omitted by server)".format(id_)) return work_items
def queue_build(context): definition = find_any_build_definition(context) build_client = context.connection.clients.get_build_client() build = { 'definition': { 'id': definition.id } } response = build_client.queue_build(build=build, project=definition.project.id) emit(str(response.id) + ": " + response.url) return response
def get_work_items_as_of(context): wit_client = context.connection.clients.get_work_item_tracking_client() desired_ids = range(1, 51) as_of_date = datetime.datetime.now() + datetime.timedelta(days=-7) work_items = wit_client.get_work_items(ids=desired_ids, as_of=as_of_date, error_policy="omit") for id_, work_item in zip(desired_ids, work_items): if work_item: print_work_item(work_item) else: emit("(work item {0} omitted by server)".format(id_)) return work_items
def __init__(self, filename=None): if not filename: runner_path = (pathlib.Path(os.getcwd()) / pathlib.Path(sys.argv[0])).resolve() filename = runner_path.parents[0] / pathlib.Path( DEFAULT_CONFIG_FILE_NAME) self._filename = filename try: with open(filename) as config_fp: self._config = json.load(config_fp) except FileNotFoundError: self._config = {} except json.JSONDecodeError: emit("possible bug: config file exists but isn't parseable") self._config = {}
def run_cmd(args, config): try: auth_token = os.environ['AZURE_DEVOPS_PAT'] except KeyError: if config['pat']: emit("Using auth token from config file") auth_token = config['pat'] else: emit( 'You must first set the AZURE_DEVOPS_PAT environment variable or the `pat` config setting' ) sys.exit(1) if not args.url: if config['url']: args.url = config['url'] emit('Using configured URL {0}'.format(args.url)) else: emit('No URL configured - pass it on the command line') sys.exit(1) args_dict = vars(args) main(**args_dict, auth_token=auth_token)
def config_cmd(args, config): template = " {0}: {1}" if args.name == 'all': emit("Configured settings") for name in config: emit(template.format(name, config[name])) return args.name = args.name.lower() if args.set_to: if args.name in config: config[args.name] = args.set_to emit("Setting new value for {0}".format(args.name)) emit(template.format(args.name, config[args.name])) config.save() else: emit("There's no setting called {0}".format(args.name)) elif args.delete: if args.name in config: emit("Deleting {0}; old value was".format(args.name)) emit(template.format(args.name, config[args.name])) del config[args.name] config.save() else: emit("There's no setting called {0}".format(args.name)) else: if args.name in config: emit(template.format(args.name, config[args.name])) else: emit("There's no setting called {0}".format(args.name))
def run(*args, **kwargs): emit("Running `{0}.{1}`".format(sample_func.__module__, sample_func.__name__)) sample_func(*args, **kwargs)