1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------
from webbrowser import open_new
from knack.log import get_logger
from azext_devops.devops_sdk.v5_0.release.models import ArtifactMetadata, BuildVersion, ReleaseStartMetadata
from azext_devops.dev.common.services import (get_release_client, resolve_instance_and_project)
from .release_definition import get_definition_id_from_name
logger = get_logger(__name__)
def release_create(definition_id=None, definition_name=None, artifact_metadata_list=None, description=None,
open=False, organization=None, project=None, detect=None): # pylint: disable=redefined-builtin
"""Request (create) a release.
:param definition_id: ID of the definition to create. Required if --definition-name is not supplied.
:type definition_id: int
:param definition_name: Name of the definition to create. Ignored if --definition-id is supplied.
:type definition_name: str
:param open: Open the release results page in your web browser.
:type open: bool
:param artifact_metadata_list: Space separated "alias=version_id" pairs.
:type artifact_metadata_list: [str]
:param description: Description of the release.
:type description: str
:rtype: :class:`<ReleaseStartMetadata> <v5_0.release.models.ReleaseStartMetadata>`
"""
organization, project = resolve_instance_and_project(
detect=detect, organization=organization, project=project)
if definition_id is None and definition_name is None:
raise ValueError('Either the --definition-id argument or the --definition-name argument ' +
'must be supplied for this command.')
client = get_release_client(organization)
if definition_id is None:
definition_id = get_definition_id_from_name(definition_name, client, project)
artifacts = []
if artifact_metadata_list is not None and artifact_metadata_list:
for artifact_metadata in artifact_metadata_list:
separator_pos = artifact_metadata.find('=')
if separator_pos >= 0:
instance_reference = BuildVersion(id=artifact_metadata[separator_pos + 1:])
artifact = ArtifactMetadata(alias=artifact_metadata[:separator_pos],
instance_reference=instance_reference)
artifacts.append(artifact)
else:
raise ValueError('The --artifact_meta_data_list argument should consist'
'of space separated "alias=version_id" pairs.' + artifact_metadata)
release = ReleaseStartMetadata(definition_id=definition_id, artifacts=artifacts, description=description)
created_release = client.create_release(release_start_metadata=release, project=project)
if open:
_open_release(created_release)
return created_release
def release_show(id, open=False, organization=None, project=None, detect=None): # pylint: disable=redefined-builtin
"""Get the details of a release.
:param id: ID of the release.
:type id: int
:param open: Open the release results page in your web browser.
:type open: bool
:rtype: :class:`<Release> <v5_0.release.models.Release>`
"""
organization, project = resolve_instance_and_project(
detect=detect, organization=organization, project=project)
client = get_release_client(organization)
release = client.get_release(release_id=id, project=project)
if open:
_open_release(release)
return release
def release_list(definition_id=None, min_created_time=None, max_created_time=None, source_branch=None,
organization=None, project=None, detect=None, top=None, status=None):
"""List release results.
:param definition_id: ID of definition to list releases for.
:type definition_id: int
:param min_created_time: Releases that were created after this time.
:type min_created_time: datetime
:param max_created_time: Releases that were created before this time.
:type max_created_time: datetime
:param branch: Filter by releases for this branch.
:type branch: str
:param top: Maximum number of releases to list. Default is 50.
:type top: int
:param status: Limit to releases with this status.
:type status: str
:param source_branch: Filter releases for this branch.
:type source_branch: str
:rtype: :class:`<Release> <v5_0.release.models.Release>`
"""
organization, project = resolve_instance_and_project(
detect=detect, organization=organization, project=project)
client = get_release_client(organization)
releases = client.get_releases(definition_id=definition_id,
min_created_time=min_created_time,
max_created_time=max_created_time,
project=project,
source_branch_filter=source_branch,
top=top,
status_filter=status)
return releases
def _open_release(release):
"""Open the release results page in your web browser.
:param :class:`<Release> <v5_0.release.models.Release>` release:
"""
url = _get_release_web_url(release)
if url is not None and url:
logger.debug('Opening web page: %s', url)
open_new(url=url)
def _get_release_web_url(release):
links = release._links # pylint: disable=protected-access
if links is not None and links:
properties = links.additional_properties
if properties is not None and properties:
web_url = properties.get('web')
if web_url is not None and web_url:
return web_url.get('href')
return None
|