mirror of
https://github.com/PowerShell/PowerShell
synced 2026-06-08 12:12:50 +00:00
Replace fpm with native macOS packaging tools (pkgbuild/productbuild) (#26268)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: TravisEz13 <10873629+TravisEz13@users.noreply.github.com> Co-authored-by: Travis Plunk <travis.plunk@microsoft.com>
This commit is contained in:
co-authored by
TravisEz13
Travis Plunk
parent
5e5e17766b
commit
47e8e900ab
@@ -35,13 +35,15 @@ applyTo:
|
||||
|
||||
### For Release/Packaging
|
||||
|
||||
**Use: Release with version tag**
|
||||
**Use: Release with version tag and public NuGet feeds**
|
||||
|
||||
```yaml
|
||||
- name: Build for Release
|
||||
shell: pwsh
|
||||
run: |
|
||||
Import-Module ./build.psm1
|
||||
Import-Module ./tools/ci.psm1
|
||||
Switch-PSNugetConfig -Source Public
|
||||
$releaseTag = Get-ReleaseTag
|
||||
Start-PSBuild -Configuration 'Release' -ReleaseTag $releaseTag
|
||||
```
|
||||
@@ -51,6 +53,11 @@ applyTo:
|
||||
- No debug symbols (smaller size)
|
||||
- Production-ready
|
||||
|
||||
**Why Switch-PSNugetConfig -Source Public:**
|
||||
- Switches NuGet package sources to public feeds (nuget.org and public Azure DevOps feeds)
|
||||
- Required for CI/CD environments that don't have access to private feeds
|
||||
- Uses publicly available packages instead of Microsoft internal feeds
|
||||
|
||||
### For Code Coverage
|
||||
|
||||
**Use: CodeCoverage configuration**
|
||||
@@ -101,3 +108,42 @@ src/powershell-win-core/bin/Debug/<netversion>/<runtime>/publish/
|
||||
3. Match configuration to purpose
|
||||
4. Use `-CI` only when needed
|
||||
5. Always specify `-ReleaseTag` for release or packaging builds
|
||||
6. Use `Switch-PSNugetConfig -Source Public` in CI/CD for release builds
|
||||
|
||||
## NuGet Feed Configuration
|
||||
|
||||
### Switch-PSNugetConfig
|
||||
|
||||
The `Switch-PSNugetConfig` function in `build.psm1` manages NuGet package source configuration.
|
||||
|
||||
**Available Sources:**
|
||||
|
||||
- **Public**: Uses public feeds (nuget.org and public Azure DevOps feeds)
|
||||
- Required for: CI/CD environments, public builds, packaging
|
||||
- Does not require authentication
|
||||
|
||||
- **Private**: Uses internal PowerShell team feeds
|
||||
- Required for: Internal development with preview packages
|
||||
- Requires authentication credentials
|
||||
|
||||
- **NuGetOnly**: Uses only nuget.org
|
||||
- Required for: Minimal dependency scenarios
|
||||
|
||||
**Usage:**
|
||||
|
||||
```powershell
|
||||
# Switch to public feeds (most common for CI/CD)
|
||||
Switch-PSNugetConfig -Source Public
|
||||
|
||||
# Switch to private feeds with authentication
|
||||
Switch-PSNugetConfig -Source Private -UserName $userName -ClearTextPAT $pat
|
||||
|
||||
# Switch to nuget.org only
|
||||
Switch-PSNugetConfig -Source NuGetOnly
|
||||
```
|
||||
|
||||
**When to Use:**
|
||||
|
||||
- **Always use `-Source Public`** before building in CI/CD workflows
|
||||
- Use before any build that will create packages for distribution
|
||||
- Use in forks or environments without access to Microsoft internal feeds
|
||||
|
||||
@@ -0,0 +1,149 @@
|
||||
---
|
||||
applyTo:
|
||||
- "**/*.ps1"
|
||||
- "**/*.psm1"
|
||||
---
|
||||
|
||||
# Using Start-NativeExecution for Native Command Execution
|
||||
|
||||
## Purpose
|
||||
|
||||
`Start-NativeExecution` is the standard function for executing native commands (external executables) in PowerShell scripts within this repository. It provides consistent error handling and better diagnostics when native commands fail.
|
||||
|
||||
## When to Use
|
||||
|
||||
Use `Start-NativeExecution` whenever you need to:
|
||||
- Execute external commands (e.g., `git`, `dotnet`, `pkgbuild`, `productbuild`, `fpm`, `rpmbuild`)
|
||||
- Ensure proper exit code checking
|
||||
- Get better error messages with caller information
|
||||
- Handle verbose output on error
|
||||
|
||||
## Basic Usage
|
||||
|
||||
```powershell
|
||||
Start-NativeExecution {
|
||||
git clone https://github.com/PowerShell/PowerShell.git
|
||||
}
|
||||
```
|
||||
|
||||
## With Parameters
|
||||
|
||||
Use backticks for line continuation within the script block:
|
||||
|
||||
```powershell
|
||||
Start-NativeExecution {
|
||||
pkgbuild --root $pkgRoot `
|
||||
--identifier $pkgIdentifier `
|
||||
--version $Version `
|
||||
--scripts $scriptsDir `
|
||||
$outputPath
|
||||
}
|
||||
```
|
||||
|
||||
## Common Parameters
|
||||
|
||||
### -VerboseOutputOnError
|
||||
|
||||
Captures command output and displays it only if the command fails:
|
||||
|
||||
```powershell
|
||||
Start-NativeExecution -VerboseOutputOnError {
|
||||
dotnet build --configuration Release
|
||||
}
|
||||
```
|
||||
|
||||
### -IgnoreExitcode
|
||||
|
||||
Allows the command to fail without throwing an exception:
|
||||
|
||||
```powershell
|
||||
Start-NativeExecution -IgnoreExitcode {
|
||||
git diff --exit-code # Returns 1 if differences exist
|
||||
}
|
||||
```
|
||||
|
||||
## Availability
|
||||
|
||||
The function is defined in `tools/buildCommon/startNativeExecution.ps1` and is available in:
|
||||
- `build.psm1` (dot-sourced automatically)
|
||||
- `tools/packaging/packaging.psm1` (dot-sourced automatically)
|
||||
- Test modules that include `HelpersCommon.psm1`
|
||||
|
||||
To use in other scripts, dot-source the function:
|
||||
|
||||
```powershell
|
||||
. "$PSScriptRoot/../buildCommon/startNativeExecution.ps1"
|
||||
```
|
||||
|
||||
## Error Handling
|
||||
|
||||
When a native command fails (non-zero exit code), `Start-NativeExecution`:
|
||||
1. Captures the exit code
|
||||
2. Identifies the calling location (file and line number)
|
||||
3. Throws a descriptive error with full context
|
||||
|
||||
Example error message:
|
||||
```
|
||||
Execution of {git clone ...} by /path/to/script.ps1: line 42 failed with exit code 1
|
||||
```
|
||||
|
||||
## Examples from the Codebase
|
||||
|
||||
### Git Operations
|
||||
```powershell
|
||||
Start-NativeExecution {
|
||||
git fetch --tags --quiet upstream
|
||||
}
|
||||
```
|
||||
|
||||
### Build Operations
|
||||
```powershell
|
||||
Start-NativeExecution -VerboseOutputOnError {
|
||||
dotnet publish --configuration Release
|
||||
}
|
||||
```
|
||||
|
||||
### Packaging Operations
|
||||
```powershell
|
||||
Start-NativeExecution -VerboseOutputOnError {
|
||||
pkgbuild --root $pkgRoot --identifier $pkgId --version $version $outputPath
|
||||
}
|
||||
```
|
||||
|
||||
### Permission Changes
|
||||
```powershell
|
||||
Start-NativeExecution {
|
||||
find $staging -type d | xargs chmod 755
|
||||
find $staging -type f | xargs chmod 644
|
||||
}
|
||||
```
|
||||
|
||||
## Anti-Patterns
|
||||
|
||||
**Don't do this:**
|
||||
```powershell
|
||||
& somecommand $args
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "Command failed"
|
||||
}
|
||||
```
|
||||
|
||||
**Do this instead:**
|
||||
```powershell
|
||||
Start-NativeExecution {
|
||||
somecommand $args
|
||||
}
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Always use Start-NativeExecution** for native commands to ensure consistent error handling
|
||||
2. **Use -VerboseOutputOnError** for commands with useful diagnostic output
|
||||
3. **Use backticks for readability** when commands have multiple arguments
|
||||
4. **Don't capture output unnecessarily** - let the function handle it
|
||||
5. **Use -IgnoreExitcode sparingly** - only when non-zero exit codes are expected and acceptable
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- Source: `tools/buildCommon/startNativeExecution.ps1`
|
||||
- Blog post: https://mnaoumov.wordpress.com/2015/01/11/execution-of-external-commands-in-powershell-done-right/
|
||||
Reference in New Issue
Block a user