Skip to content
This repository was archived by the owner on Feb 4, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
111 changes: 108 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,14 @@ name: CI

on:
push:
branches: [ main, feature/*, release/* , release-* ]
branches: [ main, feature/*, release/*, release-* ]
pull_request:
branches: [ main ]
workflow_dispatch:

jobs:
build-and-test:
runs-on: ubuntu-latest
#runs-on: self-hosted

steps:
- name: Checkout code
Expand Down Expand Up @@ -41,4 +40,110 @@ jobs:
path: |
**/target/surefire-reports/*.xml
**/target/failsafe-reports/*.xml
retention-days: 7
retention-days: 7

e2e-tests:
runs-on: ubuntu-latest
needs: build-and-test
if: github.ref == 'refs/heads/main' || contains(github.event.head_commit.message, '[e2e]')

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Java 25
uses: actions/setup-java@v4
with:
java-version: '25-ea'
distribution: 'zulu'
cache: 'maven'

- name: Configure Maven for GitHub Packages
run: |
mkdir -p ~/.m2
echo "<settings><servers><server><id>github</id><username>\${env.GITHUB_ACTOR}</username><password>\${env.GITHUB_TOKEN}</password></server></servers></settings>" > ~/.m2/settings.xml

- name: Build artifacts
run: mvn --no-transfer-progress --batch-mode package -DskipTests
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Run E2E tests
run: mvn --no-transfer-progress --batch-mode verify -pl e2e-tests -DskipE2ETests=false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Upload E2E test results
uses: actions/upload-artifact@v4
if: always()
with:
name: e2e-test-results
path: e2e-tests/target/failsafe-reports/*.xml
retention-days: 7

docker-build:
runs-on: ubuntu-latest
needs: build-and-test
if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release')
permissions:
contents: read
packages: write

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Java 25
uses: actions/setup-java@v4
with:
java-version: '25-ea'
distribution: 'zulu'
cache: 'maven'

- name: Configure Maven for GitHub Packages
run: |
mkdir -p ~/.m2
echo "<settings><servers><server><id>github</id><username>\${env.GITHUB_ACTOR}</username><password>\${env.GITHUB_TOKEN}</password></server></servers></settings>" > ~/.m2/settings.xml

- name: Build JARs
run: mvn --no-transfer-progress --batch-mode package -DskipTests
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract version
id: version
run: echo "VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_OUTPUT

- name: Build and push Aether Node
uses: docker/build-push-action@v6
with:
context: .
file: docker/aether-node/Dockerfile
push: true
tags: |
ghcr.io/${{ github.repository_owner }}/aether-node:${{ steps.version.outputs.VERSION }}
ghcr.io/${{ github.repository_owner }}/aether-node:latest
cache-from: type=gha
cache-to: type=gha,mode=max

- name: Build and push Aether Forge
uses: docker/build-push-action@v6
with:
context: .
file: docker/aether-forge/Dockerfile
push: true
tags: |
ghcr.io/${{ github.repository_owner }}/aether-forge:${{ steps.version.outputs.VERSION }}
ghcr.io/${{ github.repository_owner }}/aether-forge:latest
cache-from: type=gha
cache-to: type=gha,mode=max
47 changes: 47 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,53 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.6.4] - 2026-01-01

### Added
- **Docker container infrastructure** - Separate Dockerfiles for aether-node and aether-forge with Alpine base
- **docker-compose.yml** - 3-node cluster configuration with health checks and optional Forge profile
- **E2E testing module** - Testcontainers-based E2E tests for cluster formation, deployment, and chaos scenarios
- **AetherNodeContainer** - Testcontainer wrapper with API helpers for E2E tests
- **AetherCluster** - Multi-node cluster helper for managing N-node clusters in tests
- **CI workflow enhancements** - E2E tests job (main or `[e2e]` tag) and Docker build/push to ghcr.io
- **Rolling update system** - Two-stage deployment model (deploy then route) for zero-downtime updates
- `ArtifactBase` - Version-agnostic artifact identifier for rolling updates
- `RollingUpdateState` - State machine with 10 states (PENDING → COMPLETED/ROLLED_BACK/FAILED)
- `VersionRouting` - Ratio-based traffic routing between versions (e.g., 1:3 = 25% new)
- `HealthThresholds` - Configurable error rate and latency thresholds for auto-progression
- `CleanupPolicy` - IMMEDIATE, GRACE_PERIOD (5min), or MANUAL cleanup of old versions
- `RollingUpdateManager` - Interface for start/adjust/approve/complete/rollback operations
- **Weighted endpoint routing** - `EndpointRegistry.selectEndpointWithRouting()` with weighted round-robin
- **Rolling update API endpoints** - REST API for rolling update management
- `POST /rolling-update/start` - Start new rolling update
- `GET /rolling-updates` - List active updates
- `GET /rolling-update/{id}` - Get update status
- `POST /rolling-update/{id}/routing` - Adjust traffic ratio
- `POST /rolling-update/{id}/approve` - Manual approval
- `POST /rolling-update/{id}/complete` - Complete update
- `POST /rolling-update/{id}/rollback` - Rollback to old version
- `GET /rolling-update/{id}/health` - Version health metrics
- **Rolling update CLI commands** - `aether update` command group
- `update start <artifact> <version>` - Start rolling update with health thresholds
- `update status <id>` - Get update status
- `update list` - List active updates
- `update routing <id> -r <ratio>` - Adjust traffic routing
- `update approve/complete/rollback <id>` - Update lifecycle operations
- `update health <id>` - View version health metrics
- **KV schema extensions** - `VersionRoutingKey`, `RollingUpdateKey`, `VersionRoutingValue`, `RollingUpdateValue`
- **Observability metrics** - Micrometer integration with Prometheus endpoint
- `GET /metrics/prometheus` - Prometheus-format metrics scrape endpoint
- `ObservabilityRegistry` - Central registry for metrics with JVM/process metrics
- `AetherMetrics` - Pre-configured metrics for slice invocations, consensus, deployments
- JVM metrics - memory, GC, threads, classloaders via Micrometer binders

### Changed
- **pragmatica-lite 0.9.3** - Updated with consensus observability support

### Fixed
- **RabiaNode protocol message routing** - Added routes for RabiaProtocolMessage types (Propose, Vote, Decision, SyncRequest/Response, NewBatch) to RabiaEngine
- **TestCluster QuorumStateNotification** - Added missing route for QuorumStateNotification to RabiaEngine in test infrastructure

## [0.6.3] - 2026-01-01

### Added
Expand Down
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Project Overview

**Pragmatica Aether Distributed Runtime** (v0.6.3) is an AI-driven distributed runtime environment for Java that enables predictive scaling,
**Pragmatica Aether Distributed Runtime** (v0.6.4) is an AI-driven distributed runtime environment for Java that enables predictive scaling,
intelligent orchestration, and seamless multi-cloud deployment without requiring changes to business logic.

**See [docs/vision-and-goals.md](docs/vision-and-goals.md) for complete vision and design principles.**
Expand Down Expand Up @@ -95,7 +95,7 @@ Maven-style coordinates for slices:

```java
// Format: groupId:artifactId:version[-qualifier]
Artifact.artifact("org.pragmatica-lite.aether:example-slice:0.6.3")
Artifact.artifact("org.pragmatica-lite.aether:example-slice:0.6.4")
```

**Components**:
Expand Down
2 changes: 1 addition & 1 deletion cli/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<parent>
<groupId>org.pragmatica-lite.aether</groupId>
<artifactId>aether</artifactId>
<version>0.6.3</version>
<version>0.6.4</version>
</parent>

<artifactId>cli</artifactId>
Expand Down
Loading