Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
9efebd1
feat: support PowerShell 7.4 through 7.6
SamErde Aug 9, 2026
ccf1c46
ci: add profile-aware compatibility automation
SamErde Aug 9, 2026
ba188f5
docs: explain multitarget support and auth gates
SamErde Aug 9, 2026
5ed628c
fix(ci): guard optional PowerShellGet parameters
SamErde Aug 9, 2026
fe82694
fix(ci): make generated docs cross-platform
SamErde Aug 9, 2026
ae012f4
test: isolate runtime matrix fixtures
SamErde Aug 9, 2026
8e420e9
docs: normalize auth plan formatting
SamErde Aug 9, 2026
b271635
chore: accept initial artifact size baseline
SamErde Aug 9, 2026
055e6ea
docs: add multitargeting implementation plan
SamErde Aug 9, 2026
cb5b5b5
fix: fingerprint selected assembly evidence
SamErde Aug 9, 2026
c66fef5
fix(ci): gate releases on authenticated evidence
SamErde Aug 9, 2026
b2d1810
docs: correct supported-session guidance
SamErde Aug 9, 2026
2395bb8
fix: harden profile-aware compatibility tooling
SamErde Aug 9, 2026
9592069
fix(ci): fail closed across runtime workflows
SamErde Aug 9, 2026
83892c6
test: cover profile-aware policy edge cases
SamErde Aug 9, 2026
c241d40
docs: clarify validation evidence policy
SamErde Aug 9, 2026
f7c98d1
fix(ci): stabilize profile evidence generation
SamErde Aug 9, 2026
bc9e7a3
fix: ship cross-platform ProtectedData support
SamErde Aug 9, 2026
bf15c2d
fix(ci): isolate profile evidence outputs
SamErde Aug 9, 2026
3028c49
fix: harden profile-aware validation guards
SamErde Aug 9, 2026
5ddb2f5
fix(ci): validate live PowerShell lifecycle state
SamErde Aug 9, 2026
80c9f07
fix(deps): reevaluate floating lock entries
SamErde Aug 9, 2026
3f6fec1
fix(ci): distinguish observed known limitations
SamErde Aug 9, 2026
b6e0b75
fix(ci): validate exact runtime evidence inputs
SamErde Aug 9, 2026
ae4c887
fix(ci): restrict Dependabot project updates
SamErde Aug 9, 2026
507ff7d
fix(ci): defer candidate runtime patch validation
SamErde Aug 9, 2026
7f73193
fix: require complete assembly fingerprints
SamErde Aug 9, 2026
d342c15
fix: bind evidence to observed runtime profile
SamErde Aug 9, 2026
f438dc6
fix(ci): validate NuGet floating versions
SamErde Aug 9, 2026
f2faeb7
fix: sort upstream module versions semantically
SamErde Aug 10, 2026
c4882c0
feat: persist normalized profile evidence
SamErde Aug 10, 2026
2bb43ff
fix: normalize runtime-owned profile assets
SamErde Aug 10, 2026
14828e6
test: accept exact profile compatibility evidence
SamErde Aug 10, 2026
96d3389
fix: harden profile evidence review guards
SamErde Aug 10, 2026
da2fb69
feat: add bounded authenticated evidence bridge
SamErde Aug 10, 2026
7e634c5
fix: harden authenticated evidence boundaries
SamErde Aug 10, 2026
6dba82a
fix: align authenticated evidence expiry
SamErde Aug 10, 2026
9eb5296
fix: harden dependency runtime provenance
SamErde Aug 10, 2026
611364f
fix: enforce exact authenticated evidence
SamErde Aug 10, 2026
dab1367
fix: close manual auth fallback after transition
SamErde Aug 10, 2026
97122ab
fix: use device code for manual Az evidence
SamErde Aug 10, 2026
74b038b
fix: harden upstream evidence capture
SamErde Aug 10, 2026
a837b4b
fix: route bundle inputs through live validation
SamErde Aug 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 66 additions & 56 deletions .github/ci-scripts/Actions_Bootstrap.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -9,83 +9,93 @@
.EXAMPLE
./.github/scripts/Actions_Bootstrap.ps1

.PARAMETER ModuleInstallPath
Optional isolated module root. Exact tool versions are saved here and the path is
prepended only to this process's PSModulePath. No user-scope module path is mutated.

.NOTES
Run this script at the beginning of CI/CD workflows to ensure all dependencies are available.
#>

[CmdletBinding()]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingWriteHost', '')]

param()
param(
[Parameter()]
[string]$ModuleInstallPath
)

$ErrorActionPreference = 'Stop'
$ProgressPreference = 'SilentlyContinue'

Write-Host '🔨 Bootstrapping CI/CD Environment...'

$RepositoryRoot = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent
$ToolingScriptPath = Join-Path -Path $RepositoryRoot -ChildPath 'build/DLLPickle.Tooling.ps1'
$ToolPolicyPath = Join-Path -Path $RepositoryRoot -ChildPath 'build/build-tool-versions.json'
. $ToolingScriptPath
$ToolPolicy = Get-DLLPickleBuildToolPolicy -Path $ToolPolicyPath

if (-not [string]::IsNullOrWhiteSpace($ModuleInstallPath)) {
$ModuleInstallPath = [System.IO.Path]::GetFullPath($ModuleInstallPath)
if (-not (Test-Path -LiteralPath $ModuleInstallPath -PathType Container)) {
$null = New-Item -Path $ModuleInstallPath -ItemType Directory -Force
}
$ExistingModulePathEntries = @($env:PSModulePath -split [System.IO.Path]::PathSeparator | Where-Object { -not [string]::IsNullOrWhiteSpace($_) })
$env:PSModulePath = @($ModuleInstallPath) + $ExistingModulePathEntries -join [System.IO.Path]::PathSeparator
}

# https://docs.microsoft.com/powershell/module/packagemanagement/get-packageprovider
Get-PackageProvider -Name Nuget -ForceBootstrap | Out-Null

# https://docs.microsoft.com/powershell/module/powershellget/set-psrepository
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted

# List of PowerShell Modules required for the build.
$ModulesToInstall = New-Object System.Collections.Generic.List[object]

# https://github.com/pester/Pester
$ModulesToInstall.Add(([PSCustomObject]@{
ModuleName = 'Pester'
SkipPublisherCheck = $true # Skip publisher check for older Pester versions due to certificate mismatch.
#ModuleVersion = '5.7.1'
})) | Out-Null

# https://github.com/nightroman/Invoke-Build
$ModulesToInstall.Add(([PSCustomObject]@{
ModuleName = 'InvokeBuild'
#ModuleVersion = '5.12.1'
})) | Out-Null

# https://github.com/PowerShell/PSScriptAnalyzer
$ModulesToInstall.Add(([PSCustomObject]@{
ModuleName = 'PSScriptAnalyzer'
#ModuleVersion = '1.23.0'
})) | Out-Null

# https://github.com/PowerShell/Microsoft.PowerShell.PlatyPS
$ModulesToInstall.Add(([PSCustomObject]@{
ModuleName = 'Microsoft.PowerShell.PlatyPS'
})) | Out-Null
# https://github.com/PowerShell/platyPS
# Older version used due to: https://github.com/PowerShell/platyPS/issues/457
#$ModulesToInstall.Add(([PSCustomObject]@{
# ModuleName = 'platyPS'
# #ModuleVersion = '0.12.0'
#})) | Out-Null

Write-Host '📦 Installing PowerShell Modules'
foreach ($Module in $ModulesToInstall) {
$InstallSplat = @{
Name = $Module.ModuleName
Repository = 'PSGallery'
Force = $true
ErrorAction = 'Stop'
}
if ($Module.ModuleVersion) {
$InstallSplat['RequiredVersion'] = $Module.ModuleVersion
}
if ($Module.SkipPublisherCheck) {
$InstallSplat['SkipPublisherCheck'] = $true
Write-Host '📦 Installing exact PowerShell build-tool versions'
$ModuleInstallCommandName = if ([string]::IsNullOrWhiteSpace($ModuleInstallPath)) {
'Install-Module'
} else {
'Save-Module'
}
$ModuleInstallCommand = Get-Command -Name $ModuleInstallCommandName -ErrorAction Stop

foreach ($Module in @($ToolPolicy.modules)) {
$RequiredVersion = [version]$Module.version
$InstalledModule = Get-Module -ListAvailable -Name $Module.name |
Where-Object { Test-DLLPickleToolVersionMatch -ActualVersion $_.Version -RequiredVersion $RequiredVersion } |
Select-Object -First 1

if (-not $InstalledModule) {
$ModuleCommandSplat = @{
Name = $Module.name
RequiredVersion = $Module.version
Repository = 'PSGallery'
Force = $true
ErrorAction = 'Stop'
}
if (
$Module.skipPublisherCheck -and
(Test-DLLPickleCommandParameter -Command $ModuleInstallCommand -ParameterName 'SkipPublisherCheck')
) {
$ModuleCommandSplat['SkipPublisherCheck'] = $true
}

try {
if ([string]::IsNullOrWhiteSpace($ModuleInstallPath)) {
$ModuleCommandSplat['Scope'] = 'CurrentUser'
& $ModuleInstallCommand @ModuleCommandSplat
} else {
$ModuleCommandSplat['Path'] = $ModuleInstallPath
& $ModuleInstallCommand @ModuleCommandSplat
}
} catch {
Write-Host " - Failed to install $($Module.name) $RequiredVersion"
throw
}
}

try {
Install-Module @InstallSplat
Import-Module -Name $Module.ModuleName -ErrorAction Stop
Write-Host " - Successfully installed $($Module.ModuleName)"
} catch {
$message = 'Failed to install {0}' -f $Module.ModuleName
Write-Host " - $message"
throw
}
$ImportedModule = Import-DLLPickleBuildTool -Name $Module.name -RequiredVersion $RequiredVersion
Write-Host " - $($ImportedModule.Name) $($ImportedModule.Version) ready"
}

# Ensure .NET tools are available
Expand Down
18 changes: 14 additions & 4 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ updates:
interval: "weekly"
day: "sunday"
groups:
all-actions:
ci-tooling-actions:
patterns: ["*"]
commit-message:
prefix: "ci"
Expand All @@ -36,15 +36,25 @@ updates:
schedule:
interval: "daily"
groups:
nuget-minor-patch:
patterns: ["*"]
runtime-bundle-minor-patch:
patterns:
- "Microsoft.Identity.Client*"
- "Microsoft.IdentityModel.*"
- "System.IdentityModel.Tokens.Jwt"
- "System.Security.Cryptography.ProtectedData"
- "Microsoft.Extensions.DependencyInjection.Abstractions"
- "Microsoft.Extensions.Logging.Abstractions"
update-types:
- "minor"
- "patch"
commit-message:
prefix: "deps"
prefix-development: "deps"
# Note: Major version PRs are created but require manual approval. The Dependabot-Auto-Approve workflow handles selective auto-approval:
# Runtime dependencies are intentionally separate from GitHub Actions and the
# exact PowerShell build-tool pins in build/build-tool-versions.json. The
# optional pre-1.0 multi-pwsh pin is CI provisioning policy and always requires
# reviewed test-matrix evidence; it is not a NuGet dependency.
# Major version PRs are created but require manual approval. The Dependabot-Auto-Approve workflow handles selective auto-approval:
# - Auto-approves: patch and minor updates
# - Requires manual review: major version updates

Expand Down
Loading
Loading