-
Notifications
You must be signed in to change notification settings - Fork 35
Open
Labels
Description
Summary
Refactor Package-Extension.ps1 and Prepare-Extension.ps1 to use the shared CIHelpers.psm1 module, removing 8 inline CI platform detection and output patterns across both scripts.
Prerequisites
- Create CIHelpers.psm1 shared module for CI platform detection and output #287 - Create CIHelpers.psm1 shared module (must be completed first)
Problem
The VS Code extension packaging scripts contain inline CI patterns that duplicate functionality now available in CIHelpers.psm1.
Package-Extension.ps1 (6 patterns)
# Output variables (lines ~555-561)
if ($env:GITHUB_OUTPUT) {
"version=$packageVersion" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8
"vsix-file=$($vsixFile.Name)" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8
}
# Environment detection
if ($env:GITHUB_ACTIONS -eq 'true') { ... }
if ($env:TF_BUILD -eq 'True') { ... }
# Error annotations in catch blocks
Write-Output "::error::$($_.Exception.Message)"Prepare-Extension.ps1 (2 patterns)
# Error annotation in catch block
catch {
if ($env:GITHUB_ACTIONS -eq 'true') {
Write-Output "::error::$($_.Exception.Message)"
}
throw
}Pattern inventory (8 total):
| Script | Pattern Type | Count | CIHelpers Function |
|---|---|---|---|
| Package-Extension.ps1 | Environment detection | 2 | Test-CIEnvironment, Get-CIPlatform |
| Package-Extension.ps1 | Output variables | 2 | Set-CIOutput |
| Package-Extension.ps1 | Annotations | 2 | Write-CIAnnotation |
| Prepare-Extension.ps1 | Annotations | 2 | Write-CIAnnotation |
Solution
Step 1: Add module imports
Add after the param() block in both scripts:
# Import shared CI helpers module
$ciHelpersPath = Join-Path $PSScriptRoot "../lib/Modules/CIHelpers.psm1"
Import-Module $ciHelpersPath -ForceStep 2: Refactor Package-Extension.ps1
Output variables:
# Before
if ($env:GITHUB_OUTPUT) {
"version=$packageVersion" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8
"vsix-file=$($vsixFile.Name)" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8
}
# After
Set-CIOutput -Name 'version' -Value $packageVersion
Set-CIOutput -Name 'vsix-file' -Value $vsixFile.NameCatch blocks:
# Before
catch {
if ($env:GITHUB_ACTIONS -eq 'true') {
Write-Output "::error::$($_.Exception.Message)"
}
elseif ($env:TF_BUILD -eq 'True') {
Write-Output "##vso[task.logissue type=error]$($_.Exception.Message)"
}
throw
}
# After
catch {
Write-CIAnnotation -Type error -Message $_.Exception.Message
throw
}Step 3: Refactor Prepare-Extension.ps1
# Before
catch {
if ($env:GITHUB_ACTIONS -eq 'true') {
Write-Output "::error::$($_.Exception.Message)"
}
throw
}
# After
catch {
Write-CIAnnotation -Type error -Message $_.Exception.Message
throw
}Testing Requirements
Update Package-Extension.Tests.ps1
BeforeAll {
# Mock CIHelpers module
Mock -ModuleName Package-Extension Get-CIPlatform { return 'Local' }
Mock -ModuleName Package-Extension Test-CIEnvironment { return $false }
Mock -ModuleName Package-Extension Set-CIOutput { }
Mock -ModuleName Package-Extension Write-CIAnnotation { }
}
Describe 'CI Integration' {
Context 'GitHub Actions environment' {
BeforeEach {
Mock Get-CIPlatform { return 'GitHub' }
Mock Test-CIEnvironment { return $true }
}
It 'Sets version output variable' {
# Run packaging
Should -Invoke Set-CIOutput -ParameterFilter { $Name -eq 'version' }
}
It 'Sets vsix-file output variable' {
# Run packaging
Should -Invoke Set-CIOutput -ParameterFilter { $Name -eq 'vsix-file' }
}
}
Context 'Error handling' {
It 'Writes error annotation on failure' {
# Trigger error condition
Should -Invoke Write-CIAnnotation -ParameterFilter { $Type -eq 'error' }
}
}
}Update Prepare-Extension.Tests.ps1
BeforeAll {
Mock -ModuleName Prepare-Extension Write-CIAnnotation { }
}
Describe 'Error handling' {
It 'Writes CI annotation on preparation failure' {
# Trigger error
Should -Invoke Write-CIAnnotation -ParameterFilter { $Type -eq 'error' }
}
}Coverage targets
| Script | Target Coverage |
|---|---|
| Package-Extension.ps1 | 80%+ |
| Prepare-Extension.ps1 | 80%+ |
Run validation
# Run tests with coverage
Invoke-Pester -Path scripts/tests/extension/ -Output Detailed -CodeCoverage @(
'scripts/extension/Package-Extension.ps1',
'scripts/extension/Prepare-Extension.ps1'
)
# Verify no inline CI patterns remain
$patterns = '::error|::warning|##vso\[|GITHUB_OUTPUT|GITHUB_ACTIONS|TF_BUILD'
Select-String -Path scripts/extension/*.ps1 -Pattern $patterns | Should -BeNullOrEmptyAcceptance Criteria
- Both scripts import
CIHelpers.psm1module - All 8 inline CI patterns replaced with CIHelpers function calls
- No
$env:GITHUB_OUTPUT,$env:GITHUB_ACTIONS,$env:TF_BUILDchecks remain - No
::error::,##vso[string patterns remain - Package-Extension.Tests.ps1 updated with CI integration tests
- Prepare-Extension.Tests.ps1 updated with error annotation tests
- Test coverage reaches 80%+ for both scripts
- Extension packaging workflow remains functional
- PSScriptAnalyzer passes with no errors
Files Changed
scripts/extension/Package-Extension.ps1scripts/extension/Prepare-Extension.ps1scripts/tests/extension/Package-Extension.Tests.ps1scripts/tests/extension/Prepare-Extension.Tests.ps1
Related Issues
- Create CIHelpers.psm1 shared module for CI platform detection and output #287 - CIHelpers module creation (prerequisite)
- [Issue]: Refactor Test-DependencyPinning.ps1 to use CIHelpers module #349 - Test-DependencyPinning refactoring (related)