다음을 통해 공유


파이프라인에 대한 PowerShell 스크립트

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

이 문서에서는 PowerShell 스크립트가 Azure Pipelines에 비즈니스 논리를 추가하는 방법을 설명합니다. PowerShell v2(PowerShell@2) 작업은 Azure DevOps REST API에 액세스하거나, Azure DevOps 작업 항목을 사용하거나, 테스트를 관리하거나, 다른 서비스를 호출할 수 있는 PowerShell 스크립트를 실행합니다.

PowerShell 스크립트에서 미리 정의된 변수 또는 사용자 정의 변수 를 사용할 수 있습니다. 다중 작업 출력 변수를 설정하여 변수를 다른 작업에 사용할 수 있도록 할 수도 있습니다. 자세한 내용은 변수 정의를 참조 하세요.

PowerShell 스크립트에서 명명된 매개 변수를 사용할 수도 있습니다. 스위치 매개 변수와 같은 다른 종류의 매개 변수는 지원되지 않습니다. 자세한 내용은 cmdlet 매개 변수를 선언하는 방법을 참조 하세요.

PowerShell 스크립트 작업

PowerShell 스크립트를 사용하려면 파이프라인에 PowerShell v2(PowerShell@2) 작업을 추가한 다음, 인라인 PowerShell 스크립트를 입력하거나 PowerShell 스크립트 파일을 호출합니다.

빌드는 코드의 활성 분기를 사용합니다. 파이프라인 실행에서 코드의 분기를 main 사용하는 경우 스크립트도 분기를 main 사용합니다.

다음 예제에서는 targetType: 'inline'를 사용하고 script 속성에 인라인 스크립트를 추가합니다.

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

다음 예제에서는 YAML 파이프라인에 단계를 추가합니다 PowerShell@2 . 이 코드는 리포지토리의 루트에 있는 test.ps1 이라는 PowerShell 스크립트 파일을 호출합니다.

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

참고 항목

기본적으로 이 PowerShell@2 작업은 Windows 에이전트에 Windows PowerShell 5.1을 사용하고 Linux/macOS 에이전트에는 PowerShell 7.x를 사용합니다. Windows 에이전트에서 PowerShell 7.x를 사용하려면 반드시 PowerShell 7.x가 설치되어 있어야 하며, 매개 변수 집합을 pwsh에 추가하여 true를 완료해야 합니다. Microsoft 호스팅 에이전트 에는 기본적으로 PowerShell 7.x가 설치되어 있습니다.

YAML 파이프라인에 pwsh 단계의 바로 가기로 powershell 또는 PowerShell@2 단계를 추가할 수도 있습니다. pwsh 단축키는 macOS, Linux 또는 Windows에서 PowerShell 7.x를 실행합니다. 바로 가기는 powershell Windows에서 Windows PowerShell 5.1을 실행하거나 Linux 및 macOS의 PowerShell 7.x를 실행합니다.

steps:
- pwsh: test.ps1

steps:
- pwsh: Write-Host Hello

어셈블리에 버전을 적용하는 예제 스크립트

다음 PowerShell 스크립트는 빌드 번호를 기반으로 하는 버전을 어셈블리에 적용합니다. 예를 들어 빌드 번호 형식 정의 $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r) 에서 빌드 번호 Build HelloWorld_2024.07.19.1을 생성하는 경우 스크립트는 버전 2024.07.19.1 을 어셈블리에 적용합니다.

이 스크립트가 성공적으로 실행되도록 하려면 빌드 번호 형식에 4개의 세그먼트가 있어야 합니다. 자세한 내용은 실행 또는 빌드 번호를 참조하세요.

참고 항목

빌드 번호를 실행 번호라고도합니다.

  1. 파이프라인의 루트 수준에서 속성을 사용하여 name YAML 파이프라인에서 빌드 번호 정의를 사용자 지정합니다.

    name: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)
    
  2. 다음 PowerShell 스크립트를 리포지토리의 루트에 파일로 저장합니다.

  3. PowerShell@2 작업 단계 또는 pwshpowershell 바로 가기를 파이프라인에 추가하고 작업 디렉터리를 기준으로 PowerShell 스크립트 파일의 파일 경로를 호출합니다.

어셈블리에 버전을 적용하는 PowerShell 스크립트:

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

REST API에 액세스하는 예제 스크립트

다음 PowerShell 스크립트는 환경 변수를 사용하여 Azure Pipelines REST API 에 액세스하고 파이프라인 정의를 검색합니다.

YAML 파이프라인에서 작업에서 환경 변수 $env:SYSTEM_ACCESSTOKENPowerShell@2 정의하고 인라인 스크립트에서 이를 사용하여 OAuth 토큰을 가져와 REST API에 액세스할 수 있습니다.

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