Test-AndCommit.ps1
param ($projectName = (Split-Path (Split-Path $MyInvocation.MyCommand.Source) -leaf), [switch]$forcePublish, [switch]$IgnoreTest) # $projectName = 'PSOpt2' #Import-Module .\$projectName.psd1 -wa 0 -Force # needed for coverage While ($true) { #Copy-Item '.\$projectName*.ps?1' C:\Users\alopez\Documents\WindowsPowerShell\Modules\$projectName -Force #Import-Module C:\Users\alopez\Documents\WindowsPowerShell\Modules\$projectName\$projectName.psd1 -Force -wa 0 write-center "$projectName - $(get-date -Format 's')" if(!(test-path ".\$projectName.psd1")){ New-ModuleManifest -Path ".\$projectName.psd1" -ModuleVersion '0.0.0.1' -Author $env:USERNAME -CompanyName 'Coaxis-Asp' -RootModule ".\$projectName.psm1" write-logStep 'Creation du manifest',"Penser a editer le [$projectName.psd1] pour les details" ok } $psd1 = Get-Module ".\$projectName.psd1" -ListAvailable # $version = $psd1.Version $FileList = (Get-ChildItem -Recurse ".\$projectName-*.ps*1",".\$projectName.ps*1") | Sort-Object $moduleVersion = [Version]::new($psd1.Version.Major,$psd1.Version.Minor,$psd1.Version.Build,$psd1.Version.Revision+1) $NestedModule = ((Get-ChildItem -Recurse ".\$projectName*.psm1" -Exclude $psd1.RootModule).FullName | Resolve-Path -Relative -ea 0) -replace('^.\\','') | Sort-Object if(!$NestedModule){ $NestedModule = $false } Update-ModuleManifest -Path ".\$projectName.psd1" ` -RootModule ".\$projectName.psm1" ` -FileList $FileList ` -ModuleVersion $moduleVersion ` -ReleaseNotes '-' ` -NestedModules $NestedModule ` -FunctionsToExport '*' ` -AliasesToExport '*' -wa 0 # (Get-Module ".\$projectName*.psd1" -ListAvailable).ExportedCommands.Keys if(($NestedModule = (Get-ChildItem -Recurse ".\$projectName-*.psm1" -Exclude $psd1.RootModule).FullName)){ Write-Debug $NestedModule $NestedModule = ($NestedModule | Resolve-Path -Relative -ea 0) -replace('^.\\','') | Sort-Object Update-ModuleManifest -Path ".\$projectName.psd1" -NestedModules $NestedModule } Update-ModuleManifest -Path ".\$projectName.psd1" -FunctionsToExport (Get-Module ".\$projectName*.psd1" -ListAvailable).ExportedFunctions.values | ?{$_ -notmatch 'is-'} Remove-Module "$projectName*" -ea 0 if (!$IgnoreTest) { $testResult = Invoke-Pester ".\$projectName.tests.ps1" -CodeCoverage ".\$projectName*.psm1" <#StartLine = 1; EndLine = $(Get-LineNumberOfPattern '.\$projectName.psm1' '# STOP > not Count on CodeCoverage by Pester under this line ')#> -PassThru $testResult.CodeCoverage.MissedCommands = $testResult.CodeCoverage.HitCommands = $testResult.TestResult = $null $testResult | ConvertTo-Json | out-file '.\result.test.json' -Force } else { $testResult = [PSCustomObject]@{ CodeCoverage = [PSCustomObject]@{ NumberOfCommandsAnalyzed = 1 NumberOfFilesAnalyzed = $null NumberOfCommandsExecuted = 0 NumberOfCommandsMissed = $null MissedCommands = $null HitCommands = $null AnalyzedFiles = $null } TestResult = $null time = 0 FailedCount = 0 Passedcount = 0 } } write-center "$projectName - $($testResult.time.Minutes)min $($testResult.time.Seconds)sec" if (!$testResult.FailedCount -or $forcePublish){ Import-Module BrightModule -Force -wa 0 write-logStep 'Pester + modif',"FailedCount [$([int]$testResult.FailedCount)]","forcePublish [$forcePublish]" ok $forcePublish = $null if ((Check-SHA256AsChanged (Get-ChildItem "$projectName*.ps*1" -Recurse).fullName)) { $NewVersion = @(Get-Content ".\$projectName.psd1" | Where-Object{$_ -match 'ModuleVersion'})[0].split("`'")[1] Check-SHA256AsChanged (Get-ChildItem "$projectName*.ps*1" -Recurse).fullName -save | out-null write-logStep 'Pester + modif',"Cette Version $NewVersion est commitable !" ok $commitMsg = "feat(Auto-Commit): $newversion [$($testResult.Passedcount) Tests succefull], Coverage $(($testResult.CodeCoverage.NumberOfCommandsExecuted / $testResult.CodeCoverage.NumberOfCommandsAnalyzed).ToString("P2"))" $NewValue = Input-Box -Message "Confirmer le commit" -Title "$projectName : Commit et Push" $commitMsg if ($NewValue.out -eq 'OK') { git commit -am "$($NewValue.value)." | Out-Null git push origin master git push githuborigin master write-logStep 'Git Commit Source Pull',$NewVersion ok remove-item "$env:tmp\WindowsPowerShell\modules","C:\Git\Zip-Module\$projectName.zip" -force -Recurse -ea 0 $folder = (new-item -ItemType Directory "$env:tmp\WindowsPowerShell\modules\$projectName" -force) Get-ChildItem -Exclude 'Test-AndPublish.ps1','*.json','*.txt','*.code-workspace' | Copy-Item -Destination $folder -Exclude '*.ico','*.jpg','*.png','*.test.ps1' -Recurse Get-ChildItem $folder -Recurse -Hidden | remove-item -force -Recurse -ea 0 # supprime les element caché ! Publish-Module -Path $folder -Repository 'Coaxis-Asp_PSRepository' -Force -ReleaseNotes "$($NewValue.value)" -wa 0 Write-LogStep "Publish ","Inside",'Coaxis-Asp_PSRepository',$folder ok Publish-Module -Path $folder -Repository PSGallery -NuGetApiKey 'oy2khtb3npflpmdaemoaojmmowbrihnexh65jifesbncba' -Force -ReleaseNotes "$($NewValue.value)" -wa 0 write-logStep 'Publication du module ',"Repository 'PSGallery'",$NewVersion ok try { Update-Module -name $projectName -RequiredVersion $NewVersion -ea STOP write-logStep 'Mise a Jour Locale ','Scope CurrentUser',$NewVersion ok } catch { write-logStep 'Update Module ',$projectName,"Is currently not installed !" error # Install-Module -name $projectName -Repository 'Coaxis-Asp_PSRepository' -force -Scope CurrentUser -Verbose # Uninstall-Module -name $projectName -Verbose } } else { git commit -am "$CommitMsg." | Out-Null git push origin master git push githuborigin master write-logStep 'Git Commit Source Pull',$NewVersion, 'No Publish !' ok get-item ".\$projectName-*.ps*1",".\$projectName.ps*1" | Copy-Item -Destination "C:\Users\$env:USERNAME\Documents\WindowsPowerShell\Modules\$projectName\" -force write-logStep 'Not Published but commited ','Updated for local Test & Usage ...',$NewVersion Warn } } else { write-logStep 'Rien a commiter ',"aucun fichier [$projectName*.ps*1] modifie depuis la derniere fois" warn } } else { write-logStep 'Non Commitable ',"Les tests ne passe pas !" warn } Check-SHA256AsChanged (Get-ChildItem "$projectName*.ps*1" -Recurse).fullName -save | out-null start-sleep -s 10 write-logStep 'Waiting Change in Code',"$projectName.psm1" wait $i=0 while (!(Check-SHA256AsChanged (Get-ChildItem "$projectName*.ps*1" -Recurse).fullName)) { start-sleep -s 10 # Write-host '.' -nonewline $i++ if ($i%120 -eq 0){ Write-host '.' -fore RED -nonewline # toute les 20min } } write-logStep 'Has Changed ','Available','Run Pester test !' ok } |