PortOS uses two GitHub Actions workflows for CI and releases.
| Branch | Purpose |
|---|---|
main |
Active development |
release |
Push main to release to trigger releases |
Triggers on PRs to main/release and pushes to main. Runs two parallel jobs:
- Installs root, server, and client dependencies
- Runs server tests (
npm test --prefix server) - Builds client (
npm run build --prefix client) - Skips on
[skip ci]commits (push events only; PR CI always runs)
- Checks server entry point for syntax errors (
node --check server/index.js)
Triggers on push to release branch. Steps:
- Reads version from
package.json - Checks if git tag already exists (skips if so)
- Looks for changelog file:
- First:
.changelog/v{version}.md(exact match) - Then:
.changelog/v{major}.{minor}.x.md(pattern match, replaces placeholders) - Fallback: generates changelog from commit messages
- First:
- Creates GitHub release with tag
v{version} - If a pattern changelog file (
.changelog/v{major}.{minor}.x.md) was used, archives it onmain(renames.x.md→ exact version) - If the archive step ran, fast-forwards
releaseto matchmain
Add [skip ci] to commit messages for non-code changes (docs, configs). Auto-generated commits from the release workflow include this automatically.
Since CI may auto-commit changelog archives, always rebase before pushing:
git pull --rebase --autostash && git push- Copy
.github/workflows/ci.ymland.github/workflows/release.yml - Update installation and build commands for your project structure
- For monorepos, add package.json update steps for each workspace
- Update the changelog file path pattern if different