azure-devops/azext_devops/dev/pipelines/release.py (68 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 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