BuildMasterAutomation/Functions/New-BMPipeline.ps1


function New-BMPipeline
{
    <#
    .SYNOPSIS
    Creates a new pipeline in BuildMaster.
 
    .DESCRIPTION
    The `New-BMPipeline` function creates a new pipeline in BuildMaster and retuns an object representing the new pipeline. In order to deploy an application, you must create a release for that application. Each release gets assigned a pipeline, which are the set of steps to do when releasing and deploying. Pipelines can belong to a specific application or shared between applications.
 
    The pipeline is created with no stages. The following settings are enabled:
 
    * Enforce pipeline stage order for deployments
 
    The following settings are disabled:
 
    * Cancel earlier (lower-sequenced) releases that are still active and have not yet been deployed.
    * Create a new release by incrementing the final part after a release has been deployed.
    * Mark the release and package as deployed once it reaches the final stage.
 
    This function uses [BuildMaster's native API](http://inedo.com/support/documentation/buildmaster/reference/api/native).
 
    .EXAMPLE
    New-BMPipeline -Session $session -Name 'Powershell Module'
 
    Demonstrates how to create a new pipeline that is not used by any applications. In this example a pipeline named `PowerShell Module` will be created.
 
    .EXAMPLE
    New-BMPipeline -Session $session -Name 'PowerShell Module' -Application $app
 
    Demonstrates how to create a new pipeline and assign it to a specific application. In this example, the pipeline will be called `PowerShell Module` and it will be assigned to the `$app` application.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [object]
        # An object that represents the instance of BuildMaster to connect to. Use the `New-BMSession` function to creates a session object.
        $Session,

        [Parameter(Mandatory=$true)]
        [string]
        # The name of the pipeline.
        $Name,

        [object]
        # The application to assign the pipeline to. Can be:
        #
        # * An application object with `Application_Id`, `id`, `Application_Name`, or `name` properties.
        # * An application ID (must be an integer)
        # * An applicatoin name (must be a string)
        $Application,

        [string]
        # The background color BuildMaster should use when displaying the pipeline's name in the UI. Should be a CSS hexadecimal color, e.g. `#ffffff`
        $Color,

        [string[]]
        # Stage configuration for the pipeline. Should be an array of `<Inedo.BuildMaster.Pipelines.PipelineStage>` XML elements.
        $Stage
    )

    Set-StrictMode -Version 'Latest'

    $pipelineParams = @{
                        'Pipeline_Name' = $Name;
                        'Pipeline_Configuration' = @"
<Inedo.BuildMaster.Pipelines.Pipeline Assembly="BuildMaster">
  <Properties Name="Standard" Description="" EnforceStageSequence="True">
     <Stages>
        $( $Stage -join [Environment]::NewLine )
     </Stages>
     <PostDeploymentOptions>
        <Inedo.BuildMaster.Pipelines.PipelinePostDeploymentOptions Assembly="BuildMaster">
           <Properties CreateRelease="False" CancelReleases="False" DeployRelease="False" />
        </Inedo.BuildMaster.Pipelines.PipelinePostDeploymentOptions>
     </PostDeploymentOptions>
  </Properties>
</Inedo.BuildMaster.Pipelines.Pipeline>
"@
;
                        'Active_Indicator' = $true;
                   }
    if( $Application )
    {
        $pipelineParams | Add-BMObjectParameter -Name 'application' -Value $Application
    }

    if( $Color )
    {
        $pipelineParams['Pipeline_Color'] = $Color
    }

    $pipelineId = Invoke-BMNativeApiMethod -Session $session -Name 'Pipelines_CreatePipeline' -Parameter $pipelineParams
    if( $pipelineId )
    {
        Invoke-BMNativeApiMethod -Session $session -Name 'Pipelines_GetPipeline' -Parameter @{ 'Pipeline_Id' = $pipelineId }    
    }
}