Usar um script do PowerShell para personalizar seu pipeline

Serviços de DevOps do Azure | Azure DevOps Server 2022 - Azure DevOps Server 2019

Quando estiver pronto para ir além dos conceitos básicos de compilação e teste de seu código, use um script do PowerShell para adicionar a lógica de negócios da sua equipe ao seu pipeline de compilação. Você pode executar o Windows PowerShell em um agente de compilação do Windows. O PowerShell Core é executado em qualquer plataforma.

Adicionar um script do PowerShell

A sintaxe para incluir o PowerShell Core é ligeiramente diferente da sintaxe do Windows PowerShell.

  1. Envie o script do PowerShell para o repositório.

  2. Adicione um pwsh ou powershell passo. A pwsh palavra-chave é um atalho para a tarefa do PowerShell para o PowerShell Core. A powershell palavra-chave é outro atalho para a tarefa do PowerShell.

# for PowerShell Core
steps:
- pwsh: ./my-script.ps1

# for Windows PowerShell
steps:
- powershell: .\my-script.ps1

Exemplo de script do PowerShell: assemblies de versão

Aqui está um script de exemplo para a versão de seus assemblies. Para que o script seja executado com êxito, você precisará atualizar seu número de compilação para usar um formato com quatro pontos (exemplo: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)). O número de compilação também pode ser referido como número de execução.

Você pode personalizar seu número de compilação dentro de um pipeline YAML com a name propriedade.

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

pool:
  vmImage: windows-latest

steps:
- pwsh: echo $(Build.BuildNumber) //output updated build number
# If found use it to version the assemblies.
#
# For example, if the 'Build number format' build pipeline parameter 
# $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)
# then your build numbers come out like this:
# "Build HelloWorld_2013.07.19.1"
# This script would then apply version 2013.07.19.1 to your assemblies.
	
# Enable -Verbose option
[CmdletBinding()]
	
# Regular expression pattern to find the version in the build number 
# and then apply it to the assemblies
$VersionRegex = "\d+\.\d+\.\d+\.\d+"
	
# If this script is not running on a build server, remind user to 
# set environment variables so that this script can be debugged
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\FabrikamTFVC\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 is 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 "Could not find version number data in BUILD_BUILDNUMBER."
         exit 1
      }
   1 {}
   default 
      { 
         Write-Warning "Found more than instance of version data in BUILD_BUILDNUMBER." 
         Write-Warning "Will assume 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 "Will apply $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."
}

Exemplo de script do PowerShell: acessar a API REST

Neste exemplo, você usará a SYSTEM_ACCESSTOKEN variável para acessar a API REST do Azure Pipelines.

Você pode usar $env:SYSTEM_ACCESSTOKEN seu script em um pipeline YAML para acessar o token OAuth.

- 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)

FAQ

Quais variáveis estão disponíveis para eu usar em meus scripts?

Você pode usar variáveis predefinidas em seus scripts. Para obter mais informações sobre variáveis disponíveis e como usá-las, consulte Usar variáveis predefinidas.

Como faço para definir uma variável para que ela possa ser lida por scripts e tarefas subsequentes?

Para saber mais sobre como definir variáveis de compilação em um script, consulte Definir e modificar suas variáveis de compilação em um script.

Para saber mais sobre como definir variáveis de liberação em um script, consulte Definir e modificar suas variáveis de liberação em um script

Qual ramificação do script a compilação é executada?

A compilação usará a ramificação ativa do seu código. Se a execução do pipeline usar a main ramificação, o script também usará a main ramificação.

Que tipos de parâmetros posso usar?

Você pode usar parâmetros nomeados. Outros tipos de parâmetros, como parâmetros de switch, não são suportados. Você verá erros se tentar usar parâmetros de switch.

Eu uso o TFS local e não vejo alguns desses recursos. Porque não?

Alguns desses recursos estão disponíveis apenas no Azure Pipelines e ainda não estão disponíveis localmente. Alguns recursos estão disponíveis no local se você tiver atualizado para a versão mais recente do TFS.