Megosztás a következőn keresztül:


PowerShell-szkriptek folyamatokhoz

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020

Ez a cikk azt ismerteti, hogy a PowerShell-szkriptek hogyan adhatnak hozzá üzleti logikát az Azure Pipelineshoz. A PowerShell v2 (PowerShell@2) feladat olyan PowerShell-szkripteket futtat, amelyek hozzáférhetnek az Azure DevOps REST API-hoz, dolgozhatnak az Azure DevOps munkaelemeivel, kezelhetik a teszteket, vagy meghívhatnak más szolgáltatásokat.

A PowerShell-szkriptekben előre definiált változókat vagy felhasználó által definiált változókat is használhat. Többfeladatos kimeneti változókat is beállíthat, hogy más feladatok számára is elérhetővé tegye a változókat. További információ: Változók definiálása.

Elnevezett paramétereket is használhat a PowerShell-szkriptekben. Más típusú paraméterek, például kapcsolóparaméterek nem támogatottak. További információ: Parancsmagparaméterek deklarálása.

PowerShell-szkriptfeladat

PowerShell-szkript használatához adja hozzá a PowerShell v2 (PowerShell@2) feladatot a folyamathoz, majd írjon be egy beágyazott PowerShell-szkriptet, vagy hívjon meg egy PowerShell-szkriptfájlt.

A build a kód aktív ágát használja. Ha a folyamatfuttatás a main kód ágát használja, a szkript az ágat main is használja.

Az alábbi példa egy beágyazott szkriptet használ targetType: 'inline' és ad hozzá a script tulajdonsághoz.

steps:
- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: Write-Host "Hello world!"

Az alábbi példa hozzáadja a PowerShell@2 lépést egy YAML-folyamathoz. A kód meghív egy test.ps1 nevű PowerShell-szkriptfájlt az adattár gyökerében.

steps:
- task: PowerShell@2
  inputs:
    targetType: 'filePath'
    filePath: 'test.ps1'

Feljegyzés

A feladat alapértelmezés szerint Windows-ügynökökhöz PowerShell@2 a Windows PowerShell 5.1-et, Linux/macOS-ügynökökhöz pedig PowerShell 7.x-et használ. A PowerShell 7.x Windows-ügynökökön való használatához telepítve kell lennie a PowerShell 7.x.-nek, és hozzá kell adnia a paramétert a pwsh következőhöz true: . A Microsoft által üzemeltetett ügynökök alapértelmezés szerint telepítették a PowerShell 7.x-et.

A YAML-folyamathoz a lépés parancsikonjaként pwsh is hozzáadhat egy powershell vagy PowerShell@2 több lépést. A pwsh parancsikon MacOS, Linux vagy Windows rendszeren futtatja a PowerShell 7.x-et. A powershell parancsikon a Windows PowerShell 5.1-et Futtatja Windows vagy PowerShell 7.x rendszeren Linuxon és macOS rendszeren.

steps:
- pwsh: test.ps1

steps:
- pwsh: Write-Host Hello

Példaszkript a verzió szerelvényekre való alkalmazásához

Az alábbi PowerShell-szkript buildszámon alapuló verziót alkalmaz a szerelvényekre. Ha például a buildszámformátum definíciója $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r) létrehozza a Build HelloWorld_2024.07.19.1 buildszámot, a szkript a 2024.07.19.1-es verziót alkalmazza a szerelvényekre.

A szkript sikeres futtatásához a buildszámformátumnak négy szegmensből kell állnia. További információt a Számok futtatása vagy összeállítása című témakörben talál.

Feljegyzés

A buildszámot futtatási számnak is nevezik.

  1. Testre szabhatja a yaml-folyamat buildszámdefinícióját a name folyamat gyökérszintjén található tulajdonság használatával.

    name: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)
    
  2. Mentse a következő PowerShell-szkriptet fájlként az adattár gyökerénél.

  3. Adjon hozzá egy feladatlépést PowerShell@2 vagy pwshpowershell parancsikont a folyamathoz, és hívja meg a PowerShell-szkriptfájl elérési útját a munkakönyvtárhoz képest.

PowerShell-szkript a verziók szerelvényekre való alkalmazásához:

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

Példaszkript a REST API eléréséhez

Az alábbi PowerShell-szkript környezeti változókat használ az Azure Pipelines REST API eléréséhez és a folyamatdefiníció lekéréséhez.

A YAML-folyamatban definiálhatja a környezeti változót $env:SYSTEM_ACCESSTOKEN egy PowerShell@2 tevékenységben, és a beágyazott szkriptben használhatja az OAuth-jogkivonat lekéréséhez a REST API eléréséhez.

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