Skip to content

Publish ibPS PowerShell Module #44

Publish ibPS PowerShell Module

Publish ibPS PowerShell Module #44

name: Publish ibPS PowerShell Module
on:
workflow_dispatch:
inputs:
customVersion:
type: choice
description: 'Custom Version'
default: 'false'
options:
- true
- false
versionNumber:
type: string
description: 'Define Version Number'
jobs:
ibPS-Build-And-Publish:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Update Module Manifest & Change Tracking
shell: pwsh
run: |
Write-Host "Updating changes to Module.."
Copy-Item "./Modules/BloxOne-Main.ps1" "./Modules/ibPS/BloxOne-Main.psm1" -Force
Write-Host "Testing Module Manifest.."
$Module = Test-ModuleManifest -Path "./Modules/ibPS/ibPS.psd1"
$CustomModuleVersion = "${{ inputs.customVersion }}"
if ($CustomModuleVersion -eq "true") {
[version]$ModuleVersion = "${{ inputs.versionNumber }}"
} else {
$ModuleVersion = $Module.Version
$ModuleVersion = [version]::New($ModuleVersion.Major,$ModuleVersion.Minor,$ModuleVersion.Build,$ModuleVersion.Revision+1)
}
Write-Host "Updating release notes"
$ReleaseNotes = Get-Content -Path './RELEASE.md' -Raw
## Functions to export
$B1PublicFunctions = Get-ChildItem "./Modules/ibPS/Functions/BloxOne/" -Exclude Private | Get-ChildItem -Recurse
$NIOSPublicFunctions = Get-ChildItem "./Modules/ibPS/Functions/NIOS/" -Exclude Private | Get-ChildItem -Recurse
$MiscellaneousFunctions = Get-ChildItem "./Modules/ibPS/Functions/Misc/*.ps1" | Where-Object {$_.BaseName -ne 'Misc'}
$AdditionalFunctionsToExport = @('Invoke-CSP')
## Export Aliases
Write-Host "Exporting aliases.."
$null = Import-Module './Modules/ibPS/BloxOne-Main.psm1'
$null = Resolve-DoHQuery -Query google.com -DoHServer 1.1.1.1
$Aliases = (Get-Alias | Where-Object {$_.Source -eq "BloxOne-Main"}).Name
## Export Functions
Write-Host "Updating Module Manifest to v$ModuleVersion.."
Update-ModuleManifest "./Modules/ibPS/ibPS.psd1" -ModuleVersion $ModuleVersion -FunctionsToExport ($(@($B1PublicFunctions + $NIOSPublicFunctions + $MiscellaneousFunctions) | Select-Object -ExpandProperty BaseName) + $AdditionalFunctionsToExport) -AliasesToExport $Aliases -ReleaseNotes "https://ibps.readthedocs.io/en/latest/Change%20Log/"
## Export Manifest info to JSON file
Write-Host "Counting functions.."
$Module = Test-ModuleManifest -Path "./Modules/ibPS/ibPS.psd1" | Select-Object Name,@{name="Version";expression={$_.Version.ToString()}},Description,Author,ProjectUri,LicenseUri,ReleaseNotes,CompanyName,Copyright,ExportedFunctions
$Module | Add-Member -MemberType NoteProperty -Name "Count" -Value $Module.ExportedFunctions.Count
$Module | Select-Object -ExcludeProperty ExportedFunctions | ConvertTo-Json -Depth 5 | Out-File ./docs/manifest.json -Force
## Update Build JSON
$Branch = git rev-parse --abbrev-ref HEAD
if ($Branch -eq 'main') {
Write-Host "Updating Build JSON.."
$Build = Get-Content Modules/ibPS/Functions/Misc/build.json | ConvertFrom-Json
$Build.Build = '0'
$Build.SHA = $ENV:GITHUB_SHA
$Build.Branch = $Branch
Set-Content -Path Modules/ibPS/Functions/Misc/build.json -Value $($Build | ConvertTo-Json)
}
Write-Host "Updating CHANGELOG.."
$ChangeHistory = Get-Content -Path './CHANGELOG.md' -Raw
$ModuleVersionString = "## $($ModuleVersion.ToString())"
Set-Content -Path './CHANGELOG.md' -Value ($ModuleVersionString + "`r`n" + $ReleaseNotes + "`r`n`r`n" + $ChangeHistory)
Write-Host "Export Github Actions Environment Variables.."
$Version = "v$($ModuleVersion.ToString())"
Write-Output "ModuleVersion=$($Version)" | Out-File -FilePath $ENV:GITHUB_ENV -Encoding utf8 -Append
Write-Output "ReleaseNotes<<EOF" | Out-File -FilePath $ENV:GITHUB_ENV -Encoding utf8 -Append
Write-Output "$($ReleaseNotes)" | Out-File -FilePath $ENV:GITHUB_ENV -Encoding utf8 -Append
Write-Output "EOF" | Out-File -FilePath $ENV:GITHUB_ENV -Encoding utf8 -Append
- name: Install platyPS module
shell: pwsh
run: |
Write-Host "Installing platyPS Powershell Module.."
git clone https://github.com/TehMuffinMoo/platyPS /tmp/platyPS
- name: Update Documentation
shell: pwsh
run: |
Write-Host "Importing platyPS Module.."
Import-Module '/tmp/platyPS/src/platyPS/platyPS.psd1' -ErrorAction Stop
Write-Host "Creating temporary docs directory.."
New-Item -ItemType Directory './docs-temp'
Write-Host "Importing ibPS Module.."
Import-Module './Modules/ibPS/ibPS.psd1' -Force -DisableNameChecking
Write-Host "Import ibPS Classes.."
. ./Modules/ibPS/Functions/BloxOne/Private/Classes.ps1
Write-Host "Obtaining list of excluded docs.."
$ExcludedDocs = Import-Csv ./docs/exclusions.csv -Header 'doc'
Write-Host "Updating documentation.."
$DocumentationVersion = (Test-ModuleManifest -Path "./Modules/ibPS/ibPS.psd1").Version.ToString()
New-MarkdownHelp -Module ibPS -OutputFolder './docs-temp' -HelpVersion $($DocumentationVersion) -Force
Write-Host "Cleaning up old documentation.."
$OldDocs = Get-ChildItem ./docs/BloxOne -Recurse -File | where {$_.Name -notin $ExcludedDocs.doc} | Remove-Item -Force
$OldDocs = Get-ChildItem ./docs/General -Recurse -File | where {$_.Name -notin $ExcludedDocs.doc} | Remove-Item -Force
$OldDocs = Get-ChildItem ./docs/NIOS -Recurse -File | where {$_.Name -notin $ExcludedDocs.doc} | Remove-Item -Force
Write-Host "Relocating documentation.."
foreach ($F in Get-ChildItem './Modules/ibPS/Functions/' -Recurse) {
$DocToFind = "./docs-temp/$($F.BaseName).md"
if ((Test-Path $DocToFind) -and "$($F.BaseName).md" -notin $($ExcludedDocs.doc)) {
$BaseName = (Get-Item $F.DirectoryName).BaseName
switch ($BaseName) {
"BloxOneDDI" {
$BaseName = "$((Get-Item (Split-Path $($F.DirectoryName))).BaseName)/BloxOne DDI"
}
"BloxOneTD" {
$BaseName = "$((Get-Item (Split-Path $($F.DirectoryName))).BaseName)/BloxOne Threat Defense"
}
"BloxOnePlatform" {
$BaseName = "$((Get-Item (Split-Path $($F.DirectoryName))).BaseName)/BloxOne Platform"
}
"BloxOneCloud" {
$BaseName = "$((Get-Item (Split-Path $($F.DirectoryName))).BaseName)/BloxOne Cloud"
}
"Wrapper" {
$BaseName = "$((Get-Item (Split-Path $($F.DirectoryName))).BaseName)/Generic Wrapper"
}
"Misc" {
$BaseName = "General"
}
"Cleanup" {
$BaseName = "$((Get-Item (Split-Path $($F.DirectoryName))).BaseName)/Cleanup"
}
"Tools" {
$BaseName = "$((Get-Item (Split-Path $($F.DirectoryName))).BaseName)/Tools"
}
"Profiles" {
$BaseName = "$((Get-Item (Split-Path $($F.DirectoryName))).BaseName)/Profiles"
}
"Private" {
$BaseName = "$((Get-Item (Split-Path $($F.DirectoryName))).BaseName)/Functions"
}
}
Move-Item "$($DocToFind)" "./docs/$($BaseName)/" -Force
}
}
Copy-Item './CHANGELOG.md' './docs/Change Log.md' -Force
Write-Host "Removing temporary docs directory.."
Remove-Item './docs-temp' -Recurse -Force -Confirm:$false
- name: Build and Publish
id: build
env:
NUGET_KEY: ${{ secrets.NUGET_KEY }}
shell: pwsh
run: |
$Branch = git rev-parse --abbrev-ref HEAD
Write-Output ("Branch=$($Branch)") | Out-File -FilePath $ENV:GITHUB_ENV -Encoding utf8 -Append
$Manifest = Test-ModuleManifest -Path "./Modules/ibPS/ibPS.psd1"
if ($($Manifest).Version -gt $(Find-Module ibPS).Version) {
if ($Branch -eq "main") {
Write-Host "Publishing v$($Manifest.Version.ToString()).."
Copy-Item 'Modules/ibPS' '/home/runner/.local/share/powershell/Modules/' -Recurse
Publish-Module -Name "ibPS" -NuGetApiKey $env:NUGET_KEY -SkipAutomaticTags -Verbose
Write-Output "ReleaseUpdated=true" | Out-File -FilePath $ENV:GITHUB_ENV -Encoding utf8 -Append
} else {
Write-Host "Running on $($Branch) branch. Skipping publishing.."
Write-Output "ReleaseUpdated=false" | Out-File -FilePath $ENV:GITHUB_ENV -Encoding utf8 -Append
}
} else {
Write-Host "Version number is the same, skipping publishing.."
Write-Output "ReleaseUpdated=false" | Out-File -FilePath $ENV:GITHUB_ENV -Encoding utf8 -Append
}
- name: Update Repository
run: |
git config --global user.name ${{ github.actor }}
git config --global user.password ${{ secrets.GIT_ACTIONS }}
git config --global user.email 'mat.cox@tmmn.uk'
git add .
git status
if ! git diff-index --quiet HEAD; then
git commit -m "Update Module to ${{ env.ModuleVersion }}"
git push
fi
- name: Create Release
if: ${{ env.ReleaseUpdated == 'true' }}
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GIT_ACTIONS }}
with:
tag_name: ${{ env.ModuleVersion }}
release_name: Release ${{ env.ModuleVersion }}
body: ${{ env.ReleaseNotes }}
prerelease: false
draft: false
makeLatest: true