다음을 통해 공유


파이프라인을 사용자 지정하는 PowerShell 스크립트

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

이 문서에서는 코드를 컴파일 및 테스트하는 것 이상으로 이동하고 PowerShell 스크립트를 사용하여 파이프라인에 비즈니스 논리를 추가하는 방법을 설명합니다. Azure Pipelines PowerShell 작업은 파이프라인에서 PowerShell 스크립트를 실행합니다. PowerShell을 사용하여 Azure DevOps REST API에 액세스하거나, Azure DevOps 작업 항목 및 테스트 관리를 사용하거나, 필요에 따라 다른 서비스를 호출할 수 있습니다.

직접 설정한 사용자 정의 변수를 포함하여 PowerShell 스크립트에서 변수를 사용할 수 있습니다 . 모든 Azure Pipelines에서 사용할 수 있는 미리 정의된 변수를 사용하고 다중 작업 출력 변수를 설정하여 향후 작업에 변수를 사용할 수 있도록 할 수도 있습니다. 자세한 내용은 변수 정의를 참조 하세요.

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

파이프라인에 PowerShell 스크립트 추가

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

Windows 빌드 에이전트에서 Windows PowerShell을 실행하거나 모든 플랫폼에서 PowerShell Core를 실행할 수 있습니다. PowerShell Core를 포함하는 구문은 Windows PowerShell의 구문과 약간 다릅니다.

PowerShell 스크립트를 리포지토리에 푸시한 후 파이프라인에 한 pwsh 단계 또는 powershell 단계를 추가합니다. pwsh 키워드와 powershell 키워드는 모두 PowerShell 작업을 실행하는 바로 가기입니다.

PowerShell Core의 예:

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

Windows PowerShell의 예:

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

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

이 섹션의 예제 스크립트는 어셈블리 속성 파일에 버전을 적용합니다. 스크립트가 성공적으로 실행되도록 하려면 정의된 빌드 번호 형식에 4개의 마침표가 있어야 합니다. 예를 들면 다음과 같습니다 $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r).

참고 항목

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

속성을 사용하여 YAML 파이프라인에서 빌드 번호를 사용자 지정합니다 name . 속성은 name 파이프라인의 루트 수준에 있어야 합니다. 자세한 내용은 실행 또는 빌드 번호 구성을 참조 하세요.

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

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

# 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에 액세스하는 예제 스크립트

이 예제에서는 변수를 SYSTEM_ACCESSTOKEN 사용하여 Azure Pipelines REST API액세스합니다.

YAML 파이프라인의 인라인 스크립트에서 OAuth 토큰에 액세스하는 데 사용할 $env:SYSTEM_ACCESSTOKEN 수 있습니다.

YAML 파이프라인의 다음 인라인 PowerShell 스크립트는 OAuth 토큰을 사용하여 파이프라인 정의를 검색하는 Azure Pipelines 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)