PSDevOpsAddonsByWiku.ps1
<#PSScriptInfo .VERSION 2.20 .GUID dfd5369d-a676-44bb-89dd-a5e29142686a .AUTHOR wzerebecki@plottwist.games .COMPANYNAME Plot Twist .COPYRIGHT .TAGS .LICENSEURI .PROJECTURI .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES .PRIVATEDATA #> <# .DESCRIPTION Some additional functions for our DevOps, working on top of VSTeam #> Param() function Set-BenFoxAzureDevOpsPAT { $securePassword = Read-host -AsSecureString | ConvertFrom-SecureString $securePassword | Out-File -FilePath $env:USERPROFILE"\benFoxDevOpsPat.txt" } function Add-Build { Param ( [parameter(Mandatory = $true)] [ValidateSet("Ben Fox", "Ethos", "Ethos - Editor", "Anafora Shell", "Anafora Logger", "Game Framework", "Baldur", "Character Core Logic", "Benfox Character Controller", "Game Service Provider", "Nucleus")] [String[]] $BuildName ) $buildId = 0 $projectName = 'Unity Packages' switch -Exact ($BuildName) { 'Ben Fox' { $projectName = 'Ben Fox'; $buildId = 141; Break } 'Anafora Shell' { $buildId = 138; Break } 'Anafora Logger' { $buildId = 139; Break } 'Game Framework' { $buildId = 136; Break } 'Baldur' { $buildId = 137; Break } 'Character Core Logic' { $buildId = 135; Break } 'Benfox Character Controller' { $buildId = 130; Break } 'Game Service Provider' { $buildId = 108; Break } 'Nucleus' { $buildId = 103; Break } 'Ethos' { $buildId = 142; Break } 'Ethos - Editor' { $buildId = 143; Break } } if (0 -ne $buildId) { Add-VSTeamBuild -BuildDefinitionId $buildId -ProjectName $projectName } else { Write-Error "Unknown build" } } function Get-Builds { param( [Parameter (Mandatory = $true)] [String]$projectName, [Parameter (Mandatory = $false)] [Int]$top = 10 ) Write-Host $projectName -ForegroundColor Cyan Write-Host '-'.PadLeft($projectName.Length, '-') -ForegroundColor Cyan -NoNewline Get-VSTeamBuild -ProjectName $projectName -Top $top | Format-Table @{ Label = "Build Definition" Expression = { switch ($_.Result) { 'failed' { $color = "31"; break } 'succeeded' { $color = '32'; break } 'canceled' { $color = "33"; break } default { $color = "0" } } $text = $_.BuildDefinition if ('Microsoft.VisualStudio.Services.TFS' -eq $text) { $text = '(DevOps)' } $e = [char]27 "$e[${color}m$($text)${e}[0m" } }, @{ Label = "Build" Expression = { switch ($_.Result) { 'failed' { $color = "31"; break } 'succeeded' { $color = '32'; break } 'canceled' { $color = "33"; break } default { $color = "0" } } $e = [char]27 "$e[${color}m$($_.BuildNumber)${e}[0m" } }, @{ Label = "Status" Expression = { switch ($_.Status) { 'inProgress' { $color = "33"; break } 'notStarted' { $color = '36'; break } default { $color = "0" } } $e = [char]27 "$e[${color}m$($_.Status)${e}[0m" } }, @{ Label = "Result" Expression = { switch ($_.Result) { 'failed' { $color = "31"; break } 'succeeded' { $color = '32'; break } 'canceled' { $color = "33"; break } default { $color = "0" } } $e = [char]27 "$e[${color}m$($_.Result)${e}[0m" } }, @{ Label = "Requested by" Expression = { switch ($_.Result) { 'failed' { $color = "31"; break } 'succeeded' { $color = '32'; break } 'canceled' { $color = "33"; break } default { $color = "0" } } $text = $_.RequestedBy if ('Microsoft.VisualStudio.Services.TFS' -eq $text) { $text = '(DevOps)' } $e = [char]27 "$e[${color}m$($text)${e}[0m" } }, @{ Label = "Start Time" Expression = { switch ($_.Result) { 'failed' { $color = "31"; break } 'succeeded' { $color = '32'; break } 'canceled' { $color = "33"; break } default { $color = "0" } } $e = [char]27 "$e[${color}m$($_.startTime)${e}[0m" } } } function Get-AllBuilds { param( [Parameter (Mandatory = $false)] [Int]$top = 10 ) Write-Host '' Get-Builds -ProjectName 'Ben Fox' -Top $top Get-Builds -ProjectName 'Unity Packages' -Top $top } function Get-PlotTwistPackages { Param( [Parameter(Mandatory=$false)] [Switch]$includeOldFeed=$false, [Parameter(Mandatory=$false)] [Switch]$fullPackageName=$false ) $pat = Get-Content $env:USERPROFILE"\benFoxDevOpsPat.txt" | ConvertTo-SecureString $Organization = 'awesomeind' $AzureDevOpsAuthenicationHeader = @{Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$([System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pat)))")) } $UriRootFeeds = "https://feeds.dev.azure.com/$($Organization)/" $UriFeeds = $UriRootFeeds + "_apis/packaging/feeds?api-version=6.0-preview.1" $FeedResult = Invoke-RestMethod -Uri $UriFeeds -Method get -Headers $AzureDevOpsAuthenicationHeader Write-Host '' Foreach ($feed in $FeedResult.value) { if($feed.name -eq 'PlotTwistFeed') { if($includeOldFeed -eq $false) { continue; } } if($feed.name -eq 'UnityPkgFeed') { if($includeOldFeed -eq $false) { continue; } } # get packages for this feed $UriFeedPackages = $UriRootFeeds + "$($feed.project.name)/_apis/packaging/Feeds/$($feed.id)/packages?api-version=6.0-preview.1&includeDescription=true" $FeedPackageResult = Invoke-RestMethod -Uri $UriFeedPackages -Method get -Headers $AzureDevOpsAuthenicationHeader #if there are packages in feed, print them out if (0 -ne $FeedPackageResult.value.Count) { $nameWithCount = "$($feed.name) ($($FeedPackageResult.value.Count) package" if (1 -ne $FeedPackageResult.value.Count) { $nameWithCount = $nameWithCount + "s" } $nameWithCount = $nameWithCount + ")" Write-Host $nameWithCount -ForegroundColor Cyan Write-Host '-'.PadLeft($nameWithCount.Length, '-') -ForegroundColor Cyan -NoNewline $FeedPackageResult.value | ForEach-Object { $pkg = $_ $ver = $pkg.versions | Select-Object -First 1 $pkgName = $pkg.Name if($fullPackageName -eq $false) { $pkgName = $pkgName.Replace("$($feed.name).", ""); } New-Object -TypeName psobject -Property @{ PublishDate = $ver.publishDate LatestVersion = $ver.version Listed = $ver.isListed Name = $pkgName Description = $ver.packageDescription ProtocolType = $pkg.protocolType } } | Format-Table 'Name', @{ Label = "Latest" Expression = { $_.LatestVersion } }, @{ Label = "Publish Date" Expression = { $_.PublishDate } }, 'Description' } } } function Get-PlotTwistPackagesWithDownloadCountPerVersion { $pat = Get-Content $env:USERPROFILE"\benFoxDevOpsPat.txt" | ConvertTo-SecureString $Organization = 'awesomeind' $AzureDevOpsAuthenicationHeader = @{Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$([System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pat)))")) } $UriRootFeeds = "https://feeds.dev.azure.com/$($Organization)/" $UriFeeds = $UriRootFeeds + "_apis/packaging/feeds?api-version=6.0-preview.1" $FeedResult = Invoke-RestMethod -Uri $UriFeeds -Method get -Headers $AzureDevOpsAuthenicationHeader Write-Output $unsecurePat Foreach ($feed in $FeedResult.value) { Write-Host $feed.name $UriFeedPackages = $UriRootFeeds + "$($feed.project.name)/_apis/packaging/Feeds/$($feed.id)/packages?api-version=6.0-preview.1" $FeedPackageResult = Invoke-RestMethod -Uri $UriFeedPackages -Method get -Headers $AzureDevOpsAuthenicationHeader Foreach ($feedpackage in $FeedPackageResult.value) { Write-Host $feedpackage.name $UriFeedPackageVersion = $UriRootFeeds + "$($feed.project.name)/_apis/packaging/Feeds/$($feed.id)/Packages/$($feedpackage.id)/versions?api-version=6.0-preview.1" $FeedPackageVersionResult = Invoke-RestMethod -Uri $UriFeedPackageVersion -Method get -Headers $AzureDevOpsAuthenicationHeader Foreach ($feedpackageversion in $FeedPackageVersionResult.value) { Write-Host " " $feedpackageversion.version -NoNewline $BodyPackageVersionIds = @{ packageVersionIds = @($feedpackageversion.id) } | ConvertTo-Json $UriFeedPackageVersionUsage = $UriRootFeeds + "$($feed.project.name)/_apis/packaging/Feeds/$($feed.id)/Packages/$($feedpackage.id)/versionmetricsbatch?api-version=6.0-preview.1" $FeedPackageVersionUsageResult = Invoke-RestMethod -Uri $UriFeedPackageVersionUsage -ContentType "application/json" -Method Post -Body $BodyPackageVersionIds -Headers $AzureDevOpsAuthenicationHeader foreach ($feedpackageversionusage in $FeedPackageVersionUsageResult.value) { Write-Host " - " $feedpackageversionusage.downloadCount } if (0 -eq $FeedPackageVersionUsageResult.value.Count) { Write-Host "" } } } } } # function List-Npm { # param( # [Parameter (Mandatory = $true)] [String]$feed # ) # $pkgs = Get-VSTeamPackage -feedName $feed # if(0 -ne $pkgs.Count) # { # Write-Host '--------' $feed -ForegroundColor Blue # $pkgs | ForEach-Object { # $pkg = $_ # $ver = Get-VSTeamPackageVersion -feedName $feed -packageId $pkg.Id | Select-Object -First 1 # New-Object -TypeName psobject -Property @{ # PublishDate = $ver.PublishDate # Version = $ver.Version # Listed = $ver.IsListed # Name = $pkg.Name # Description = $ver.Description # } # } | Format-Table 'Name', 'Version', 'PublishDate', 'Description' # } # } # function List-AllNpm { # List-Npm 'plottwist.all.core' # List-Npm 'plottwist.all.code' # List-Npm 'plottwist.all.art' # List-Npm 'plottwist.all.ld' # List-Npm 'plottwist.benfox.core' # List-Npm 'plottwist.benfox.code' # List-Npm 'plottwist.benfox.art' # List-Npm 'plottwist.benfox.ld' # } |