This document explains the CI/CD system for the Asset Tokenization Studio (ATS) monorepo, including development workflow, release processes, and how to work with changesets.
The repository uses Changesets for version management with independent release cycles for:
- ATS Project: Asset Tokenization Studio (contracts, SDK, web app)
- Mass Payout Project: Mass payout functionality
All development happens on the develop branch with automated testing, changeset validation, and manual release controls by authorized teams.
To be able to test github workflows locally you can use act, a github actions simulator act homepage
curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bashSubstitute <workflow> for the workflow you want to test (ats.pubilsh, mp.release, ...)
./bin/act workflow_dispatch \
-W .github/workflows/<workflow>.yml \
--input dry-run-enabled=true \
-s NPM_TOKEN=fake_token \
-P token-studio-linux-large=catthehacker/ubuntu:act-latestsequenceDiagram
participant D as develop
participant F as feature/branch
participant M as main
participant F1 as feature/branch-main
Note over D,M: Daily Development Pattern
D->>F: Create feature branch
Note over F: Code changes + changeset
F->>D: PR with changeset (tests + validation)
Note over D: Accumulate features
D->>F1: Create branch from develop
Note over F1: Same changes (no changeset needed)
F1->>M: PR to main (ready for release)
Note over M: Production-ready code
-
Create feature branch from develop:
git checkout develop && git pull origin develop git checkout -b feature/your-feature-name -
Make your changes to ATS or Mass Payout packages
-
Create changeset (required for all PRs):
npm run changeset
- Select affected packages
- Choose change type (patch/minor/major)
- Write clear description
-
Commit with DCO and Signature compliance:
Commit messages should comply with the conventional commits standard
git add .
git commit --signoff -S -m "feat: your commit message"
git push origin feature/your-feature-name- Open PR to develop branch - automated checks will run
For non-feature changes, add these labels to skip changeset requirement:
no-changeset: Configuration or documentation changesdocs-only: Documentation-only changeschore: Build system or dependency updateshotfix: Emergency fixes
| Workflow | Trigger | Purpose |
|---|---|---|
| ATS Tests | PR to main, ATS file changes | Run ATS contracts, SDK, and web tests |
| Mass Payout Tests | PR to main, MP file changes | Run Mass Payout package tests |
| Changeset Check | PR to develop | Validate changeset or bypass labels |
| Workflow | Purpose | Authorized Teams |
|---|---|---|
| ATS Release | Version ATS packages, create release | platform-ci, release-engineering-managers, iobuilders-hedera |
| Mass Payout Release | Version MP packages, create release | platform-ci, release-engineering-managers, iobuilders-hedera |
| Workflow | Trigger | Purpose |
|---|---|---|
| ATS Publish | Release tag *-ats |
Publish ATS packages to npm |
| Mass Payout Publish | Release tag *-mp |
Publish MP packages to npm |
The repository supports two release approaches:
- Automated Release Workflows (recommended for most releases)
- Manual Release Branches (alternative for complex releases or when automation is unavailable)
sequenceDiagram
participant Dev as Developer
participant M as main
participant GH as GitHub Actions
participant NPM as NPM Registry
Dev->>GH: Trigger ATS Release Workflow
GH->>GH: Validate ATS changesets exist
GH->>M: Run changeset version --ignore MP
GH->>M: Commit version changes to main
GH->>M: Create tag v1.16.0-ats
GH->>GH: Create GitHub release
GH->>NPM: Auto-trigger publish workflow
NPM->>NPM: Publish contracts & SDK
sequenceDiagram
participant Dev as Developer
participant M as main
participant GH as GitHub Actions
participant NPM as NPM Registry
Dev->>GH: Trigger MP Release Workflow
GH->>GH: Validate MP changesets exist
GH->>M: Run changeset version --ignore ATS
GH->>M: Commit version changes to main
GH->>M: Create tag v2.4.0-mp
GH->>GH: Create GitHub release
GH->>NPM: Auto-trigger publish workflow
NPM->>NPM: Publish MP packages
Both automated workflows support:
- Preview Mode: Shows what would be released (dry-run)
- Release Mode: Actually creates releases and triggers publishing
For complex releases or when automation is unavailable, you can use the traditional manual release branch approach:
sequenceDiagram
participant M as main
participant D as develop
participant F as feat/example
participant F1 as feat/example-main
participant R as release/v1.22.2-ats
Note over M,D: Initial state
loop for each feature in sprint
D->>F: Create feature branch
Note over F: Feature development + changeset
F->>D: Merge PR with changeset
D->>F1: Create branch from develop
F1->>M: Merge PR directly to main
end
M->>R: Create release branch
Note over R: Run: npx changeset version
Note over R: Generate changelogs + version bump
R->>M: Merge version commit to main
Note over M: Create tag v1.22.2-ats
Note over M: Manual GitHub release
Note over M: Automatic NPM publish via workflow
M->>D: Merge main back to develop
-
Create release branch from main:
git checkout main && git pull origin main git checkout -b release/v1.22.2-ats -
Apply changesets and version packages:
# For ATS release npx changeset version --ignore "@hashgraph/mass-payout*" # For Mass Payout release npx changeset version --ignore "@hashgraph/asset-tokenization-*"
-
Commit version changes:
git add . git commit --signoff -S -m "chore: release v1.22.2-ats" git push origin release/v1.22.2-ats
-
Merge release branch to main:
- Create PR from
release/v1.22.2-atstomain - Review and merge the version changes
- Create PR from
-
Create GitHub release:
- Create tag
v1.22.2-atson main branch - Create GitHub release with generated changelog
- Publishing workflows trigger automatically
- Create tag
-
Sync main back to develop:
git checkout develop git merge main git push origin develop
Benefits of Manual Release Branches:
- ✅ Full control over version timing and content
- ✅ Ability to make additional changes during release process
- ✅ Works with existing automated publishing workflows
- ✅ Suitable for complex releases requiring manual intervention
Only these teams can trigger releases:
platform-ciplatform-ci-committersrelease-engineering-managersdeveloper-advocatesiobuilders-hedera- Users containing
hashgraph
sequenceDiagram
participant D as develop
participant M as main
participant GH as GitHub Actions
participant NPM as NPM Registry
Note over D,M: Workflow Overview
loop Feature Development
Note over D: Features merge to develop
Note over D: Changesets accumulate
D->>M: Feature PRs to main
end
Note over M: Ready for release
M->>GH: Manual release trigger
GH->>M: Version packages + create tag
GH->>GH: Create GitHub release
GH->>NPM: Auto-trigger publish
NPM->>NPM: Publish to NPM
M->>D: Sync version changes back
❌ Changeset check failed
- Solution: Create changeset with
npm run changesetor add bypass label
❌ "No changesets found to be bumped"
- Solution: Ensure changesets exist for the project you're releasing
- Use
npm run changeset:statusto check pending changes
❌ Release workflow unauthorized
- Solution: Ensure you're member of authorized teams listed in CODEOWNERS
❌ Tests failing on PR
- Solution: Run
npm run ats:testornpm run mass-payout:testlocally - Fix failing tests before requesting review
❌ DCO check failed
- Solution: Ensure all commits use
--signoffflag:git commit --signoff -S -m "your message"
- Changesets documentation: Changesets Intro
- Check pending releases:
npm run changeset:status - Preview releases:
npm run release:preview - Local development: See
CLAUDE.mdfor complete development setup
# Development
npm run changeset # Create changeset
npm run changeset:status # Check pending changes
npm run ats:test # Run ATS tests
npm run mass-payout:test # Run MP tests
# Preview releases
npm run release:preview # Show all pending releases
npm run release:ats # Preview ATS release (local)
npm run release:mp # Preview MP release (local)