Merge pull request #2 from loanDepot/kmarquette/fingerprint

Versioning revamp
This commit is contained in:
Kevin Marquette
2018-08-20 03:41:23 -07:00
committed by GitHub
7 changed files with 165 additions and 122 deletions

View File

@@ -14,93 +14,5 @@ taskx BuildManifest @{
'Setting FunctionsToExport...' 'Setting FunctionsToExport...'
Set-ModuleFunctions -Name $ManifestPath -FunctionsToExport $functions.BaseName Set-ModuleFunctions -Name $ManifestPath -FunctionsToExport $functions.BaseName
} }
'Detecting semantic versioning...'
"Importing Module [$ManifestPath]..."
Import-Module -FullyQualifiedName $ManifestPath
"Get-Command -Module [$ModuleName]..."
$commands = Get-Command -Module $ModuleName
"Removing Module [$ModuleName]..."
Remove-Module -Name $ModuleName -Force
'Calculating fingerprint...'
$fingerprint = foreach ($command in $commands)
{
foreach ($parameter in $command.Parameters.Keys)
{
if($false -eq $command.Parameters[$parameter].IsDynamic)
{
'{0}:{1}' -f $command.Name, $command.Parameters[$parameter].Name
foreach ($alias in $command.Parameters[$parameter].Aliases)
{
'{0}:{1}' -f $command.Name, $alias
}
}
}
}
$fingerprint = $fingerprint | Sort-Object
if (Test-Path -Path '.\fingerprint')
{
$oldFingerprint = Get-Content -Path '.\fingerprint'
}
$bumpVersionType = 'Patch'
'Detecting new features...'
$features = $fingerprint |
Where-Object { $_ -notin $oldFingerprint }
foreach ($feature in $features)
{
$feature
$bumpVersionType = 'Minor'
}
'Detecting breaking changes...'
$breakingChanges = $oldFingerprint |
Where-Object { $_ -notin $fingerprint }
foreach ($breakingChange in $breakingChanges)
{
$breakingChange
$bumpVersionType = 'Major'
}
Set-Content -Path '.\fingerprint' -Value $fingerprint
# Bump the module version
$version = [version] (Get-Metadata -Path $manifestPath -PropertyName 'ModuleVersion')
if ($version -lt ([version] '1.0.0'))
{
"Module is still in beta; don't bump major version."
if ($bumpVersionType -eq 'Major')
{
$bumpVersionType = 'Minor'
}
else
{
$bumpVersionType = 'Patch'
}
}
"Stepping [$bumpVersionType] version [$version]..."
$version = [version] (Step-Version -Version $version -Type $bumpVersionType)
$build = 1
if ($null -ne $env:Build_BuildID)
{
$build = $env:Build_BuildID
}
$version = [version]::new($version.Major, $version.Minor, $version.Build, $build)
"Using version [$version]..."
"##vso[build.updatebuildnumber]$version"
Update-Metadata -Path $ManifestPath -PropertyName 'ModuleVersion' -Value $version
} }
} }

View File

@@ -1,21 +1,4 @@
task ImportDevModule { task ImportDevModule {
ImportModule -Path "$Source\$ModuleName.psd1"
if (-not(Test-Path -Path "$Source\$ModuleName.psd1"))
{
"Module [$ModuleName] is not built; cannot find [$Source\$ModuleName.psd1]."
Write-Error -Message "Could not find module manifest [$Source\$ModuleName.psd1]."
}
else
{
$loaded = Get-Module -Name $ModuleName -All
if ($loaded)
{
"Unloading Module [$ModuleName] from a previous import..."
$loaded | Remove-Module -Force
}
"Importing Module [$ModuleName] from [$Source\$ModuleName.psd1]..."
Import-Module -FullyQualifiedName "$Source\$ModuleName.psd1" -Force
}
} }

View File

@@ -1,20 +1,33 @@
function ImportModule
task ImportModule {
if (-not(Test-Path -Path $ManifestPath))
{ {
"Module [$ModuleName] is not built; cannot find [$ManifestPath]." param(
Write-Error -Message "Could not find module manifest [$ManifestPath]. You may need to build the module first." [string]$path,
[switch]$PassThru
)
if (-not(Test-Path -Path $path))
{
"Cannot find [$path]."
Write-Error -Message "Could not find module manifest [$path]"
} }
else else
{ {
$loaded = Get-Module -Name $ModuleName -All $file = Get-Item $path
$name = $file.BaseName
$loaded = Get-Module -Name $name -All -ErrorAction Ignore
if ($loaded) if ($loaded)
{ {
"Unloading Module [$ModuleName] from a previous import..." "Unloading Module [$name] from a previous import..."
$loaded | Remove-Module -Force $loaded | Remove-Module -Force
} }
"Importing Module [$ModuleName] from [$ManifestPath]..." "Importing Module [$name] from [$($file.fullname)]..."
Import-Module -FullyQualifiedName $ManifestPath -Force Import-Module -Name $file.fullname -Force -PassThru:$PassThru
} }
} }
task ImportModule {
ImportModule -Path $ManifestPath
}

View File

@@ -1,7 +1,7 @@
task FullTests { task Pester {
$requiredPercent = $Script:CodeCoveragePercent
$params = @{ $params = @{
CodeCoverage = 'Output\*\*.psm1'
CodeCoverageOutputFile = 'Output\codecoverage.xml'
OutputFile = $testFile OutputFile = $testFile
OutputFormat = 'NUnitXml' OutputFormat = 'NUnitXml'
PassThru = $true PassThru = $true
@@ -10,13 +10,18 @@ task FullTests {
Tag = 'Build' Tag = 'Build'
} }
if($requiredPercent -gt 0.00)
{
$params['CodeCoverage'] = 'Output\*\*.psm1'
$params['CodeCoverageOutputFile'] = 'Output\codecoverage.xml'
}
$results = Invoke-Pester @params $results = Invoke-Pester @params
if ($results.FailedCount -gt 0) if ($results.FailedCount -gt 0)
{ {
Write-Error -Message "Failed [$($results.FailedCount)] Pester tests." Write-Error -Message "Failed [$($results.FailedCount)] Pester tests."
} }
$requiredPercent = $Script:CodeCoveragePercent
$codeCoverage = $results.codecoverage.NumberOfCommandsExecuted / $results.codecoverage.NumberOfCommandsAnalyzed $codeCoverage = $results.codecoverage.NumberOfCommandsExecuted / $results.codecoverage.NumberOfCommandsAnalyzed
if($codeCoverage -lt $requiredPercent) if($codeCoverage -lt $requiredPercent)
{ {

View File

@@ -0,0 +1,7 @@
task PublishVersion {
[version] $sourceVersion = (Get-Metadata -Path $manifestPath -PropertyName 'ModuleVersion')
"##vso[build.updatebuildnumber]$sourceVersion"
# Do the same for appveyor
# https://www.appveyor.com/docs/build-worker-api/#update-build-details
}

View File

@@ -0,0 +1,121 @@
function GetModulePublicInterfaceMap
{
param($Path)
$module = ImportModule -Path $Path -PassThru
$exportedCommands = @(
$module.ExportedFunctions.values
$module.ExportedCmdlets.values
$module.ExportedAliases.values
)
foreach($command in $exportedCommands)
{
foreach ($parameter in $command.Parameters.Keys)
{
if($false -eq $command.Parameters[$parameter].IsDynamic)
{
'{0}:{1}' -f $command.Name, $command.Parameters[$parameter].Name
foreach ($alias in $command.Parameters[$parameter].Aliases)
{
'{0}:{1}' -f $command.Name, $alias
}
}
}
}
}
task SetVersion {
$version = $null
$versionStamp = (git rev-parse origin/master) + (git rev-parse head)
"Load current version"
[version] $sourceVersion = (Get-Metadata -Path $manifestPath -PropertyName 'ModuleVersion')
" Source version [$sourceVersion]"
$downloadFolder = Join-Path -Path $output downloads
$null = New-Item -ItemType Directory -Path $downloadFolder -Force -ErrorAction Ignore
$versionFile = Join-Path $downloadFolder versionfile
if(Test-Path $versionFile)
{
$versionFileData = Get-Content $versionFile -raw
if($versionFileData -eq $versionStamp)
{
continue
}
}
"Checking for published version"
$publishedModule = Find-Module -Name $ModuleName |
Sort-Object -Property {[version]$_.Version} -Descending |
Select -First 1
[version] $publishedVersion = $publishedModule.Version
" Published version [$publishedVersion]"
$version = $publishedVersion
"Downloading published module to check for breaking changes"
$publishedModule | Save-Module -Path $downloadFolder
[System.Collections.Generic.HashSet[string]] $publishedInterface = GetModulePublicInterfaceMap -Path (Join-Path $downloadFolder $ModuleName)
[System.Collections.Generic.HashSet[string]] $buildInterface = GetModulePublicInterfaceMap -Path $ManifestPath
$bumpVersionType = 'Patch'
if( -not $publishedInterface.IsSubsetOf($buildInterface))
{
$bumpVersionType = 'Major'
}
elseif ($publishedInterface.count -ne $buildInterface.count)
{
$bumpVersionType = 'Minor'
}
if ($version -lt ([version] '1.0.0'))
{
"Module is still in beta; don't bump major version."
if ($bumpVersionType -eq 'Major')
{
$bumpVersionType = 'Minor'
}
else
{
$bumpVersionType = 'Patch'
}
}
" Steping version [$bumpVersionType]"
$version = [version] (Step-Version -Version $version -Type $bumpVersionType)
if ($null -ne $env:Build_BuildID)
{
$build = $env:Build_BuildID
$version = [version]::new($version.Major, $version.Minor, $version.Build, $build)
}
elseif ($null -ne $env:APPVEYOR_BUILD_ID)
{
$build = $env:APPVEYOR_BUILD_ID
$version = [version]::new($version.Major, $version.Minor, $version.Build, $build)
}
" Comparing to source version [$sourceVersion]"
if($sourceVersion -gt $version)
{
" Using existing version"
$version = $sourceVersion
}
" Setting version [$version]"
Update-Metadata -Path $ManifestPath -PropertyName 'ModuleVersion' -Value $version
(Get-Content -Path $ManifestPath -Raw -Encoding UTF8) |
% trimend |
Set-Content -Path $ManifestPath -Encoding UTF8
Set-Content -Path $versionFile -Value $versionStamp -NoNewline -Encoding UTF8
if(Test-Path $BuildRoot\fingerprint)
{
Remove-Item $BuildRoot\fingerprint
}
}

View File

@@ -2,11 +2,13 @@ $Script:ModuleName = Get-ChildItem .\*\*.psm1 | Select-object -ExpandProperty Ba
$Script:CodeCoveragePercent = 0.0 # 0 to 1 $Script:CodeCoveragePercent = 0.0 # 0 to 1
. $psscriptroot\BuildTasks\InvokeBuildInit.ps1 . $psscriptroot\BuildTasks\InvokeBuildInit.ps1
task Default Build, Test, UpdateSource task Default Build, Helpify, Test, UpdateSource
task Build Copy, Compile, BuildModule, BuildManifest, Helpify task Build Copy, Compile, BuildModule, BuildManifest, SetVersion
task Helpify GenerateMarkdown, GenerateHelp task Helpify GenerateMarkdown, GenerateHelp
task Test Build, ImportModule, FullTests task Test Build, ImportModule, Pester
task Publish Build, Test, PublishModule task Publish Build, PublishVersion, Helpify, Test, PublishModule
task TFS Clean, Build, PublishVersion, Helpify, Test
task DevTest ImportDevModule, Pester
Write-Host 'Import common tasks' Write-Host 'Import common tasks'
Get-ChildItem -Path $buildroot\BuildTasks\*.Task.ps1 | Get-ChildItem -Path $buildroot\BuildTasks\*.Task.ps1 |