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

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

코드 컴파일 및 테스트의 기본 사항 이상으로 이동할 준비가 되면 PowerShell 스크립트를 사용하여 빌드 파이프라인에 팀의 비즈니스 논리를 추가합니다. Windows 빌드 에이전트에서 Windows PowerShell을 실행할 수 있습니다. PowerShell Core는 모든 플랫폼에서 실행됩니다.

PowerShell 스크립트 추가

PowerShell Core를 포함하는 구문은 Windows PowerShell 구문과 약간 다릅니다.

  1. PowerShell 스크립트를 리포지토리에 푸시합니다.

  2. 또는 pwsh 단계를 추가합니다 powershell . pwsh 키워드(keyword) PowerShell Core용 PowerShell 작업의 바로 가기입니다. powershell 키워드(keyword) PowerShell 작업의 또 다른 바로 가기입니다.

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

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

PowerShell 스크립트 예제: 버전 어셈블리

다음은 어셈블리의 버전을 지정하는 예제 스크립트입니다. 스크립트가 성공적으로 실행되도록 하려면 4개의 마침표(예: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r))가 있는 형식을 사용하도록 빌드 번호를 업데이트해야 합니다. 빌드 번호를 실행 번호라고도 합니다.

속성을 사용하여 YAML 파이프라인 name 내에서 빌드 번호를 사용자 지정할 수 있습니다.

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

PowerShell 스크립트 예제: REST API 액세스

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

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

- 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

내 스크립트에서 사용할 수 있는 변수는 무엇인가요?

스크립트에서 미리 정의된 변수를 사용할 수 있습니다. 사용 가능한 변수 및 사용 방법에 대한 자세한 내용은 미리 정의된 변수 사용을 참조 하세요.

어떻게 할까요? 후속 스크립트 및 태스크에서 읽을 수 있도록 변수를 설정하시겠습니까?

스크립트에서 빌드 변수를 정의하는 방법에 대한 자세한 내용은 스크립트에서 빌드 변수 정의 및 수정을 참조하세요.

스크립트에서 릴리스 변수를 정의하는 방법에 대한 자세한 내용은 스크립트에서 릴리스 변수 정의 및 수정을 참조 하세요.

빌드가 실행되는 스크립트의 분기는 무엇입니까?

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

어떤 종류의 매개 변수를 사용할 수 있나요?

명명된 매개 변수를 사용할 수 있습니다. 스위치 매개 변수와 같은 다른 종류의 매개 변수는 지원되지 않습니다. 스위치 매개 변수를 사용하려고 하면 오류가 표시됩니다.

TFS 온-프레미스를 사용하고 있지만 일부 기능이 표시되지 않습니다. 이유는 무엇인가요?

일부 기능은 Azure Pipelines에서만 사용할 수 있으며 온-프레미스에서는 아직 사용할 수 없습니다. 최신 버전의 TFS로 업그레이드한 경우 일부 기능을 온-프레미스에서 사용할 수 있습니다.