Skip to main content
The Palyra release pipeline is a multi-stage process that ensures version coherence, builds cross-platform binaries, packages portable bundles for desktop and headless environments, and generates cryptographic attestations for supply chain security. The process is primarily driven by the release.yml GitHub Actions workflow and a suite of PowerShell scripts.

Release Workflow Lifecycle

The release process begins with metadata preparation and version validation before proceeding to parallel packaging of platform-specific artifacts.

1. Version Coherence and Metadata

The prepare-release job asserts that the repository version is consistent across all manifests using assert-version-coherence.ps1 .github/workflows/release.yml#41-49. It generates release and migration notes that are automatically uploaded as draft release assets .github/workflows/release.yml#108-114.

2. Portable Packaging Logic

Packaging is handled by package-portable.ps1, which creates two distinct artifact types:

3. Artifact Verification

Every package undergoes strict validation via validate-portable-archive.ps1. This script ensures: Sources: .github/workflows/release.yml#30-120, scripts/release/package-portable.ps1#1-160, scripts/release/validate-portable-archive.ps1#1-133

Packaging Data Flow

The following diagram illustrates the transformation from source code and build artifacts into a validated release package.

Build to Package Transformation

Sources: scripts/release/package-portable.ps1#65-95, scripts/release/validate-portable-archive.ps1#29-33

Security and Provenance

Palyra implements a “Security Gate” model to ensure that distributed artifacts are trustworthy.

Supply Chain Protections

The security.yml workflow runs alongside the release to generate:

Build Attestations

For every release asset, the workflow generates a GitHub Build Attestation. This provides a non-forgeable link between the published binary and the specific GitHub Actions run that produced it .github/workflows/release.yml#21-22. Sources: .github/workflows/security.yml#11-156, .github/workflows/release.yml#19-23

Installation and Lifecycle Scripts

Portable packages are accompanied by install-desktop-package.ps1 and install-headless-package.ps1 to manage the local deployment lifecycle.

Key Lifecycle Functions

FunctionRoleFile Reference
Install-PalyraCliExposureCreates shims/symlinks to expose the palyra command to the shell.scripts/release/common.ps1#264
Expand-ZipArchiveSafelyUnpacks archives while preventing ZipSlip (path traversal) attacks.scripts/release/common.ps1#209-245
Set-ExecutablePermissionsEnsures binaries have the +x bit set on Unix-like systems.scripts/release/common.ps1#251-262

Headless Service Integration

The headless installer automatically generates a systemd unit file (palyrad.service) on Linux systems, pre-configured with the correct PALYRA_CONFIG and PALYRA_STATE_ROOT environment variables .scripts/release/install-headless-package.ps1#88-112. Sources: scripts/release/install-desktop-package.ps1#1-100, scripts/release/install-headless-package.ps1#1-132, scripts/release/common.ps1#200-300

Release Smoke Test

Before a release is published, run-release-smoke.ps1 executes a comprehensive end-to-end validation in a clean environment.

Smoke Test Coverage

  1. Installation Validation: Performs a full install of both desktop and headless packages into temporary directories .scripts/test/run-release-smoke.ps1#178-185.
  2. CLI Discovery: Uses Assert-CommandResolvesFromRoot to verify that the palyra command correctly points to the newly installed binary rather than a pre-existing system version .scripts/test/run-release-smoke.ps1#8-38.
  3. Surface Audit: Executes a battery of help commands and diagnostics (e.g., palyra doctor --json) to ensure all subcommands are functional .scripts/test/run-release-smoke.ps1#55-72.
  4. Documentation Search: Verifies that the bundled offline documentation can be queried via the CLI docs command .scripts/test/run-release-smoke.ps1#87-91.
  5. Dry-run Lifecycle: Tests update --dry-run and uninstall --dry-run to ensure lifecycle logic is sound without mutating the host .scripts/test/run-release-smoke.ps1#95-108.

Smoke Test Logic Flow

Sources: scripts/test/run-release-smoke.ps1#1-185, crates/palyra-cli/src/commands/docs.rs#74-85