Skip to content
Documentation menu · version 0.1.0-alpha.4

Releases

Cutting a release

  1. Make sure CI on main is green.
  2. Tag and push: git tag v1.2.3 && git push origin v1.2.3.

The release workflow builds every artifact, tests the Linux packages and the Windows MSI by installing and removing them, and publishes:

  • A GitHub release with all artifacts, a SHA256SUMS file signed keylessly with Sigstore (SHA256SUMS.sigstore.json), and build provenance attestations.
  • Container images ghcr.io/<owner>/yarma-api, yarma-license-center and yarma-web, tagged with the version. Each image is signed with cosign and carries an SBOM and provenance.

Run the workflow by hand (Actions → release → Run workflow) for a dry run. It builds everything and keeps the results as workflow artifacts, without publishing anything. Options of a manual run:

  • version: X.Y.Z, or a pre-release such as 0.1.0-alpha.1. Pre-releases are marked as such on GitHub; .deb/.rpm write them as 0.1.0~alpha.1 so they sort before 0.1.0, and the MSI carries the numeric part (0.1.0) and upgrades over the same numeric version.
  • components: agents builds only the agent packages (Linux, Windows, macOS) and the server binaries, skipping the desktop console and container images — a fraction of the runner minutes (macOS minutes count tenfold on private repositories).
  • publish: tags the commit v<version> and publishes the GitHub release. Its signed checksums then name refs/heads/main instead of a tag in the certificate identity.
Artifact Contents
yarma-agent-X.Y.Z-linux-{x86_64,aarch64}.tar.gz agent, yarma-session, yarma-assist, install.sh, systemd unit
yarma-agent_X.Y.Z_{amd64,arm64}.deb, yarma-agent-X.Y.Z-1.{x86_64,aarch64}.rpm agent only, with no native library dependencies (fits servers); arm64 for Raspberry Pi and ARM servers
yarma-agent-desktop_… (.deb, .rpm) screen sharing and support window for desktops (needs libpipewire)
yarma-agent-X.Y.Z-windows-x64.msi and .zip (MSI plus install.ps1) agent, support window, YarmaAgent service
yarma-agent-X.Y.Z-macos-universal.pkg agent, support window, LaunchDaemon (Apple silicon and Intel)
YARMA Console_… (.deb, .rpm, .AppImage, .msi, setup .exe, .dmg) desktop console
yarma-server-X.Y.Z-linux-{amd64,arm64}.tar.gz yarma-api, yarma-license, yarma-license-center
yarma-server-native-X.Y.Z-linux-amd64.tar.gz complete server for Ubuntu 24.04 without Docker: yarma-api, console, SeaweedFS, install.sh, agent packages (native install); built by scripts/package-native.sh
yarma-X.Y.Z.tgz Helm chart
yarma-website-X.Y.Z.tar.gz Docker Compose bundle for the website and License Center (deployment)
yarma-single-host-X.Y.Z.tar.gz Docker Compose bundle and init.sh for a single Linux server (guide)

Verify a download:

cosign verify-blob SHA256SUMS --bundle SHA256SUMS.sigstore.json \
  --certificate-identity-regexp 'https://github.com/javadmohebbi/YARMA/.github/workflows/release.yml@refs/tags/v.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com
sha256sum --ignore-missing -c SHA256SUMS
gh attestation verify yarma-agent_1.2.3_amd64.deb --repo javadmohebbi/YARMA

Building agents without GitHub Actions

scripts/build-agent-linux.sh VERSION amd64|arm64 OUT builds the Linux agent in a container (Ubuntu 22.04 baseline; arm64 is cross-compiled with the PipeWire libraries for the screen sharing helper), then scripts/package-linux.sh VERSION OUT DIST ARCH packages it. The release workflow's linux-agent-arm64 job uses the same script. Windows and macOS packages need their own runners.

Website documentation

https://yarma.avadeja.com/docs/ is generated from the guides in docs/ by website/scripts/build-docs.mjs on every website build (npm run build), stamped with the release version (YARMA_VERSION, else the latest git tag). Publishing a release therefore means rebuilding the website from the release commit and deploying the License Center bundle: the docs always match the downloadable version. Pages and their order are listed in SECTIONS in that script.

Code signing (optional)

Without these repository secrets, artifacts are built unsigned. Windows SmartScreen warns on unsigned installers, and macOS Gatekeeper blocks unsigned packages unless the user allows them.

Secret Use
WINDOWS_CERT_PFX (base64), WINDOWS_CERT_PASSWORD Authenticode-signs yarma-agent.exe, yarma-assist.exe and the MSI (RFC 3161 timestamp)
MACOS_CERT_P12 (base64, holding Developer ID Application and Installer), MACOS_CERT_PASSWORD imported into a temporary keychain
MACOS_APP_IDENTITY, MACOS_INSTALLER_IDENTITY e.g. Developer ID Application: Example Ltd (TEAMID) and Developer ID Installer: …
APPLE_ID, APPLE_TEAM_ID, APPLE_APP_PASSWORD notarization with notarytool, then stapling

Shipping unsigned

Releases work without any of these secrets. What changes per platform:

Platform Unsigned behaviour Install path with no prompt
Linux nothing; verify with SHA256SUMS and cosign any
Windows SmartScreen "unknown publisher" when the MSI is opened from a browser download install.ps1, msiexec /qn, Intune / SCCM / GPO
macOS Gatekeeper blocks a double-clicked, quarantined .pkg sudo installer -pkg … (install.sh --pkg), MDM, or a file fetched with curl (no quarantine flag)

Self-signed Windows certificate (managed fleets)

A self-signed certificate removes the SmartScreen and UAC "unknown publisher" warnings on machines that trust it; on any other machine it behaves like unsigned. It does not help on macOS: Gatekeeper accepts only Apple Developer ID certificates.

  1. On a Windows machine, run .\scripts\selfsign-windows.ps1 (options: -Subject, -Years (default 3), -OutDir). It writes yarma-codesign.pfx, the public yarma-codesign.cer and secrets.txt, and removes the key from the certificate store.
  2. Add the two values from secrets.txt as the WINDOWS_CERT_PFX and WINDOWS_CERT_PASSWORD repository secrets, then delete the .pfx and secrets.txt.
  3. Distribute yarma-codesign.cer to the Trusted Root Certification Authorities and Trusted Publishers stores of the target machines:
    • GPO: Computer Configuration → Policies → Windows Settings → Security Settings → Public Key Policies → import into both stores.
    • Intune: a Trusted certificate profile for the Root store, plus a PowerShell platform script running the TrustedPublisher import below.
    • One machine (elevated PowerShell):
      Import-Certificate -FilePath yarma-codesign.cer -CertStoreLocation Cert:\LocalMachine\Root
      Import-Certificate -FilePath yarma-codesign.cer -CertStoreLocation Cert:\LocalMachine\TrustedPublisher
      
  4. Check a signed build: Get-AuthenticodeSignature .\yarma-agent.msi reports Valid on a machine that trusts the certificate.

Trusting a root certificate lets its key sign anything for those machines: keep the .pfx only in the repository secrets and rotate it (rerun the script, update both secrets and the distributed .cer) before it expires or if it leaks. Moving to a commercial OV/EV certificate later needs only the two secrets changed.

Installing

Documentation for Yarma 0.1.0-alpha.4. Something unclear? .