Comparteix a través de


Scripts de PowerShell para personalizar canalizaciones

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2019

En este artículo se explica cómo puede ir más allá de compilar y probar código y usar scripts de PowerShell para agregar lógica de negocios a canalizaciones. La tarea de PowerShell de Azure Pipelines ejecuta scripts de PowerShell en las canalizaciones. Puede usar PowerShell para acceder a la API rest de Azure DevOps, trabajar con elementos de trabajo y administración de pruebas de Azure DevOps, o llamar a otros servicios según sea necesario.

Puede usar variables en los scripts de PowerShell, incluidas las variables definidas por el usuario que establezca usted mismo. También puede usar variables predefinidas que están disponibles en todas las canalizaciones de Azure y establecer variables de salida de varios trabajos para que las variables estén disponibles para trabajos futuros. Para obtener más información, consulte Definición de variables.

Puede usar parámetros con nombre en los scripts de PowerShell. No se admiten otros tipos de parámetros, como los parámetros de modificador, y provocan errores si intenta usarlos. Para obtener más información, consulte Cómo declarar parámetros de cmdlet.

Adición de un script de PowerShell a una canalización

La compilación usa la rama activa del código. Si la ejecución de canalización usa la rama main, el script también usa la rama main.

Puede ejecutar Windows PowerShell en un agente de compilación de Windows o ejecutar PowerShell Core en cualquier plataforma. La sintaxis para incluir PowerShell Core es ligeramente diferente a la de Windows PowerShell.

Después de insertar el script de PowerShell en el repositorio, agregue un pwsh paso o powershell a la canalización. La pwsh palabra clave y powershell las palabras clave son métodos abreviados para ejecutar la tarea de PowerShell.

Ejemplo de PowerShell Core:

steps:
- pwsh: ./my-script.ps1

Ejemplo de Windows PowerShell:

steps:
- powershell: .\my-script.ps1

Script de ejemplo para aplicar la versión a los ensamblados

El script de ejemplo de esta sección aplica una versión a los archivos de propiedades de ensamblado. Para que el script se ejecute correctamente, el formato de número de compilación definido debe tener cuatro puntos, por ejemplo $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r).

Nota:

El número de compilación también se denomina número de ejecución.

Personalice el número de compilación en la canalización de YAML mediante la name propiedad . La name propiedad debe estar en el nivel raíz de la canalización. Para obtener más información, consulte Configurar números de ejecución o compilación.

name: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)

El siguiente script de ejemplo de PowerShell aplica una versión a los ensamblados. Por ejemplo, si el formato $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r) de número de compilación definido genera el número Build HelloWorld_2024.07.19.1de compilación , el script aplica la versión 2024.07.19.1 a los ensamblados.

# Enable -Verbose option
[CmdletBinding()]

# Regular expression pattern to find the version in the build number
$VersionRegex = "\d+\.\d+\.\d+\.\d+"

# If not running on a build server, remind user to set environment variables for debugging
if(-not ($Env:BUILD_SOURCESDIRECTORY -and $Env:BUILD_BUILDNUMBER))
{
    Write-Error "You must set the following environment variables"
    Write-Error "to test this script interactively."
    Write-Host '$Env:BUILD_SOURCESDIRECTORY - For example, enter something like:'
    Write-Host '$Env:BUILD_SOURCESDIRECTORY = "C:\code\Fabrikam\HelloWorld"'
    Write-Host '$Env:BUILD_BUILDNUMBER - For example, enter something like:'
    Write-Host '$Env:BUILD_BUILDNUMBER = "Build HelloWorld_0000.00.00.0"'
    exit 1
}

# Make sure path to source code directory is available
if (-not $Env:BUILD_SOURCESDIRECTORY)
{
    Write-Error ("BUILD_SOURCESDIRECTORY environment variable is missing.")
    exit 1
}
elseif (-not (Test-Path $Env:BUILD_SOURCESDIRECTORY))
{
    Write-Error "BUILD_SOURCESDIRECTORY does not exist: $Env:BUILD_SOURCESDIRECTORY"
    exit 1
}
Write-Verbose "BUILD_SOURCESDIRECTORY: $Env:BUILD_SOURCESDIRECTORY"
    
# Make sure there's a build number
if (-not $Env:BUILD_BUILDNUMBER)
{
    Write-Error ("BUILD_BUILDNUMBER environment variable is missing.")
    exit 1
}
Write-Verbose "BUILD_BUILDNUMBER: $Env:BUILD_BUILDNUMBER"
    
# Get and validate the version data
$VersionData = [regex]::matches($Env:BUILD_BUILDNUMBER,$VersionRegex)
switch($VersionData.Count)
{
   0        
      { 
         Write-Error "Couldn't find version number data in BUILD_BUILDNUMBER."
         exit 1
      }
   1 {}
   default 
      { 
         Write-Warning "Found more than one instance of version data in BUILD_BUILDNUMBER." 
         Write-Warning "Assuming first instance is version."
      }
}
$NewVersion = $VersionData[0]
Write-Verbose "Version: $NewVersion"
    
# Apply the version to the assembly property files
$files = gci $Env:BUILD_SOURCESDIRECTORY -recurse -include "*Properties*","My Project" | 
    ?{ $_.PSIsContainer } | 
    foreach { gci -Path $_.FullName -Recurse -include AssemblyInfo.* }
if($files)
{
    Write-Verbose "Applying $NewVersion to $($files.count) files."
    
    foreach ($file in $files) {
        $filecontent = Get-Content($file)
        attrib $file -r
        $filecontent -replace $VersionRegex, $NewVersion | Out-File $file
        Write-Verbose "$file.FullName - version applied"
    }
}
else
{
    Write-Warning "Found no files."
}

Script de ejemplo para acceder a la API REST

En este ejemplo se usa la SYSTEM_ACCESSTOKEN variable para acceder a la API REST de Azure Pipelines.

Puede usar $env:SYSTEM_ACCESSTOKEN en un script insertado en la canalización de YAML para acceder al token de OAuth.

El siguiente script de PowerShell insertado en una canalización YAML usa el token de OAuth para acceder a la API rest de Azure Pipelines que recupera la definición de canalización.

- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
      $url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/build/definitions/$($env:SYSTEM_DEFINITIONID)?api-version=5.0"
              Write-Host "URL: $url"
              $pipeline = Invoke-RestMethod -Uri $url -Headers @{
                  Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
              }
              Write-Host "Pipeline = $($pipeline | ConvertTo-Json -Depth 100)"
  env:
     SYSTEM_ACCESSTOKEN: $(System.AccessToken)