A Practical Release Pipeline for Fifth
We recently finished the Release Packaging workflow for the Fifth compiler. This post walks through what the pipeline does, which platforms it targets, the guarantees it makes, and how to install the new artifacts without surprises.
What the Workflow Does
- Builds the compiler on Linux, macOS, and Windows runners for both .NET 8.0 and .NET 10.0 targets (12 archives total when all succeed).
- Publishes self-contained binaries (no additional runtime required) plus a
lib/folder with the reference assemblies that power IDE integration and SDK workflows. - Runs layout checks and smoke tests for every successful build to ensure the packaged compiler can parse and compile a small Fifth sample before we ship it.
- Aggregates metadata for every build, enforces that we produced six
net8.0and sixnet10.0archives, and emits a consolidatedSHA256SUMSmanifest so users can verify downloads. - Creates a GitHub release with the archives, checksum file, and release notes drawn from the pipeline metadata.
What It Does Not Do (Yet)
- No installers or package-manager feeds. Deliverables are
.tar.gz(Linux/macOS) and.zip(Windows) archives only. - No delta updates; every release is a full compiler distribution.
- No container images or VS Code extensions are published from this pipeline.
- The
net10.0builds currently rely on preview SDKs. They exist so early adopters can validate future runtime behavior, but thenet8.0packages remain the supported baseline.
Multi-Target Coverage
| Platform | Architectures | Runtimes |
|---|---|---|
| Linux | x64, arm64 | net8.0, net10.0 |
| macOS | x64, arm64 | net8.0, net10.0 |
| Windows | x64, arm64 | net8.0, net10.0 |
Every archive follows the naming pattern fifth-<version>-<runtime>-<framework>.<tar.gz|zip>, for example fifth-0.9.0-test-linux-x64-net8.0.tar.gz.
Contents of Each Archive
fifth-<version>/
bin/
fifth (or fifth.exe on Windows)
lib/
*.dll support libraries for IDE tooling and the SDK
LICENSE
README.md
VERSION.txt
bin/fifth exposes the same CLI that the repository refers to as fifthc; the binary has been renamed only to distinguish it from the dotnet project name inside the source tree.
Download, Verify, and Install
- Download an archive and the checksum manifest (replace variables as needed):
VERSION=0.9.0-test
RUNTIME=linux-x64
FRAMEWORK=net8.0
curl -LO "https://github.com/aabs/fifthlang/releases/download/v${VERSION}/fifth-${VERSION}-${RUNTIME}-${FRAMEWORK}.tar.gz"
curl -LO "https://github.com/aabs/fifthlang/releases/download/v${VERSION}/SHA256SUMS"
-2. Verify the checksum:
- Linux/macOS (GNU coreutils installed):
sha256sum --ignore-missing -c SHA256SUMS
- macOS (BSD
shasum):
grep "fifth-${VERSION}-${RUNTIME}-${FRAMEWORK}.tar.gz" SHA256SUMS | shasum -a 256 -c -
- Windows PowerShell:
$version = "0.9.0-test"
$runtime = "win-x64"
$framework = "net8.0"
Get-FileHash ".\fifth-$version-$runtime-$framework.zip" -Algorithm SHA256
Get-Content .\SHA256SUMS | Select-String "fifth-$version-$runtime-$framework.zip"
Compare the computed hash to the line from SHA256SUMS. Only proceed when they match.
-
Extract:
-
Linux/macOS:
mkdir -p ~/opt/fifth/${VERSION}
tar -xzf fifth-${VERSION}-${RUNTIME}-${FRAMEWORK}.tar.gz -C ~/opt/fifth/${VERSION}
- Windows:
$version = "0.9.0-test"
$runtime = "win-x64"
$framework = "net8.0"
New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\fifth\$version" | Out-Null
Expand-Archive -Force -Path ".\fifth-$version-$runtime-$framework.zip" -DestinationPath "$env:USERPROFILE\fifth\$version"
- Update
PATH(optional but recommended):
export PATH=~/opt/fifth/${VERSION}/fifth-${VERSION}/bin:$PATH
On Windows, add %USERPROFILE%\fifth\<version>\fifth-<version>\bin to the user PATH via the System Properties dialog or setx.
Using the Packaged Compiler
Once extracted, invoke the compiler directly from the bin directory:
fifth --source hello.5th --output hello.exe
fifth --command run --source hello.5th --output hello.exe --args "--name Ada"
fifth --command lint --source src/
Because the archives are self-contained, no additional .NET runtime is required to run the binary. For larger projects you may still point IDE tooling at the lib/ folder by referencing its path in FifthCompilerPath entries inside your csproj files (see src/Fifth.Sdk/README.md).
Expectations for Early Releases
- The smoke tests exercise small programs only; they do not cover every runtime combination or large project scenario. Treat
net10.0builds as preview-quality until the upstream SDK stabilizes. - If a package fails to build for a given platform, the publish job will halt. In that situation the release will not appear; we re-tag only after fixing the underlying issue.
- Releases currently target desktop/server environments. Mobile or WASM outputs are out of scope for this workflow.
Feedback
If you hit issues downloading, verifying, or running each target, please open a GitHub issue with the platform, archive name, and the relevant log output. The Release Packaging workflow surfaces its metadata in the GitHub Actions logs, so referencing the failing run ID helps us reproduce problems quickly.
This incremental pipeline gives us predictable, verifiable deliverables without overstating their scope. As we gather feedback, we will evaluate package-manager feeds, container images, and additional automation around tagging to make releases even smoother.