This runbook describes the coordinated release workflow for the stack repository and its submodules:
front/admin/sitmun-admin-appfront/viewer/sitmun-viewer-appback/backend/sitmun-backend-coreback/proxy/sitmun-proxy-middleware
It assumes:
devis the integration branch.mainis the stable branch.- Tags use the repository prefix format (for example:
sitmun-admin-app/1.2.5). - Release version follows Semantic Versioning (for example:
1.2.5).
- Ensure local branches are up to date:
git checkout dev && git pullin stack and every submodule.
- Ensure no unresolved conflicts and no unintended local changes.
- Confirm release target version and date.
- Confirm CI pipelines are green on
dev.
For each submodule (admin, viewer, backend-core, proxy):
- Update changelog:
- Move
## [Unreleased]release-ready entries into## [X.Y.Z] - YYYY-MM-DD. - Keep a fresh empty
## [Unreleased]. - Update compare links at file bottom.
- Move
- Bump versioned files to
X.Y.Z:- Frontend:
package.json, environments, README badge (and lockfile if needed). - Backend/proxy:
build.gradle, API docs/app config versions, README badge.
- Frontend:
- Run repository checks (build/tests/lint as applicable).
- Commit release changes on
dev. - Create and push tag on
devcommit:- Example:
sitmun-admin-app/1.2.5.
- Example:
For each submodule, after tag and CI pass:
git checkout maingit merge --no-ff dev- Resolve conflicts if any, then run validation checks.
- Push
main. - Verify
maincontains the tagged commit.
In stack repo (dev branch):
- Update submodule pointers to intended released commits.
- Verify each pointer matches the expected
X.Y.Ztag commit in its submodule. - Commit submodule pointer updates.
- Set stack
VERSIONtoX.Y.Z. - Run version propagation script:
bash tools/scripts/bump-version.sh X.Y.Z- Verify with
bash tools/scripts/bump-version.sh --status
- Verify lockfile updates were generated and are staged for both frontend submodules:
front/admin/sitmun-admin-app/package-lock.jsonfront/viewer/sitmun-viewer-app/package-lock.json- If either lockfile did not update but
package.jsondid, runnpm install --package-lock-onlyin that submodule and re-check.
- Run immediate post-bump validation gates (mandatory):
- JSON parse checks:
node -e "JSON.parse(require('fs').readFileSync('front/admin/sitmun-admin-app/package.json','utf8'))"node -e "JSON.parse(require('fs').readFileSync('front/viewer/sitmun-viewer-app/package.json','utf8'))"
- Frontend compile checks:
- Admin: run build/watch compile and ensure no TypeScript errors.
- Viewer: run build/watch compile and ensure no TypeScript errors.
- If any parse/type error appears, stop release and fix before proceeding.
- JSON parse checks:
- Update
CHANGELOG.md:- Move release-ready
Unreleasedentries into## [X.Y.Z]. - Update compare links.
- Move release-ready
- Commit stack release metadata changes.
- Run stack validation checks (compose/build/tests as required).
- Confirm active dev terminals/watchers are free of compile errors before tagging.
- Ensure submodule pointer policy is explicit and documented in commit message:
- Either pointers reference the tagged
X.Y.Zcommit in each submodule, or - pointers reference merged
maincommits that includeX.Y.Z. - Recommended: reference merged
maincommits after submoduledev -> maingates.
- Either pointers reference the tagged
- Create stack tag:
sitmun-application-stack/X.Y.Z
- Push
devand tags.
git checkout maingit merge --no-ff dev- Resolve conflicts, run quick verification, push
main.
Keep release evidence (links/screenshots/log excerpts):
- Submodule tags created and pushed.
- Submodule
mainincludes release commits. - Stack submodule pointers match released commits.
- Stack
VERSIONandbump-version.sh --statusare consistent. - Frontend lockfiles (
adminandviewer) were updated and committed with the release bump. - Changelogs updated (stack + submodules).
- Stack tag created and pushed.
- Final
dev -> mainmerges complete.
- Prefer one coordinated version across stack and submodules for each release wave.
- If a submodule has no functional changes, still document explicit release alignment in changelog when bumping version.
- Do not force-push release branches.
- Malformed frontend environment object after bump
- Symptom: TypeScript errors around
environment.version/buildTimestamp. - Action: repair
src/environments/environment.tsandenvironment.prod.tsobject syntax, then re-run compile checks.
- Symptom: TypeScript errors around
- Malformed
package.jsonafter bump- Symptom:
Unexpected tokenJSON parse errors. - Action: fix malformed
versionline inpackage.json, then runnpm install --package-lock-onlyand re-check.
- Symptom:
- Angular component missing from compilation/module
- Symptom:
is missing from TypeScript compilationoris not a known element. - Action: restore file inclusion/module declaration, then re-run build/watch compile.
- Symptom:
- After any fix
- Re-run
bash tools/scripts/bump-version.sh --statusand all validation gates before continuing.
- Re-run
Use this only when X.Y.Z tags were published with incorrect content and must be corrected on dev.
- For each affected submodule, checkout and update
dev:git checkout dev && git pull origin dev
- Apply the required correction(s) on
devand commit. - Move local release tag to the corrected
devcommit:git tag -d <repo-prefix>/X.Y.Zgit tag -a <repo-prefix>/X.Y.Z -m "<repo-prefix> X.Y.Z (retag)"
- Update remote tag to point at corrected commit:
git push origin :refs/tags/<repo-prefix>/X.Y.Zgit push origin <repo-prefix>/X.Y.Z
- Push corrected
devbranch:git push origin dev
- Repeat for all submodules, then update stack submodule pointers on stack
dev, commit, and retag stack if needed:git tag -d sitmun-application-stack/X.Y.Zgit tag -a sitmun-application-stack/X.Y.Z -m "sitmun-application-stack X.Y.Z (retag)"git push origin :refs/tags/sitmun-application-stack/X.Y.Zgit push origin sitmun-application-stack/X.Y.Z
- Record explicit release evidence noting this was a corrective retag.