Release Process
Docklift uses semantic-release to fully automate versioning, changelogs, and GitHub Releases.
How It Works
Push to master → Run "Release & Test" workflow → semantic-release handles everything
Pipeline Steps (automatic)
- Runs tests via
test-ubuntu.yml - Analyzes commit messages to determine version bump
- Bumps
package.jsonin root, frontend, and backend - Updates
CHANGELOG.md - Commits bumped files back to master:
chore(release): X.Y.Z [skip ci] - Creates git tag
vX.Y.Z - Creates GitHub Release with generated notes
Key Files
| File | Purpose |
|---|---|
release.config.cjs |
semantic-release config (plugins, release rules, assets) |
.github/workflows/release.yml |
GitHub Actions workflow (manual trigger via workflow_dispatch) |
CHANGELOG.md |
Auto-updated changelog |
package.json (root) |
Root version + semantic-release devDependencies |
Commit Convention
Commits must follow Conventional Commits format:
type(scope): description
Release Rules (from release.config.cjs)
| Commit Type | Release Type |
|---|---|
feat: |
patch |
fix: |
patch |
perf:, style:, refactor: |
patch |
docs:, test:, ci:, chore:, build: |
patch |
wip: |
patch |
BREAKING CHANGE (type, scope, or subject) |
major |
*force minor* in subject |
minor |
*force major* in subject |
major |
*force patch* in subject |
patch |
*skip release* in subject |
no release |
Note: ALL commit types trigger a patch release. This is intentional — Docklift treats every commit type as release-worthy.
Examples
# Standard commits
git commit -m "fix(deploy): use fetch+reset instead of git pull"
git commit -m "feat(logs): add search functionality to log viewer"
git commit -m "docs: update README with release instructions"
# Force a minor release
git commit -m "feat(api): add new endpoint *force minor*"
# Skip release entirely
git commit -m "chore: update comments *skip release*"
How to Release
# 1. Commit your changes with conventional messages
git add -A
git commit -m "fix(deploy): description of change"
# 2. Push to master
git push origin master
# 3. Go to GitHub → Actions → "Release & Test" → Run workflow
# semantic-release does everything else automatically
Version Bump Strategy
The @semantic-release/exec plugin bumps versions in sub-packages:
npm version X.Y.Z --no-git-tag-version --allow-same-version --prefix frontend
npm version X.Y.Z --no-git-tag-version --allow-same-version --prefix backend
The @semantic-release/npm plugin bumps the root package.json.
The @semantic-release/git plugin commits these files back:
CHANGELOG.mdpackage.json,package-lock.jsonfrontend/package.json,frontend/package-lock.jsonbackend/package.json,backend/package-lock.json
GitHub Token
The workflow uses secrets.GH_TOKEN (not the default GITHUB_TOKEN) to allow semantic-release to push commits back to master. This must be a Personal Access Token with repo scope.
Troubleshooting
| Issue | Fix |
|---|---|
| "No workspaces found" | Use --prefix instead of --workspaces in prepareCmd |
| "Version not changed" | Add --allow-same-version flag |
| No release created | Ensure commits use conventional format (type: msg) |
| "Not allowed to push" | Check GH_TOKEN secret has repo scope |
| Tests fail | Fix tests before release — test job must pass first |
DO NOT Use bumpp
The project previously used bumpp for manual version bumping. Do not use bumpp — it conflicts with semantic-release by creating tags that semantic-release doesn't expect. Let semantic-release handle all versioning.
Converted and distributed by TomeVault — claim your Tome and manage your conversions.