diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 28353e61..6652c494 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,20 +1,30 @@ # 🔁 Pull Request Template – BharatMLStack - > Please fill out the following sections to help us review your changes efficiently. ---- +## Context: +Give a brief overview of the motivation behind this change. Include any relevant discussion links (Slack, documents, tickets, etc.) that help reviewers understand the background and the issue being addressed. -## 📌 Summary - -> e.g., Adds optimizes Redis fetch latency in `online-feature-store`, or improves search UI responsiveness in `trufflebox-ui`. +## Describe your changes: +Mention the changes made in the codebase. ---- +## Testing: +Please describe how you tested the code. If manual tests were performed - please explain how. If automatic tests were added or existing ones cover the change - please explain how did you run them. -## 📂 Modules Affected +## Monitoring: +Explain how this change will be tracked after deployment. Indicate whether current dashboards, alerts, and logs are enough, or if additional instrumentation is required. - +## Rollback plan +Explain rollback plan in case of issues. +## Checklist before requesting a review +- [ ] I have reviewed my own changes? +- [ ] Relevant or critical functionality is covered by tests? +- [ ] Monitoring needs have been evaluated? +- [ ] Any necessary documentation updates have been considered? + +## 📂 Modules Affected + - [ ] `horizon` (Real-time systems / networking) - [ ] `online-feature-store` (Feature serving infra) - [ ] `trufflebox-ui` (Admin panel / UI) @@ -38,5 +48,4 @@ ## 📊 Benchmark / Metrics (if applicable) - - + \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 76a653ea..ffe4e44c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,9 @@ name: Integration & Coordination CI on: pull_request: - branches: [master, develop] + branches: [main, develop] push: - branches: [master, develop] + branches: [main, develop] workflow_dispatch: # Allow manual triggering env: @@ -20,8 +20,8 @@ jobs: online-feature-store-changed: ${{ steps.changes.outputs.online-feature-store }} go-sdk-changed: ${{ steps.changes.outputs.go-sdk }} py-sdk-changed: ${{ steps.changes.outputs.py-sdk }} - helix-client-changed: ${{ steps.changes.outputs.helix-client }} inferflow-changed: ${{ steps.changes.outputs.inferflow }} + skye-changed: ${{ steps.changes.outputs.skye }} multiple-components: ${{ steps.check-multiple.outputs.multiple }} any-component: ${{ steps.check-any.outputs.any }} steps: @@ -47,10 +47,10 @@ jobs: - 'go-sdk/**' py-sdk: - 'py-sdk/**' - helix-client: - - 'helix-client/**' inferflow: - 'inferflow/**' + skye: + - 'skye/**' - name: Check if multiple components changed id: check-multiple @@ -74,10 +74,10 @@ jobs: if [ "${{ steps.changes.outputs.py-sdk }}" == "true" ]; then changed_count=$((changed_count + 1)) fi - if [ "${{ steps.changes.outputs.helix-client }}" == "true" ]; then + if [ "${{ steps.changes.outputs.inferflow }}" == "true" ]; then changed_count=$((changed_count + 1)) fi - if [ "${{ steps.changes.outputs.inferflow }}" == "true" ]; then + if [ "${{ steps.changes.outputs.skye }}" == "true" ]; then changed_count=$((changed_count + 1)) fi @@ -90,7 +90,7 @@ jobs: - name: Check if any component changed id: check-any run: | - if [ "${{ steps.changes.outputs.horizon }}" == "true" ] || [ "${{ steps.changes.outputs.trufflebox-ui }}" == "true" ] || [ "${{ steps.changes.outputs.numerix }}" == "true" ] || [ "${{ steps.changes.outputs.online-feature-store }}" == "true" ] || [ "${{ steps.changes.outputs.go-sdk }}" == "true" ] || [ "${{ steps.changes.outputs.py-sdk }}" == "true" ] || [ "${{ steps.changes.outputs.helix-client }}" == "true" ] || [ "${{ steps.changes.outputs.inferflow }}" == "true" ]; then + if [ "${{ steps.changes.outputs.horizon }}" == "true" ] || [ "${{ steps.changes.outputs.trufflebox-ui }}" == "true" ] || [ "${{ steps.changes.outputs.numerix }}" == "true" ] || [ "${{ steps.changes.outputs.online-feature-store }}" == "true" ] || [ "${{ steps.changes.outputs.go-sdk }}" == "true" ] || [ "${{ steps.changes.outputs.py-sdk }}" == "true" ] || [ "${{ steps.changes.outputs.inferflow }}" == "true" ] || [ "${{ steps.changes.outputs.skye }}" == "true" ]; then echo "any=true" >> $GITHUB_OUTPUT else echo "any=false" >> $GITHUB_OUTPUT @@ -110,8 +110,8 @@ jobs: echo "- Online Feature Store CI: ${{ needs.detect-changes.outputs.online-feature-store-changed }}" echo "- Go SDK CI: ${{ needs.detect-changes.outputs.go-sdk-changed }}" echo "- Python SDK CI: ${{ needs.detect-changes.outputs.py-sdk-changed }}" - echo "- Helix Client CI: ${{ needs.detect-changes.outputs.helix-client-changed }}" echo "- Inferflow CI: ${{ needs.detect-changes.outputs.inferflow-changed }}" + echo "- Skye CI: ${{ needs.detect-changes.outputs.skye-changed }}" echo "This workflow will proceed with integration tests..." integration-tests: @@ -130,7 +130,6 @@ jobs: echo "Testing Numerix matrix operations integration..." echo "Testing Go SDK compatibility with backend services..." echo "Testing Python SDK compatibility with backend services..." - echo "Testing Helix Client compatibility with backend services..." echo "Testing Inferflow compatibility with backend services..." # Add actual integration test commands here @@ -211,5 +210,5 @@ jobs: echo "- Online Feature Store: ${{ needs.detect-changes.outputs.online-feature-store-changed }}" >> $GITHUB_STEP_SUMMARY echo "- Go SDK: ${{ needs.detect-changes.outputs.go-sdk-changed }}" >> $GITHUB_STEP_SUMMARY echo "- Python SDK: ${{ needs.detect-changes.outputs.py-sdk-changed }}" >> $GITHUB_STEP_SUMMARY - echo "- Helix Client: ${{ needs.detect-changes.outputs.helix-client-changed }}" >> $GITHUB_STEP_SUMMARY - echo "- Inferflow: ${{ needs.detect-changes.outputs.inferflow-changed }}" >> $GITHUB_STEP_SUMMARY \ No newline at end of file + echo "- Inferflow: ${{ needs.detect-changes.outputs.inferflow-changed }}" >> $GITHUB_STEP_SUMMARY + echo "- Skye: ${{ needs.detect-changes.outputs.skye-changed }}" >> $GITHUB_STEP_SUMMARY \ No newline at end of file diff --git a/.github/workflows/go-sdk.yml b/.github/workflows/go-sdk.yml index 1f0bce69..d2356a14 100644 --- a/.github/workflows/go-sdk.yml +++ b/.github/workflows/go-sdk.yml @@ -2,10 +2,10 @@ name: Go SDK CI on: pull_request: - branches: [master, develop] + branches: [main, develop] paths: ['go-sdk/**'] push: - branches: [master, develop] + branches: [main, develop] paths: ['go-sdk/**'] jobs: diff --git a/.github/workflows/helix-client.yml b/.github/workflows/helix-client.yml deleted file mode 100644 index 9afb5ba5..00000000 --- a/.github/workflows/helix-client.yml +++ /dev/null @@ -1,71 +0,0 @@ -name: Helix Client CI - -on: - pull_request: - branches: [master, develop] - paths: ['helix-client/**'] - push: - branches: [master, develop] - paths: ['helix-client/**'] - -jobs: - build-helix-client: - runs-on: ubuntu-latest - defaults: - run: - working-directory: ./helix-client - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Go - uses: actions/setup-go@v4 - with: - go-version: '1.24' - cache: false - - - name: Cache Go modules - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-helix-client-${{ hashFiles('helix-client/go.sum') }} - restore-keys: | - ${{ runner.os }}-helix-client- - - - name: Download dependencies - run: go mod download - - - name: Verify dependencies - run: go mod verify - - - name: Run tests - run: go test -v ./... - - - name: Run tests with coverage - run: go test -v -coverprofile=coverage.out ./... - - - name: Display coverage - run: go tool cover -func=coverage.out - - - name: Build SDK packages - run: go build -v ./... - - - name: Run go vet - run: go vet ./... - - - name: Install staticcheck - run: go install honnef.co/go/tools/cmd/staticcheck@latest - - - name: Run staticcheck - run: staticcheck ./... - - - name: Check for go mod tidy - run: | - go mod tidy - if [ -n "$(git status --porcelain go.mod go.sum)" ]; then - echo "go.mod or go.sum is not tidy" - git diff go.mod go.sum - exit 1 - fi \ No newline at end of file diff --git a/.github/workflows/horizon.yml b/.github/workflows/horizon.yml index 33b7497c..a958ed21 100644 --- a/.github/workflows/horizon.yml +++ b/.github/workflows/horizon.yml @@ -2,10 +2,10 @@ name: Horizon CI on: pull_request: - branches: [master, develop] + branches: [main, develop] paths: ['horizon/**'] push: - branches: [master, develop] + branches: [main, develop] paths: ['horizon/**'] jobs: @@ -21,7 +21,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: '1.23' + go-version: '1.24' cache: false - name: Cache Go modules diff --git a/.github/workflows/inferflow.yml b/.github/workflows/inferflow.yml index bb93e1be..f5c7f22a 100644 --- a/.github/workflows/inferflow.yml +++ b/.github/workflows/inferflow.yml @@ -2,10 +2,10 @@ name: Inferflow CI on: pull_request: - branches: [master, develop] + branches: [main, develop] paths: ['inferflow/**'] push: - branches: [master, develop] + branches: [main, develop] paths: ['inferflow/**'] jobs: diff --git a/.github/workflows/interaction-store.yml b/.github/workflows/interaction-store.yml new file mode 100644 index 00000000..eca96afd --- /dev/null +++ b/.github/workflows/interaction-store.yml @@ -0,0 +1,56 @@ +name: Interaction Store CI + +on: + pull_request: + branches: [main, develop] + paths: ['interaction-store/**'] + push: + branches: [main, develop] + paths: ['interaction-store/**'] + +jobs: + build-interaction-store: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./interaction-store + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: '1.24' + cache: false + + - name: Cache Go modules + uses: actions/cache@v3 + with: + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-go-is-${{ hashFiles('interaction-store/go.sum') }} + restore-keys: | + ${{ runner.os }}-go-is- + + - name: Download dependencies + run: go mod download + + - name: Run tests + run: go test -v ./... + + - name: Build server + run: go build -v ./cmd/server + + - name: Build consumer + run: go build -v ./cmd/consumer + + - name: Run go vet + run: go vet ./... + + - name: Install staticcheck + run: go install honnef.co/go/tools/cmd/staticcheck@latest + + - name: Run staticcheck + run: staticcheck ./... diff --git a/.github/workflows/numerix.yml b/.github/workflows/numerix.yml index b1c6ba89..972dbec3 100644 --- a/.github/workflows/numerix.yml +++ b/.github/workflows/numerix.yml @@ -2,10 +2,10 @@ name: Numerix CI on: pull_request: - branches: [master, develop] + branches: [main, develop] paths: ['numerix/**'] push: - branches: [master, develop] + branches: [main, develop] paths: ['numerix/**'] jobs: diff --git a/.github/workflows/online-feature-store.yml b/.github/workflows/online-feature-store.yml index 822baf6a..d5f33d50 100644 --- a/.github/workflows/online-feature-store.yml +++ b/.github/workflows/online-feature-store.yml @@ -2,10 +2,10 @@ name: Online Feature Store CI on: pull_request: - branches: [master, develop] + branches: [main, develop] paths: ['online-feature-store/**'] push: - branches: [master, develop] + branches: [main, develop] paths: ['online-feature-store/**'] jobs: diff --git a/.github/workflows/py-sdk.yml b/.github/workflows/py-sdk.yml index 202d3224..799450f2 100644 --- a/.github/workflows/py-sdk.yml +++ b/.github/workflows/py-sdk.yml @@ -2,10 +2,10 @@ name: Python SDK CI on: pull_request: - branches: [master, develop] + branches: [main, develop] paths: ['py-sdk/**'] push: - branches: [master, develop] + branches: [main, develop] paths: ['py-sdk/**'] jobs: diff --git a/.github/workflows/release-helix-client.yml b/.github/workflows/release-helix-client.yml deleted file mode 100644 index 5ed33890..00000000 --- a/.github/workflows/release-helix-client.yml +++ /dev/null @@ -1,151 +0,0 @@ -name: Release Helix Client - -on: - workflow_dispatch: - inputs: - version: - description: 'Version to release (e.g., v0.1.20 or v0.1.20-beta.1)' - required: true - type: string - is_beta: - description: 'Is this a beta release?' - required: false - type: boolean - default: false - is_alpha: - description: 'Is this an alpha release?' - required: false - type: boolean - default: false - branch: - description: 'Branch to release from' - required: true - type: string - default: 'main' - -jobs: - release: - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 - ref: ${{ inputs.branch }} - - - name: Set up Go - uses: actions/setup-go@v4 - with: - go-version: '1.24' - - - name: Validate Helix Client - run: | - echo "Current branch: ${{ github.ref }}" - cd helix-client - go mod tidy - go test -v ./... - go build -v ./... - go vet ./... - - - name: Create Git tag - run: | - git config --global user.name "github-actions[bot]" - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - - TAG="helix-client/${{ inputs.version }}" - git tag -a "$TAG" -m "Helix Client release ${{ inputs.version }}" - git push origin "$TAG" - - - name: Create GitHub Release (Production) - if: ${{ !inputs.is_beta && !inputs.is_alpha }} - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: helix-client/${{ inputs.version }} - release_name: Helix Client ${{ inputs.version }} - body: | - ## Helix Client Release ${{ inputs.version }} - - ### Installation - ```bash - go get github.com/${{ github.repository }}/helix-client@${{ inputs.version }} - ``` - - ### Features - - Go client libraries for BharatMLStack services - - Numerix, Predator, and Skye client integrations - - Type-safe API bindings and gRPC support - - ### Usage - ```go - import "github.com/${{ github.repository }}/helix-client" - ``` - - ### Changes - Please see the commit history for detailed changes. - - ### Validation - - ✅ Tests passed - - ✅ Build successful - - ✅ Go vet clean - draft: false - prerelease: false - - - name: Create Beta Pre-release - if: ${{ inputs.is_beta }} - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: helix-client/${{ inputs.version }} - release_name: Helix Client ${{ inputs.version }} (Beta) - body: | - ## Helix Client Beta Release ${{ inputs.version }} - - ⚠️ **This is a beta release from the develop branch** - Use for testing purposes only. - - ### Installation - ```bash - go get github.com/${{ github.repository }}/helix-client@${{ inputs.version }} - ``` - - ### Changes - Please see the commit history for detailed changes. - - ### Validation - - ✅ Tests passed - - ✅ Build successful - - ✅ Go vet clean - draft: false - prerelease: true - - - name: Create Alpha Pre-release - if: ${{ inputs.is_alpha }} - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: helix-client/${{ inputs.version }} - release_name: Helix Client ${{ inputs.version }} (Alpha) - body: | - ## Helix Client Alpha Release ${{ inputs.version }} - - ⚠️ **This is an alpha release from a feature/fix branch** - Experimental build for development and testing. - - ### Installation - ```bash - go get github.com/${{ github.repository }}/helix-client@${{ inputs.version }} - ``` - - ### Changes - Please see the commit history for detailed changes. - - ### Validation - - ✅ Tests passed - - ✅ Build successful - - ✅ Go vet clean - draft: false - prerelease: true \ No newline at end of file diff --git a/.github/workflows/release-interaction-store.yml b/.github/workflows/release-interaction-store.yml new file mode 100644 index 00000000..b23a220f --- /dev/null +++ b/.github/workflows/release-interaction-store.yml @@ -0,0 +1,166 @@ +name: Release Interaction Store + +on: + workflow_dispatch: + inputs: + version: + description: 'Version to release (e.g., v0.1.20 or v0.1.20-beta.1)' + required: true + type: string + is_beta: + description: 'Is this a beta release?' + required: false + type: boolean + default: false + is_alpha: + description: 'Is this an alpha release?' + required: false + type: boolean + default: false + branch: + description: 'Branch to release from' + required: true + type: string + default: 'main' + +env: + REGISTRY: ghcr.io + IMAGE_PREFIX: ghcr.io/${{ github.repository_owner }} + +jobs: + release: + runs-on: ubuntu-latest + permissions: + contents: write + packages: write + strategy: + matrix: + component: [ + {name: "interaction-store-server", dockerfile: "cmd/server/Dockerfile"}, + {name: "interaction-store-consumer", dockerfile: "cmd/consumer/Dockerfile"} + ] + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ inputs.branch }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.IMAGE_PREFIX }}/${{ matrix.component.name }} + tags: | + type=raw,value=${{ inputs.version }} + type=raw,value=latest,enable=${{ !inputs.is_beta && !inputs.is_alpha }} + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: ./interaction-store + file: ./interaction-store/${{ matrix.component.dockerfile }} + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + create-release: + needs: release + runs-on: ubuntu-latest + if: ${{ !inputs.is_beta && !inputs.is_alpha }} + steps: + - name: Create GitHub Release (Production) + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: interaction-store/${{ inputs.version }} + release_name: Interaction Store ${{ inputs.version }} + body: | + ## Interaction Store Release ${{ inputs.version }} + + ### Docker Images + - `${{ env.IMAGE_PREFIX }}/interaction-store-server:${{ inputs.version }}` + - `${{ env.IMAGE_PREFIX }}/interaction-store-consumer:${{ inputs.version }}` + + ### Components + - **Server**: gRPC API server for interaction store operations + - **Consumer**: Kafka consumer for real-time interaction ingestion + + ### Changes + Please see the commit history for detailed changes. + draft: false + prerelease: false + + create-beta-release: + needs: release + runs-on: ubuntu-latest + if: ${{ inputs.is_beta }} + steps: + - name: Create GitHub Release (Beta) + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: interaction-store/${{ inputs.version }} + release_name: Interaction Store ${{ inputs.version }} (Beta) + body: | + ## Interaction Store Beta Release ${{ inputs.version }} + + ⚠️ **This is a beta release from the develop branch** - Use for testing purposes only. + + ### Docker Images + - `${{ env.IMAGE_PREFIX }}/interaction-store-server:${{ inputs.version }}` + - `${{ env.IMAGE_PREFIX }}/interaction-store-consumer:${{ inputs.version }}` + + ### Components + - **Server**: gRPC API server for interaction store operations + - **Consumer**: Kafka consumer for real-time interaction ingestion + + ### Changes + Please see the commit history for detailed changes. + draft: false + prerelease: true + + create-alpha-release: + needs: release + runs-on: ubuntu-latest + if: ${{ inputs.is_alpha }} + steps: + - name: Create GitHub Release (Alpha) + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: interaction-store/${{ inputs.version }} + release_name: Interaction Store ${{ inputs.version }} (Alpha) + body: | + ## Interaction Store Alpha Release ${{ inputs.version }} + + ⚠️ **This is an alpha release from a feature/fix branch** - Experimental build for development and testing. + + ### Docker Images + - `${{ env.IMAGE_PREFIX }}/interaction-store-server:${{ inputs.version }}` + - `${{ env.IMAGE_PREFIX }}/interaction-store-consumer:${{ inputs.version }}` + + ### Components + - **Server**: gRPC API server for interaction store operations + - **Consumer**: Kafka consumer for real-time interaction ingestion + + ### Changes + Please see the commit history for detailed changes. + draft: false + prerelease: true diff --git a/.github/workflows/release-skye.yml b/.github/workflows/release-skye.yml new file mode 100644 index 00000000..49eee560 --- /dev/null +++ b/.github/workflows/release-skye.yml @@ -0,0 +1,186 @@ +name: Release Skye + +on: + workflow_dispatch: + inputs: + version: + description: 'Version to release (e.g., v0.1.0 or v0.1.0-beta.1)' + required: true + type: string + is_beta: + description: 'Is this a beta release?' + required: false + type: boolean + default: false + is_alpha: + description: 'Is this an alpha release?' + required: false + type: boolean + default: false + branch: + description: 'Branch to release from' + required: true + type: string + default: 'main' + +env: + REGISTRY: ghcr.io + +jobs: + release: + runs-on: ubuntu-latest + permissions: + contents: write + packages: write + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ inputs.branch }} + + - name: Set image base (lowercase for ghcr.io) + run: echo "IMAGE_BASE=ghcr.io/$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]')/skye" >> $GITHUB_ENV + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (skye-admin) + id: meta-admin + uses: docker/metadata-action@v5 + with: + images: ${{ env.IMAGE_BASE }}-admin + tags: | + type=raw,value=${{ inputs.version }} + type=raw,value=latest,enable=${{ !inputs.is_beta && !inputs.is_alpha }} + + - name: Extract metadata (skye-consumers) + id: meta-consumers + uses: docker/metadata-action@v5 + with: + images: ${{ env.IMAGE_BASE }}-consumers + tags: | + type=raw,value=${{ inputs.version }} + type=raw,value=latest,enable=${{ !inputs.is_beta && !inputs.is_alpha }} + + - name: Extract metadata (skye-serving) + id: meta-serving + uses: docker/metadata-action@v5 + with: + images: ${{ env.IMAGE_BASE }}-serving + tags: | + type=raw,value=${{ inputs.version }} + type=raw,value=latest,enable=${{ !inputs.is_beta && !inputs.is_alpha }} + + - name: Build and push skye-admin + uses: docker/build-push-action@v5 + with: + context: ./skye + file: ./skye/cmd/admin/Dockerfile + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta-admin.outputs.tags }} + labels: ${{ steps.meta-admin.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: Build and push skye-consumers + uses: docker/build-push-action@v5 + with: + context: ./skye + file: ./skye/cmd/consumers/Dockerfile + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta-consumers.outputs.tags }} + labels: ${{ steps.meta-consumers.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: Build and push skye-serving + uses: docker/build-push-action@v5 + with: + context: ./skye + file: ./skye/cmd/serving/Dockerfile + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta-serving.outputs.tags }} + labels: ${{ steps.meta-serving.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: Create GitHub Release (Production) + if: ${{ !inputs.is_beta && !inputs.is_alpha }} + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: skye/${{ inputs.version }} + release_name: Skye ${{ inputs.version }} + body: | + ## Skye Release ${{ inputs.version }} + + ### Docker Images + - **skye-admin:** `${{ env.IMAGE_BASE }}-admin:${{ inputs.version }}` / `:latest` + - **skye-consumers:** `${{ env.IMAGE_BASE }}-consumers:${{ inputs.version }}` / `:latest` + - **skye-serving:** `${{ env.IMAGE_BASE }}-serving:${{ inputs.version }}` / `:latest` + + ### Quickstart + See [skye/docs/QUICKSTART.md](https://github.com/${{ github.repository }}/blob/${{ inputs.branch }}/skye/docs/QUICKSTART.md) for run instructions. + + ### Changes + Please see the commit history for detailed changes. + draft: false + prerelease: false + + - name: Create GitHub Release (Beta) + if: ${{ inputs.is_beta }} + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: skye/${{ inputs.version }} + release_name: Skye ${{ inputs.version }} (Beta) + body: | + ## Skye Beta Release ${{ inputs.version }} + + ⚠️ **This is a beta release** - Use for testing purposes only. + + ### Docker Images + - `${{ env.IMAGE_BASE }}-admin:${{ inputs.version }}` + - `${{ env.IMAGE_BASE }}-consumers:${{ inputs.version }}` + - `${{ env.IMAGE_BASE }}-serving:${{ inputs.version }}` + + ### Changes + Please see the commit history for detailed changes. + draft: false + prerelease: true + + - name: Create GitHub Release (Alpha) + if: ${{ inputs.is_alpha }} + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: skye/${{ inputs.version }} + release_name: Skye ${{ inputs.version }} (Alpha) + body: | + ## Skye Alpha Release ${{ inputs.version }} + + ⚠️ **This is an alpha release** - Experimental build for development and testing. + + ### Docker Images + - `${{ env.IMAGE_BASE }}-admin:${{ inputs.version }}` + - `${{ env.IMAGE_BASE }}-consumers:${{ inputs.version }}` + - `${{ env.IMAGE_BASE }}-serving:${{ inputs.version }}` + + ### Changes + Please see the commit history for detailed changes. + draft: false + prerelease: true diff --git a/.github/workflows/skye.yml b/.github/workflows/skye.yml new file mode 100644 index 00000000..45c31437 --- /dev/null +++ b/.github/workflows/skye.yml @@ -0,0 +1,56 @@ +name: Skye CI + +on: + pull_request: + branches: [master, develop] + paths: ['skye/**'] + push: + branches: [master, develop] + paths: ['skye/**'] + +jobs: + build-skye: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./skye + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: '1.24' + cache: false + + - name: Cache Go modules + uses: actions/cache@v3 + with: + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-go-skye-${{ hashFiles('skye/go.sum') }} + restore-keys: | + ${{ runner.os }}-go-skye- + + - name: Download dependencies + run: go mod download + + - name: Run tests + run: go test -v ./... + + - name: Build binaries + run: | + go build -o /dev/null ./cmd/admin + go build -o /dev/null ./cmd/consumers + go build -o /dev/null ./cmd/serving + + - name: Run go vet + run: go vet ./... + + - name: Install staticcheck + run: go install honnef.co/go/tools/cmd/staticcheck@latest + + - name: Run staticcheck + run: staticcheck ./... diff --git a/.github/workflows/trufflebox-ui.yml b/.github/workflows/trufflebox-ui.yml index 77442b00..e920678f 100644 --- a/.github/workflows/trufflebox-ui.yml +++ b/.github/workflows/trufflebox-ui.yml @@ -2,10 +2,10 @@ name: Trufflebox UI CI on: pull_request: - branches: [master, develop] + branches: [main, develop] paths: ['trufflebox-ui/**'] push: - branches: [master, develop] + branches: [main, develop] paths: ['trufflebox-ui/**'] jobs: diff --git a/.gitignore b/.gitignore index 93b602fd..e130cc1d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,10 +4,14 @@ trufflebox-ui/node_modules/ dist/ .env* .idea/ +.vscode/ workspace/ .vscode/ .cursor/ __pycache__/ +java-sdk/onfs/feature-store-client/target/ +java-sdk/onfs/feature-store-flink-connector-sdk-flink1x/target/ +java-sdk/onfs/feature-store-core/target/ # Dev toggle script artifacts .internal-configs/ @@ -19,3 +23,11 @@ flashring/performance_results.csv flashring/mem.prof flashring/flashring flashring/flashringtest + + + +horizon/pem/*.pem +horizon/pem/*.key +horizon/configs/*.pem +go.work +go.work.sum diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c721100c..57dfa835 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,6 +4,15 @@ repos: - id: trufflehog name: TruffleHog description: Detect secrets in your data. - entry: "trufflehog/trufflehog-hook.sh" + entry: "pre-commit-scripts/runner.sh" language: script stages: ["pre-commit", "pre-push"] + - repo: local + hooks: + - id: post-commit + name: Post Commit + description: Run post-commit scripts. + entry: "post-commit-scripts/runner.sh" + language: script + stages: ["post-commit"] + always_run: true diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 2decad3c..00000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - - { - "name": "Shard", - "type": "go", - "request": "launch", - "mode": "debug", - "program": "${workspaceFolder}/ssd-cache/cmd/shardtest/main.go" - }, - { - "name": "Cache", - "type": "go", - "request": "launch", - "mode": "debug", - "program": "${workspaceFolder}/ssd-cache/cmd/cachetest/main.go" - }, - { - "name": "Flashring", - "type": "go", - "request": "launch", - "mode": "debug", - "program": "${workspaceFolder}/flashring/cmd/flashringtest", - "env": { - "PLAN": "readthrough-batched" - } - } - - ] -} \ No newline at end of file diff --git a/README.md b/README.md index 508c6f8d..b0c0ff31 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ -# BharatMLStack -
+
+
+
+
+ );
+}
+
+function NetworkBackground() {
+ const canvasRef = useRef(null);
+
+ useEffect(() => {
+ const canvas = canvasRef.current;
+ if (!canvas) return;
+ const ctx = canvas.getContext('2d');
+ let animationId;
+ let nodes = [];
+ const NODE_COUNT = 50;
+ const CONNECTION_DIST = 150;
+
+ function resize() {
+ const parent = canvas.parentElement;
+ canvas.width = parent.offsetWidth;
+ canvas.height = parent.offsetHeight;
+ }
+
+ function initNodes() {
+ nodes = [];
+ for (let i = 0; i < NODE_COUNT; i++) {
+ nodes.push({
+ x: Math.random() * canvas.width,
+ y: Math.random() * canvas.height,
+ vx: (Math.random() - 0.5) * 0.4,
+ vy: (Math.random() - 0.5) * 0.4,
+ radius: Math.random() * 2 + 1,
+ });
+ }
+ }
+
+ function draw() {
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+
+ // Draw connections
+ for (let i = 0; i < nodes.length; i++) {
+ for (let j = i + 1; j < nodes.length; j++) {
+ const dx = nodes[i].x - nodes[j].x;
+ const dy = nodes[i].y - nodes[j].y;
+ const dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist < CONNECTION_DIST) {
+ const opacity = (1 - dist / CONNECTION_DIST) * 0.25;
+ ctx.beginPath();
+ ctx.moveTo(nodes[i].x, nodes[i].y);
+ ctx.lineTo(nodes[j].x, nodes[j].y);
+ ctx.strokeStyle = `rgba(99, 102, 241, ${opacity})`;
+ ctx.lineWidth = 0.8;
+ ctx.stroke();
+ }
+ }
+ }
+
+ // Draw nodes
+ for (const node of nodes) {
+ ctx.beginPath();
+ ctx.arc(node.x, node.y, node.radius, 0, Math.PI * 2);
+ ctx.fillStyle = 'rgba(139, 92, 246, 0.5)';
+ ctx.fill();
+ }
+ }
+
+ function update() {
+ for (const node of nodes) {
+ node.x += node.vx;
+ node.y += node.vy;
+ // Bounce off edges
+ if (node.x < 0 || node.x > canvas.width) node.vx *= -1;
+ if (node.y < 0 || node.y > canvas.height) node.vy *= -1;
+ // Keep in bounds
+ node.x = Math.max(0, Math.min(canvas.width, node.x));
+ node.y = Math.max(0, Math.min(canvas.height, node.y));
+ }
+ }
+
+ function animate() {
+ update();
+ draw();
+ animationId = requestAnimationFrame(animate);
+ }
+
+ resize();
+ initNodes();
+ animate();
+
+ const resizeObserver = new ResizeObserver(() => {
+ resize();
+ });
+ resizeObserver.observe(canvas.parentElement);
+
+ return () => {
+ cancelAnimationFrame(animationId);
+ resizeObserver.disconnect();
+ };
+ }, []);
+
+ return (
+
+ );
+}
+
+function HeroSection() {
+ const getStartedUrl = useBaseUrl('/intro');
+ return (
+
Open source, end-to-end ML infrastructure stack built for scale, speed, and simplicity.
+ Integrate, deploy, and manage robust ML workflows with full reliability and control.
Adopted by data teams building at scale
- BharatMLStack is a comprehensive, production-ready machine learning infrastructure
- platform designed to democratize ML capabilities across India and beyond. Our mission
- is to provide a robust, scalable, and accessible ML stack that empowers organizations
- to build, deploy, and manage machine learning solutions at massive scale.
- Why BharatMLStack
+ ML teams spend more time fighting infrastructure than building intelligence.
+ BharatMLStack removes those barriers.
+ {barrier.answer}
- Trufflebox UI provides a comprehensive, modern web interface for managing your entire
- ML infrastructure. Built with cutting-edge web technologies, it delivers an intuitive
- experience for feature management, user administration, and operational oversight.
- Streamline your MLOps workflows with enterprise-grade UI components.
- Platform Components
+ Purpose-built components for every stage of the ML lifecycle, from feature
+ serving to model deployment.
+
- Our SDKs are designed with developers in mind, providing idiomatic APIs for Go and Python
- that feel natural in your existing codebase. Whether you're building microservices,
- data pipelines, or ML applications, our SDKs provide the tools you need for seamless
- integration with BharatMLStack's powerful infrastructure.
- Proven at scale {stat.label} {stat.description} See it in action
+ Watch short demos of each BharatMLStack component in action.
+ {video.description} From our blog
+ Technical articles, architecture deep-dives, and the story behind BharatMLStack.
+
+ Comprehensive stack for business-ready ML. Integrates seamlessly with enterprise
+ systems. Robust security and regulatory compliance.
+ We could not find what you were looking for. Please contact the owner of the site that linked you to the original URL and let them know their link is broken. We could not find what you were looking for. Please contact the owner of the site that linked you to the original URL and let them know their link is broken.Build production ML pipelines faster
+
+ 🏆 Key Achievements
-
-
The Real Barriers to Scaling Machine Learning
+ {barrier.title}
+
+ {barrier.questions.map((q, i) => (
+
+ 🎨 UI Features
-
-
+ BharatMLStack Components
+ 🛠️ Developer Tools
-
-
+ Scaling Numbers
+ Demo Videos
+ {video.title}
+ View Our Blogs
+ {post.title}
+ Deploy ML models with confidence
+ Page Not Found
Page Not Found