Sdílet prostřednictvím


Přizpůsobení kanálu pomocí skriptu PowerShellu

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

Až budete připraveni přejít nad rámec základů kompilace a testování kódu, použijte skript PowerShellu k přidání obchodní logiky týmu do kanálu buildu. Windows PowerShell můžete spustit na agentu sestavení windows nebo PowerShellu Core na libovolné platformě.

Když použijete úlohu PowerShellu PowerShellu, skript PowerShellu se spustí v kanálu. PowerShell můžete použít pro přístup k rozhraní REST API Azure DevOps, práci s pracovními položkami Azure DevOps a správu testů a podle potřeby volat další služby.

Přidání skriptu PowerShellu

Syntaxe zahrnutí PowerShellu Core se mírně liší od syntaxe windows PowerShellu.

  1. Nasdílejte skript PowerShellu do úložiště.

  2. pwsh Přidejte do kanálu nebo powershell krok: pwsh Klíčové slovo je zkratka pro úlohu PowerShellu pro PowerShell Core. Klíčové powershell slovo je dalším zástupcem úlohy PowerShellu.

Příklady:

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

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

Ukázkový skript PowerShellu: sestavení verzí

Tady je ukázkový skript pro verzi sestavení. Aby se skript úspěšně spustil, musíte aktualizovat číslo sestavení tak, aby používalo formát se čtyřmi tečkami (například: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)). Číslo buildu se také může značovat jako číslo spuštění.

Číslo buildu můžete přizpůsobit v rámci kanálu YAML s name vlastností.

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

pool:
  vmImage: windows-latest

steps:
- pwsh: echo $(Build.BuildNumber) //output updated build number

Ukázkový skript PowerShellu:

# 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."
}

Ukázkový skript PowerShellu: Přístup k rozhraní REST API

V tomto příkladu použijete proměnnou SYSTEM_ACCESSTOKEN pro přístup k rozhraní REST API služby Azure Pipelines.

Ve skriptu v kanálu YAML můžete použít $env:SYSTEM_ACCESSTOKEN přístup k tokenu OAuth.

Následující příklad vložený skript PowerShellu používá token OAuth pro přístup k rozhraní REST API služby Azure Pipelines, který načte definici kanálu.

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

Často kladené dotazy

Jaké proměnné mám k dispozici ve skriptech?

Ve skriptech můžete použít předdefinované proměnné . Další informace o dostupných proměnných a jejich použití najdete v tématu Použití předdefinovaných proměnných.

Návody nastavit proměnnou tak, aby ji mohly číst další skripty a úlohy?

Další informace o definování proměnných sestavení ve skriptu najdete v tématu Definování a úprava proměnných sestavení ve skriptu.

Další informace o definování proměnných vydané verze ve skriptu najdete v tématu Definování a úprava proměnných vydané verze ve skriptu.

Která větev skriptu se spustí?

Sestavení používá aktivní větev kódu. Pokud vaše spuštění kanálu používá main větev, skript také používá main větev.

Jaké druhy parametrů můžu použít?

Můžete použít pojmenované parametry. Jiné typy parametrů, jako jsou parametry přepínače, se nepodporují. Pokud se pokusíte použít parametry přepínače, zobrazí se chyby.

Používám místně TFS a některé z těchto funkcí nevidím. Proč ne?

Některé z těchto funkcí jsou dostupné jenom v Azure Pipelines a zatím nejsou dostupné místně. Některé funkce jsou dostupné místně, pokud jste upgradovali na nejnovější verzi TFS.