templates/t_build.ps1
$BuildFileContent = @"
# Include: Settings. . './<module>.settings.ps1' # Include: build_utils. . './build_utils.ps1' #Synopsis: Run/Publish Tests and Fail Build on Error. task Test Clean, RunTests, ConfirmTestsPassed #Synopsis: Run full Pipeline. task . Clean, Analyze, Test, Publish #Synopsis: Install dependencies. task InstallDependencies {} #Synopsis: Clean Artifact directory. task Clean { if (Test-Path -Path `$Artifacts) { Remove-Item "`$Artifacts/*" -Recurse -Force } New-Item -ItemType Directory -Path `$Artifacts -Force if (!(Test-Path -Path .\PSTestReport)) { & git clone https://github.com/Xainey/PSTestReport.git } } #Synopsis: Analyze code. task Analyze { `$scriptAnalyzerParams = @{ Path = `$ModulePath ExcludeRule = @('PSPossibleIncorrectComparisonWithNull', 'PSUseToExportFieldsInManifest') Severity = @('Error', 'Warning') Recurse = `$true Verbose = `$false } `$saResults = Invoke-ScriptAnalyzer @scriptAnalyzerParams # Save the results. `$saResults | ConvertTo-Json | Set-Content (Join-Path `$Artifacts "ScriptAnalysisResults.json") } #Synopsis: Run tests. task RunTests { `$invokePesterParams = @{ OutputFile = (Join-Path `$Artifacts "TestResults.xml") OutputFormat = "NUnitXml" Strict = `$true PassThru = `$true Verbose = `$false EnableExit = `$false CodeCoverage = (Get-ChildItem -Path "`$ModulePath\*.ps1" -Exclude "*.Tests.*" -Recurse).FullName } `$testResults = Invoke-Pester @invokePesterParams `$testResults | ConvertTo-Json -Depth 5 | Set-Content (Join-Path `$Artifacts "PesterResults.json") `$options = @{ BuildNumber = `$BuildNumber GitRepo = `$Settings.GitRepo GetRepoUrl = `$Settings.ProjectUrl CiURL = `$Settings.CiURL ShowHitCommands = `$true Compliance = (`$PercentCompliance / 100) ScriptAnalyzerFile = (Join-Path `$Artifacts "ScriptAnalysisResults.json") PesterFile = (Join-Path `$Artifacts "PesterResults.json") OutputDir = "`$Artifacts" } . ".\PSTestReport\Invoke-PSTestReport.ps1" @options } #Synopsis: Confirm that tests passed. task ConfirmTestsPassed { # Fail Build after reports are created, this allows CI to publish test results before failing [xml]`$xml = Get-Content (Join-Path `$Artifacts "TestResults.xml") `$numberFails = `$xml."test-results".failures assert(`$numberFails -eq 0) ('Failed "{0}" unit tests.' -f `$numberFails) # Fail Build if Coverage is under requirement `$json = Get-Content (Join-Path `$Artifacts "PesterResults.json") | ConvertFrom-Json `$overallCoverage = [Math]::Floor((`$json.CodeCoverage.NumberOfCommandsExecuted / `$json.CodeCoverage.NumberOfCommandsAnalyzed) * 100) assert(`$OverallCoverage -gt `$PercentCompliance) ('A Code Coverage of "{0}" does not meet the build requirement of "{1}"' -f `$overallCoverage, `$PercentCompliance) } #Synopsis: Publish to SMB File Share. task Publish { `$moduleInfo = @{ RepositoryName = `$Settings.SMBRepositoryName RepositoryPath = `$Settings.SMBRepositoryPath ModuleName = `$ModuleName ModulePath = "`$ModulePath\`$ModuleName.psd1" BuildNumber = `$BuildNumber } Publish-PSModule @moduleInfo -Verbose } "@ |