Как автоматизировать конвейеризацию в лазурных девопах с помощью rest api - PullRequest
0 голосов
/ 31 мая 2019

Я бы хотел автоматизировать процесс создания сборок, выпусков в лазурных девопах. Я понимаю, что остальные API существуют. Но помогут ли они автоматизировать процесс, и можно ли это сделать в node.js?

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Не могли бы вы дать еще несколько подробностей о желаемом процессе автоматизации?

Если вы имеете в виду также создание определений, то я бы также взглянул на YAML.В будущем будет еще несколько обновлений, особенно для определений выпусков: https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=azure-devops&tabs=schema

Я реализовал оболочку Powershell (но не с Node.js) для Azure DevOps Api.Вот некоторые фрагменты кода для создания нового выпуска:

НАСТРОЙКА СОЕДИНЕНИЯ

<#
    .SYNOPSIS
    Sets the environment parameter for the current session so that the commandlets can access Azure DevOps.
#>
function Set-AzureDevOpsEnvironment {
    Param(
        <# The account name of the Azure DevOps tenant to access. If not set, this is set to "vanstelematics" #>
        [Parameter(Mandatory=$true)]
        $AzureDevOpsAccountName,

        <# The project name of Azure DevOps to work with. If not set, this is set to "ScaledPilotPlatform" #>
        [Parameter(Mandatory=$true)]
        $AzureDevOpsProjectName,

        <# The PAT to access the Azure DevOps REST API. If not set, the function tries to read the PAT from a
        textfile called "AzureDevOpsPat.user" either in the current working directory or in the profile
        directory of the current user. The textfile must contain only that PAT as plain string. #>
        [Parameter(Mandatory=$false)]
        $AzureDevOpsPat
    ) 

    if ($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent) {
        $Script:Verbose = $true
    } else {
        $Script:Verbose = $false
    }

    if (!$AzureDevOpsPat) {
        $paths = @("AzureDevOpsPat.user", (JOin-Path $env:USERPROFILE "AzureDevOpsPat.user"))

        foreach ($path in $paths) {
            if (Test-Path $path -ErrorAction SilentlyContinue) {
                $AzureDevOpsPat = Get-Content $path
                break
            }
        }

        if (!$AzureDevOpsPat) {
            Write-Host "AzureDevOpsPat is empty and file AzureDevOpsPat.user not found." -ForegroundColor Red
            return  
        }
    }

    Write-Host "The Azure DevOps project '$($AzureDevOpsProjectName)' inside the Azure DevOps account '$($AzureDevOpsAccountName)' will be used."
    $Script:AzureDevOpsAccountName = $AzureDevOpsAccountName
    $Script:AzureDevOpsProjectName = $AzureDevOpsProjectName
    $Script:AzureDevOpsPat = $AzureDevOpsPat
}

REST CALLER

function Call-AzureDevOpsApi($Url, $JsonBody, [ValidateSet("GET", "DELETE", "POST", "PUT", "PATCH")]$Method, $ContentType) {
    if ($Script:Verbose) {
        Write-Host "Calling $($Method) $($Url)"
    }

    if (!$ContentType) {
        $ContentType = "application/json"
    }

    $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(("{0}:{1}" -f "", $Script:AzureDevOpsPat)))

    $parameters = @{
        Headers = @{Authorization = ("Basic {0}" -f $base64AuthInfo)};
        Method = $Method;
        Uri = $Url;
    }

    if ($Method -in @("POST", "PUT", "PATCH")) {
        if (!$JsonBody) {
            Write-Error "A JsonBody is required for method $($Method)."
            return
        }

        $JsonBodyUtf8 = [Text.Encoding]::UTF8.GetBytes($JsonBody)
        $parameters["Body"] = $JsonBodyUtf8
        $parameters["ContentType"] = $ContentType
    } 

    $result = Invoke-RestMethod @parameters
    return $result
}

function Call-AzureDevOpsApiPost($Url, $JsonBody, [Parameter(Mandatory=$False)][ValidateSet("application/json", "application/json-patch+json")]$ContentType) {
    return Call-AzureDevOpsApi -Url $Url -JsonBody $JsonBody -ContentType $ContentType -Method POST
}

function Call-AzureDevOpsApiPut($Url, $JsonBody, [Parameter(Mandatory=$False)][ValidateSet("application/json", "application/json-patch+json")]$ContentType) {
    return Call-AzureDevOpsApi -Url $Url -JsonBody $JsonBody -Method PUT
}

function Call-AzureDevOpsApiPatch($Url, $JsonBody, [Parameter(Mandatory=$False)][ValidateSet("application/json", "application/json-patch+json")]$ContentType) {
    return Call-AzureDevOpsApi -Url $Url -JsonBody $JsonBody -Method PATCH
}

function Call-AzureDevOpsApiGet($Url, [Parameter(Mandatory=$False)][ValidateSet("application/json", "application/json-patch+json")]$ContentType) {
    return Call-AzureDevOpsApi -Url $Url -Method GET
}

function Call-AzureDevOpsApiDelete($Url, [ValidateSet("application/json", "application/json-patch+json")]$ContentType) {
    return Call-AzureDevOpsApi -Url $Url -Method DELETE
}

НОВЫЙ РЕЛИЗ

<#
    .SYNOPSIS
    Creates a new release for a given Release Definition and artifact (p.e. build)
#>
function New-Release {
    Param(
        <# The id of the release definition to create the release for. #>
        [Parameter(Mandatory=$true)]
        $ReleaseDefinition, 

        <# The alias of the artifact of the release definition to create the release for #>
        [Parameter(Mandatory=$true)]
        $ArtifactAlias, 

        <# The version of the artifact (p.e. the id of the build)#>
        [Parameter(Mandatory=$true)]
        $ArtifactVersion,

        <# The description/name of the release #>
        [Parameter(Mandatory=$true)]
        $Description
    )

    $url = "https://vsrm.dev.azure.com/$($Script:AzureDevOpsAccountName)/$($Script:AzureDevOpsProjectName)/_apis/release/releases?api-version=4.1-preview.6"

    $releaseData = @{
        "definitionId"       = $ReleaseDefinition.id;
        "description"        = $Description;
        "artifacts"          = @(
            @{
                "alias"             = $ArtifactAlias;
                "instanceReference" = $ArtifactVersion
            }
        );
        "isDraft"            = $false;
        "reason"             = "none";
        "manualEnvironments" = $ReleaseDefinition.environments | select -ExpandProperty name
    }

    $result = Call-AzureDevOpsApiPost -Url $url -JsonBody ($releaseData | ConvertTo-Json -Depth 100)
    return $result
}

Надеюсь, что это дает представление о том, как его использовать.

0 голосов
/ 01 июня 2019

да. У Azure Devops есть API. У меня нет опыта работы с node.js.

Документация по API REST API Azure DevOps здесь:

https://docs.microsoft.com/en-us/rest/api/azure/devops/?view=azure-devops-rest-5.0

Вы можете найти библиотеки node.js здесь:

https://github.com/microsoft/azure-devops-node-api

...