- Make
- Go 1.24+
- Python 3.13+
- uv (required for Python development)
- Docker and Docker Compose (for component- and integration tests)
- Kubectl, Helm, Kind (for local deployment and e2e tests)
Install Go 1.24+:
On macOS/Linux:
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
gvm install go1.24
gvm use go1.24 --defaultConfigure Go binary PATH:
After installing Go, ensure $GOPATH/bin is in your PATH for Go tools (golangci-lint, goimports):
# Add to your shell profile (~/.zshrc, ~/.bashrc, or ~/.profile)
export PATH="$(go env GOPATH)/bin:$PATH"
# Reload your shell or source the profile
source ~/.zshrc # or ~/.bashrcVerify the setup:
go version # Should show go1.24+
go env GOPATH # Should show your GOPATH (e.g., /Users/username/go)
echo $PATH | grep "$(go env GOPATH)/bin" # Should include GOPATH/binInstall uv:
# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows (not tested yet)
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"make setupNote: All Python commands are executed via uv to ensure consistent dependency management.
# Run all unit tests (Go + Python)
make test-unit
# Run unit tests for specific components
make -C src/asya-sidecar test-unit # Go sidecar unit tests only
make -C src/asya-gateway test-unit # Go gateway unit tests only
make -C src/asya-runtime test-unit # Python runtime unit tests only
make -C src/asya-injector test-unit # Go injector webhook unit tests only
make -C src/asya-crew test-unit # Python crew unit tests only
make -C src/asya-cli test-unit # Python CLI unit tests only
# Run all component tests (single component + lightweight mocks in Docker Compose)
make test-component
# Clean up component test Docker resources
make clean-component
# Run all integration tests (multiple components in Docker Compose)
make test-integration
# Run specific integration test suites
make -C testing/integration/sidecar-runtime test # Sidecar ↔ Runtime
make -C testing/integration/gateway-actors test # Gateway ↔ Actors
# Clean up integration test Docker resources
make clean-integration
# Run end-to-end tests (full stack in Kind cluster)
make test-e2e
# Clean up e2e test resources (delete Kind cluster)
make clean-e2e
# Run all tests (unit + integration)
make testThe project uses octocov for code coverage reporting - a fully open-source solution that runs in GitHub Actions without external services.
Quick Coverage Check:
# Run all tests with coverage and display summary (recommended)
make cov
# Run coverage for specific components
make -C src/asya-sidecar cov-unit # Sidecar (Go)
make -C src/asya-gateway cov-unit # Gateway (Go)
make -C src/asya-injector cov-unit # Injector webhook (Go)
make -C src/asya-runtime cov-unit # Runtime (Python)
make -C src/asya-crew cov-unit # System actors (Python)
make -C src/asya-cli cov-unit # CLI (Python)The make cov command:
- Runs all tests with coverage enabled
- Displays a clean summary for each component
- Prevents coverage output from getting lost in verbose test logs
- Generates HTML reports for detailed analysis
Local Development:
- Use
make covto see coverage summaries - Tests display coverage stats in the terminal
- No configuration needed
CI/Pull Requests:
- Coverage reports are automatically posted as PR comments
- Coverage history is tracked in the
gh-pagesbranch - Uses only
GITHUB_TOKEN(no third-party API keys needed)
Viewing detailed coverage reports:
# After running 'make cov', HTML reports are generated:
# - Python: open src/asya-runtime/htmlcov/index.html
# - Go: go tool cover -html=src/asya-sidecar/coverage.outCoverage files:
- Go:
coverage.out,coverage-integration.out - Python:
coverage.xml(Cobertura format),htmlcov/(HTML reports) - All coverage files are ignored by git (see
.gitignore)
# Build all Go components (sidecar, gateway, injector)
make build-go
# Build all Docker images
make build-images# Run all linters and formatters (automatically fixes issues when possible)
make lintNote: Pre-commit hooks are automatically installed by make setup. They run linters on every git commit.
The integration tests require Docker to spin up:
- RabbitMQ for message queuing
- Actor runtime (Python) containers
- Actor sidecar (Go) containers
- Gateway (for gateway tests)
These tests validate the complete message flow through the system.
# Build documentation to site/ directory
make docs-build
# Serve documentation locally at http://127.0.0.1:8000
make docs-serve# Clean build artifacts and test resources
make clean- Create a feature branch from
main - Make your changes
- Run tests:
make test - Run linters:
make lint - Commit your changes following Conventional Commits (pre-commit hooks will run automatically)
- Push and create a pull request with a conventional commit prefix in the title
This project follows the Conventional Commits v1.0.0 specification. All PR titles must use one of these prefixes:
Required prefixes:
feat:- New feature (triggers MINOR version bump)fix:- Bug fix (triggers PATCH version bump)
Additional standard prefixes:
docs:- Documentation changesstyle:- Code formatting (no logic changes)refactor:- Code restructuring (no functionality change)perf:- Performance improvementstest:- Test changesbuild:- Build system changesci:- CI configuration changeschore:- Other changes (tooling, maintenance)
Breaking changes:
- Add
!after type/scope:feat!:orfeat(api)!: - Or include
BREAKING CHANGE:in commit body
Examples:
feat(gateway): add support for SQS transport
fix(sidecar): resolve memory leak in message handler
docs: update deployment instructions
chore(deps): upgrade Go to 1.24
ci: add automated release workflow
Labels are automatically applied based on PR title prefixes and file paths.
Asya uses automated workflows for releases and changelog management:
- Draft Releases: Release-drafter automatically maintains a draft release with categorized changelog based on merged PRs
- Docker Images: When a release is published, Docker images are automatically built and pushed to GitHub Container Registry
- Changelog: CHANGELOG.md is automatically updated via a pull request after release
-
Review the draft release:
- Go to Releases
- Review the auto-generated draft release created by release-drafter
- Edit the release notes if needed
-
Publish the release:
- Click "Publish release"
- This triggers the release workflow which:
- Builds all Docker images (asya-injector, asya-gateway, asya-sidecar, asya-crew, asya-testing)
- Pushes images to
ghcr.io/deliveryhero/asya-*:VERSION - Tags images as
latest(for non-prerelease versions)
-
Docker Images:
- Images are published to GitHub Container Registry (ghcr.io)
- Available at:
ghcr.io/deliveryhero/asya-<component>:<version> - Latest stable version tagged as:
ghcr.io/deliveryhero/asya-<component>:latest
-
Changelog Update:
- After release publication, a PR is automatically created to update CHANGELOG.md
- Review and merge the PR to keep the changelog in sync
Labels are automatically applied based on your PR title prefix (see Commit Message Format above) and changed file paths. The following labels are used:
Conventional Commit labels:
feat- New features (fromfeat:prefix)fix- Bug fixes (fromfix:prefix)docs- Documentation (fromdocs:prefix or*.mdfiles)style- Code formatting (fromstyle:prefix)refactor- Code restructuring (fromrefactor:prefix)perf- Performance improvements (fromperf:prefix)test- Tests (fromtest:prefix or test files)build- Build changes (frombuild:prefix)ci- CI changes (fromci:prefix or.github/**files)chore- Maintenance (fromchore:prefix)
Special labels:
breaking- Breaking changes (fromtype!:orBREAKING CHANGE:)deps- Dependencies (fromgo.mod,requirements.txtchanges)- Component labels (
asya-gateway,asya-sidecar, etc.) - Auto-applied based on changed files
You can manually add labels if the autolabeler doesn't catch everything.
The project follows Semantic Versioning:
- Major (X.0.0): Breaking changes (label:
breaking) - Minor (0.X.0): New features (label:
feat) - Patch (0.0.X): Bug fixes and other changes (labels:
fix,docs,style,refactor,perf,test,build,ci,chore)
Release-drafter automatically suggests the next version based on PR labels.