azure-devops/azext_devops/dev/pipelines/pipeline_run.py (84 lines of code) (raw):

# -------------------------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- from knack.log import get_logger from azext_devops.dev.common.services import resolve_instance_and_project, get_build_client from azext_devops.dev.common.git import resolve_git_ref_heads from azext_devops.dev.common.identities import resolve_identity_as_id logger = get_logger(__name__) def pipeline_run_show(id, open=False, organization=None, project=None, detect=None): # pylint: disable=redefined-builtin """ Show details of a pipeline run. :param id: ID of the pipeline run. :type id: int :param open: Open the build results page in your web browser. :type open: bool :param project: Name or ID of the team project. :type project: str :param detect: Automatically detect organization and project. Default is "on". :type detect: str :rtype: :class:`<Build> <build.v5_1.models.Build>` """ organization, project = resolve_instance_and_project( detect=detect, organization=organization, project=project) client = get_build_client(organization) build = client.get_build(build_id=id, project=project) if open: _open_pipeline_run(build, organization) return build def pipeline_run_list(pipeline_ids=None, branch=None, organization=None, project=None, detect=None, top=None, query_order=None, result=None, status=None, reason=None, tags=None, requested_for=None): """ List the pipeline runs in a project. :param pipeline_ids: IDs (space separated) of definitions to list builds for. For multiple pipeline ids: --pipeline-ids 1 2 :type pipeline_ids: list of int :param branch: Filter by builds for this branch. :type branch: str :param top: Maximum number of builds to list. :type top: int :param query_order: Order of pipeline runs. :type query_order: str :param result: Limit to builds with this result. :type result: str :param status: Limit to builds with this status. :type status: str :param reason: Limit to builds with this reason. :type reason: str :param tags: Limit to builds with each of the specified tags. Space separated. :type tags: list of str :param requested_for: Limit to builds requested for this user or group. :type requested_for: str """ organization, project = resolve_instance_and_project( detect=detect, organization=organization, project=project) client = get_build_client(organization) if pipeline_ids is not None and pipeline_ids: pipeline_ids = list(set(pipeline_ids)) # make distinct if tags is not None and tags: tags = list(set(tags)) # make distinct query_order = _resolve_runs_query_order(query_order) builds = client.get_builds(definitions=pipeline_ids, project=project, branch_name=resolve_git_ref_heads(branch), top=top, result_filter=result, status_filter=status, reason_filter=reason, tag_filters=tags, query_order=query_order, requested_for=resolve_identity_as_id(requested_for, organization)) return builds def _resolve_runs_query_order(query_order): if query_order: query_order_vals = ['finishTimeAscending', 'finishTimeDescending', 'queueTimeAscending', 'queueTimeDescending', 'startTimeAscending', 'startTimeDescending'] for val in query_order_vals: if query_order.lower() in val.lower(): return val logger.warning("Cannot resolve --query-order, continuing with None") return None def pipeline_run_add_tag(run_id, tags, organization=None, project=None, detect=None): """ Add tag(s) for a pipeline run. :param run_id: ID of the pipeline run. :type run_id: int :param tags: Tag(s) to be added to the pipeline run. [Comma separated values] :type tags: str :rtype: list of str """ organization, project = resolve_instance_and_project(detect=detect, organization=organization, project=project) client = get_build_client(organization) tags = list(map(str, tags.split(','))) if len(tags) == 1: tags = client.add_build_tag( project=project, build_id=run_id, tag=tags[0]) else: tags = client.add_build_tags( tags=tags, project=project, build_id=run_id) return tags def pipeline_run_delete_tag(run_id, tag, organization=None, project=None, detect=None): """ Delete a pipeline run tag. :param run_id: ID of the pipeline run. :type run_id: int :param tag: Tag to be deleted from the pipeline run. :type tag: str :rtype: list of str """ organization, project = resolve_instance_and_project(detect=detect, organization=organization, project=project) client = get_build_client(organization) tags = client.delete_build_tag(project=project, build_id=run_id, tag=tag) return tags def pipeline_run_get_tags(run_id, organization=None, project=None, detect=None): """ Get tags for a pipeline run. :param run_id: ID of the pipeline run. :type run_id: int :rtype: list of str """ organization, project = resolve_instance_and_project(detect=detect, organization=organization, project=project) client = get_build_client(organization) tags = client.get_build_tags(build_id=run_id, project=project) return tags def _open_pipeline_run(run, organization): """Open the build results page in your web browser. :param :class:`<Build> <build.v5_1.models.Build>` build: :param str organization: """ from webbrowser import open_new from azext_devops.dev.common.uri import uri_quote # https://dev.azure.com/OrgName/ProjectName/_build/results?buildId=1234 project = run.project.name url = organization.rstrip('/') + '/' + uri_quote(project) + '/_build/results?buildid='\ + uri_quote(str(run.id)) logger.debug('Opening web page: %s', url) open_new(url=url) def _open_pipeline_run6_0(run, project, organization): """Open the build results page in your web browser. :param :class:`<Run> <azure.devops.v6_0.pipelines.models.Run>` :param str project: :param str organization: """ from webbrowser import open_new from azext_devops.dev.common.uri import uri_quote url = f"{organization.rstrip('/')}/{uri_quote(project)}/_build/results?buildid={uri_quote(str(run.id))}" logger.debug('Opening web page: %s', url) open_new(url=url)