PSRule-vscode/pipeline.build.ps1

218 строки
6.8 KiB
PowerShell

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
# Invoke-Build
# CI pipeline script for PSRule-vscode
[CmdletBinding()]
param (
[Parameter(Mandatory = $False)]
[String]$Build = '0.0.1',
[Parameter(Mandatory = $False)]
[ValidateSet('preview', 'stable', 'dev')]
[String]$Channel = 'preview',
[Parameter(Mandatory = $False)]
[String]$Configuration = 'Debug',
[Parameter(Mandatory = $False)]
[String]$OutputPath = (Join-Path -Path $PWD -ChildPath out),
[Parameter(Mandatory = $False)]
[String]$ApiKey,
[Parameter(Mandatory = $False)]
[String]$AssertStyle = 'AzurePipelines'
)
$commitId = git log --format="%H" -n 1;
Write-Host -Object "[Pipeline] -- PWD: $PWD" -ForegroundColor Green;
Write-Host -Object "[Pipeline] -- OutputPath: $OutputPath" -ForegroundColor Green;
Write-Host -Object "[Pipeline] -- BuildNumber: $($Env:BUILD_BUILDNUMBER)" -ForegroundColor Green;
Write-Host -Object "[Pipeline] -- CommitId: $($commitId)" -ForegroundColor Green;
Write-Host -Object "[Pipeline] -- SourceBranch: $($Env:BUILD_SOURCEBRANCH)" -ForegroundColor Green;
Write-Host -Object "[Pipeline] -- SourceBranchName: $($Env:BUILD_SOURCEBRANCHNAME)" -ForegroundColor Green;
if ($Env:SYSTEM_DEBUG -eq 'true') {
$VerbosePreference = 'Continue';
}
if ($Env:BUILD_SOURCEBRANCH -like '*/tags/*' -and $Env:BUILD_SOURCEBRANCHNAME -like 'v2.*') {
$Build = $Env:BUILD_SOURCEBRANCHNAME.Substring(1);
}
$version = $Build;
# Handle channel
if ([String]::IsNullOrEmpty('Channel')) {
$Channel = 'preview';
}
$channelSuffix = '';
$channelDisplayName = 'PSRule';
$channelCommand = '';
switch ($Channel) {
'dev' { $channelSuffix = '-dev'; $channelDisplayName = 'PSRule (Dev)'; }
'stable' { $channelSuffix = ''; $channelDisplayName = 'PSRule'; $channelCommand = ':stable' }
default { $channelSuffix = ''; $channelDisplayName = 'PSRule'; }
}
Write-Host -Object "[Pipeline] -- Using channel: $Channel" -ForegroundColor Green;
Write-Host -Object "[Pipeline] -- Using channelSuffix: $channelSuffix" -ForegroundColor Green;
Write-Host -Object "[Pipeline] -- Using version: $version" -ForegroundColor Green;
$packageRoot = Join-Path -Path $OutputPath -ChildPath 'package';
$packageName = "code$channelSuffix";
$packagePath = Join-Path -Path $packageRoot -ChildPath "$packageName.vsix";
function Get-RepoRuleData {
[CmdletBinding()]
param (
[Parameter(Position = 0, Mandatory = $False)]
[String]$Path = $PWD
)
process {
GetPathInfo -Path $Path -Verbose:$VerbosePreference;
}
}
function GetPathInfo {
[CmdletBinding()]
param (
[Parameter(Mandatory = $True)]
[String]$Path
)
begin {
$items = New-Object -TypeName System.Collections.ArrayList;
}
process {
$Null = $items.Add((Get-Item -Path $Path));
$files = @(Get-ChildItem -Path $Path -File -Recurse -Include *.ps1,*.psm1,*.psd1,*.cs | Where-Object {
!($_.FullName -like "*.Designer.cs") -and
!($_.FullName -like "*/bin/*") -and
!($_.FullName -like "*/obj/*") -and
!($_.FullName -like "*\obj\*") -and
!($_.FullName -like "*\bin\*") -and
!($_.FullName -like "*\out\*") -and
!($_.FullName -like "*/out/*")
});
$Null = $items.AddRange($files);
}
end {
$items;
}
}
task BuildExtension {
Write-Host '> Building extension' -ForegroundColor Green;
exec { & npm run compile }
}
task PackageExtension {
Write-Host '> Packaging PSRule-vscode' -ForegroundColor Green;
if (!(Test-Path -Path $packageRoot)) {
$Null = New-Item -Path $packageRoot -ItemType Directory -Force;
}
exec { & npm run package$channelCommand -- --out $packagePath }
}
# Synopsis: Install the extension in Visual Studio Code
task InstallExtension {
Write-Host '> Installing PSRule-vscode' -ForegroundColor Green;
exec { & code --install-extension $packagePath --force }
}
task VersionExtension {
# Set channel
$package = Get-Content ./package.json -Raw | ConvertFrom-Json;
if ($package.channel -ne $Channel) {
$package.channel = $Channel;
$package | ConvertTo-Json -Depth 99 | Set-Content ./package.json;
}
# Update channel name
$package = Get-Content ./package.json -Raw | ConvertFrom-Json;
if ($package.name -ne $packageName) {
$package.name = $packageName;
$package | ConvertTo-Json -Depth 99 | Set-Content ./package.json;
}
# Update channel flag
# $package = Get-Content ./package.json -Raw | ConvertFrom-Json;
# $previewFlag = $Channel -notin 'stable', 'preview';
# if ($package.preview -ne $previewFlag) {
# $package.preview = $previewFlag;
# $package | ConvertTo-Json -Depth 99 | Set-Content ./package.json;
# }
# Update channel display name
$package = Get-Content ./package.json -Raw | ConvertFrom-Json;
if ($package.displayName -ne $channelDisplayName) {
$package.displayName = $channelDisplayName;
$package | ConvertTo-Json -Depth 99 | Set-Content ./package.json;
}
if (![String]::IsNullOrEmpty($Build)) {
# Update extension version
if (![String]::IsNullOrEmpty($version)) {
Write-Verbose -Message "[VersionExtension] -- Updating extension version";
$package = Get-Content ./package.json -Raw | ConvertFrom-Json;
if ($package.version -ne $version) {
$package.version = $version;
$package | ConvertTo-Json -Depth 99 | Set-Content ./package.json;
}
}
}
}
# Synopsis: Install NuGet provider
task NuGet {
if ($Null -eq (Get-PackageProvider -Name NuGet -ErrorAction Ignore)) {
Install-PackageProvider -Name NuGet -Force -Scope CurrentUser;
}
}
# Synopsis: Install PSRule
task PSRule NuGet, {
if ($Null -eq (Get-InstalledModule -Name PSRule -MinimumVersion 2.9.0 -ErrorAction Ignore)) {
Install-Module -Name PSRule -Repository PSGallery -MinimumVersion 2.9.0 -Scope CurrentUser -Force;
}
Import-Module -Name PSRule -Verbose:$False;
}
# Synopsis: Run validation
task Rules PSRule, {
$assertParams = @{
Path = './.ps-rule/'
Style = $AssertStyle
OutputFormat = 'NUnit3'
ErrorAction = 'Stop'
As = 'Summary'
}
Assert-PSRule @assertParams -InputPath $PWD -Format File -OutputPath reports/ps-rule-file.xml;
}
# Synopsis: Remove temp files
task Clean {
Remove-Item -Path out,reports -Recurse -Force -ErrorAction Ignore;
}
# Synopsis: Restore NPM packages
task PackageRestore {
exec { & npm install --no-save }
}
task ReleaseExtension {
exec { & npm run publish$channelCommand -- --packagePath $packagePath --pat $ApiKey }
}
task Build Clean, PackageRestore, VersionExtension, PackageExtension
task Install Build, InstallExtension
task . Build
task Release VersionExtension, ReleaseExtension