Release pipeline knowledge covering the stable release flow (release.yml -> post-release.yml -> release-sync.yml), the manual pre-release/RC flow (prerelease.yml), branch-naming to version-bump mapping, and NPM/GHCR publishing. Use when cutting a release, verifying a completed release, or troubleshooting the release pipeline.
79%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./.github/skills/release-process/SKILL.mdLichtblick has two release tracks:
main comes from a release/* or hotfix/* branch. This runs .github/workflows/release.yml, which creates the GitHub Release and then fan-outs into post-release publishing and main→develop sync via GitHub's release: released event..github/workflows/prerelease.yml (workflow_dispatch only). This builds the same production artifacts and, when create_release: true, creates a GitHub Pre-release through ncipollo/release-action with prerelease: true. Because GitHub's release event fires prereleased (not released) for pre-releases, this does not trigger post-release.yml or release-sync.yml — RC builds are never auto-published to NPM/GHCR or auto-synced to develop.The stable and RC flows share the same artifact packaging shape, but only the stable flow performs the in-repo version bump, commit, and tag push to main.
The version bump is computed by regex in the bump_type step of .github/workflows/release.yml.
| Branch prefix pattern | Bump type | Example |
|---|---|---|
hotfix/* | patch | hotfix/fix-crash |
release/major or release/major/* | major | release/major/v2.0.0 |
release/minor or release/minor/* | minor | release/minor/v1.5.0 |
Any other branch prefix causes the workflow to fail with an explicit error.
Trigger condition:
on:
pull_request:
types: [closed]
branches:
- main
jobs:
release:
if: |
github.event.pull_request.merged == true &&
(startsWith(github.head_ref, 'release/') || startsWith(github.head_ref, 'hotfix/'))Step order:
main.yarn install --immutable.hotfix/* -> patchrelease/major(/.*)? -> majorrelease/minor(/.*)? -> minoryarn version <type>.packages/suite/package.json with yarn version <type>.package.json.sonar-project.properties so sonar.projectVersion matches the new version.main as v${version}, then push main and tags.yarn desktop:build:prodyarn web:build:prodyarn package:winyarn package:linuxyarn package:darwindist/lichtblick-web.tar.gz.ncipollo/release-action@v1.sonarqube.yml on main via gh workflow run.Release artifacts:
dist/lichtblick-${version}-linux-amd64.debdist/lichtblick-${version}-linux-x64.tar.gzdist/lichtblick-${version}-linux-arm64.debdist/lichtblick-${version}-linux-arm64.tar.gzdist/lichtblick-${version}-mac-universal.dmgdist/lichtblick-${version}-win.exedist/lichtblick-web.tar.gzdist/latest-linux.ymldist/latest-mac.ymldist/latest.ymlTrigger:
release: types: [released] — fires only for full (non-prerelease) GitHub Releases; pre-releases fire GitHub's separate prereleased event, which this workflow does not listen for.workflow_dispatch — requires an explicit tag input (for example v1.28.1). Both jobs use github.event.inputs.tag || github.event.release.tag_name for the checkout ref and Docker version tagging, so a manual run publishes the specified tag instead of depending on release-event context.This workflow fans out into two parallel jobs:
npmYarn (per the
packageManagerfield inpackage.json, currently 4.17.0) via Corepack remains this repo's dependency manager everywhere else;npm publishhere is an intentional, pipeline-only exception used solely to publish the built package to the npm registry.
github.event.release.tag_name).https://registry.npmjs.org.yarn install --immutable../packages/suite to npm with npm publish ./packages/suite.dockerv from the release tag for the versioned container tag.linux/amd64,linux/arm64.ghcr.io/<repo>:latestghcr.io/<repo>:<version-without-v-prefix>Trigger:
release: types: [released] — same caveat as post-release.yml: pre-releases fire prereleased, not released, so this workflow does not run for RC builds.workflow_dispatchThis workflow keeps develop descended from main after a release:
main with full history.package.json.sync/main-to-develop-{version} from origin/develop.git merge origin/main --no-ff.Two paths follow:
develop, and enable auto-merge with gh pr merge --merge --auto.In both cases, the workflow emphasizes the same rule: merge the sync PR with a MERGE COMMIT only — never squash or rebase — so main remains an ancestor of develop.
This workflow is manual-only (workflow_dispatch).
| Input | Type / options | Default | Purpose |
|---|---|---|---|
branch | choice (fixed dropdown values): develop, release/* | develop | Branch to build the pre-release from |
version_type | choice: prerelease, prepatch, preminor, premajor | prerelease | How to compute the next RC version |
create_release | boolean | true | Whether to publish a GitHub Pre-release |
release_notes | string | none | Optional custom release notes body |
Note:
release/*is a literal option string in the workflow'schoiceinput, not a wildcard/glob pattern. Selecting it only works if a branch is literally namedrelease/*; to build an RC from an actual release branch (e.g.release/minor/v1.5.0), that exact branch name would need to be added as its own choice option (or the input changed to a free-textstringtype).
Version computation logic:
v*rc.*.version_type == "prerelease":
semver.inc(baseVersion, "prerelease", "rc")semver.inc(lastRcWithoutLeadingV, "prerelease", "rc")package.jsonsemver.inc(stableBase, version_type, "rc")Build and release steps:
--config.extraMetadata.version=${version}.dist/lichtblick-web.tar.gz.create_release == true, create a GitHub Pre-release with ncipollo/release-action@v1, prerelease: true, and the same artifact list as the stable release flow.Note: This flow does not commit a version bump into git history. As covered above, GitHub fires
prereleased(notreleased) for pre-releases, sopost-release.ymlandrelease-sync.ymldo not run automatically after this workflow creates a GitHub Pre-release — NPM publishing, the GHCR image push, and the develop-sync PR only happen for stable releases.
| Workflow file | Trigger | Jobs |
|---|---|---|
.github/workflows/release.yml | pull_request closed on main, gated to merged PRs whose head branch starts with release/ or hotfix/ | release |
.github/workflows/post-release.yml | release: released (excludes pre-releases) or workflow_dispatch (requires tag input) | npm, docker |
.github/workflows/prerelease.yml | workflow_dispatch | prerelease |
.github/workflows/release-sync.yml | release: released (excludes pre-releases) or workflow_dispatch | sync |
.github/workflows/release.yml.github/workflows/post-release.yml.github/workflows/prerelease.yml.github/workflows/release-sync.ymllichtblick-suite/lichtblick
9589f38
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.