mirror of
https://github.com/ruvnet/RuVector.git
synced 2026-05-30 20:43:38 +00:00
- Add Dockerfiles for 8 RuVector components: - ruvector-core: Core vector database engine with HNSW indexing - ruvector-server: REST API server (port 8080) - ruvector-cli: CLI + MCP server for AI integration (port 3000) - ruvector-gnn: Graph Neural Networks (GCN, GAT, GIN) - ruvector-graph: Neo4j-compatible Cypher graph DB (ports 7687, 7474) - ruvector-attention: 39 attention mechanisms (MHA, GQA, MoA) - ruvector-cluster: Raft consensus distributed clustering - ruvector-sona: Self-Optimizing Neural Architecture - Add comprehensive README.md for each image with: - Docker Hub badges - Features and quickstart guides - Configuration tables - Performance benchmarks - Add docker-compose.full.yml for 9-service orchestration - Add build/publish/test scripts in docker/scripts/ - Add GitHub Actions workflow for multi-arch Docker publishing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
241 lines
7.8 KiB
YAML
241 lines
7.8 KiB
YAML
name: Docker Publish
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- 'v*'
|
|
workflow_dispatch:
|
|
inputs:
|
|
version:
|
|
description: 'Version to publish (e.g., v0.1.0)'
|
|
required: true
|
|
type: string
|
|
|
|
env:
|
|
REGISTRY: docker.io
|
|
REGISTRY_USERNAME: ruvnet
|
|
|
|
jobs:
|
|
build-and-push:
|
|
name: Build and Push ${{ matrix.image }}
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
contents: read
|
|
packages: write
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
image:
|
|
- ruvector-core
|
|
- ruvector-server
|
|
- ruvector-cli
|
|
- ruvector-gnn
|
|
- ruvector-graph
|
|
- ruvector-attention
|
|
- ruvector-cluster
|
|
- ruvector-sona
|
|
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Set up QEMU
|
|
uses: docker/setup-qemu-action@v3
|
|
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v3
|
|
with:
|
|
driver-opts: |
|
|
image=moby/buildkit:latest
|
|
network=host
|
|
|
|
- name: Log in to Docker Hub
|
|
uses: docker/login-action@v3
|
|
with:
|
|
registry: ${{ env.REGISTRY }}
|
|
username: ${{ env.REGISTRY_USERNAME }}
|
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
|
|
|
- name: Extract version
|
|
id: version
|
|
run: |
|
|
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
|
VERSION="${{ github.event.inputs.version }}"
|
|
else
|
|
VERSION="${GITHUB_REF#refs/tags/}"
|
|
fi
|
|
# Strip 'v' prefix
|
|
VERSION="${VERSION#v}"
|
|
echo "version=${VERSION}" >> $GITHUB_OUTPUT
|
|
echo "Version: ${VERSION}"
|
|
|
|
- name: Extract Docker metadata
|
|
id: meta
|
|
uses: docker/metadata-action@v5
|
|
with:
|
|
images: ${{ env.REGISTRY }}/${{ env.REGISTRY_USERNAME }}/${{ matrix.image }}
|
|
tags: |
|
|
type=semver,pattern={{version}},value=${{ steps.version.outputs.version }}
|
|
type=semver,pattern={{major}}.{{minor}},value=${{ steps.version.outputs.version }}
|
|
type=semver,pattern={{major}},value=${{ steps.version.outputs.version }}
|
|
type=raw,value=latest,enable={{is_default_branch}}
|
|
labels: |
|
|
org.opencontainers.image.title=${{ matrix.image }}
|
|
org.opencontainers.image.description=RuVector - ${{ matrix.image }}
|
|
org.opencontainers.image.vendor=RuVector
|
|
org.opencontainers.image.version=${{ steps.version.outputs.version }}
|
|
|
|
- name: Determine Dockerfile
|
|
id: dockerfile
|
|
run: |
|
|
IMAGE_NAME="${{ matrix.image }}"
|
|
DOCKERFILE="docker/images/${IMAGE_NAME}/Dockerfile"
|
|
echo "dockerfile=${DOCKERFILE}" >> $GITHUB_OUTPUT
|
|
echo "Using Dockerfile: ${DOCKERFILE}"
|
|
|
|
- name: Build and push Docker image
|
|
uses: docker/build-push-action@v5
|
|
with:
|
|
context: .
|
|
file: ${{ steps.dockerfile.outputs.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
|
|
build-args: |
|
|
VERSION=${{ steps.version.outputs.version }}
|
|
BUILD_DATE=${{ github.event.head_commit.timestamp }}
|
|
VCS_REF=${{ github.sha }}
|
|
|
|
- name: Image digest
|
|
run: echo "Digest - ${{ steps.build.outputs.digest }}"
|
|
|
|
test-images:
|
|
name: Test Docker Images
|
|
needs: build-and-push
|
|
runs-on: ubuntu-latest
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
image:
|
|
- ruvector-core
|
|
- ruvector-server
|
|
- ruvector-cli
|
|
- ruvector-gnn
|
|
- ruvector-graph
|
|
- ruvector-attention
|
|
- ruvector-cluster
|
|
- ruvector-sona
|
|
|
|
steps:
|
|
- name: Extract version
|
|
id: version
|
|
run: |
|
|
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
|
VERSION="${{ github.event.inputs.version }}"
|
|
else
|
|
VERSION="${GITHUB_REF#refs/tags/}"
|
|
fi
|
|
# Strip 'v' prefix
|
|
VERSION="${VERSION#v}"
|
|
echo "version=${VERSION}" >> $GITHUB_OUTPUT
|
|
|
|
- name: Pull and test image
|
|
run: |
|
|
IMAGE="${{ env.REGISTRY }}/${{ env.REGISTRY_USERNAME }}/${{ matrix.image }}:${{ steps.version.outputs.version }}"
|
|
echo "Testing image: ${IMAGE}"
|
|
|
|
# Pull the image
|
|
docker pull "${IMAGE}"
|
|
|
|
# Basic test - run with --help flag
|
|
if [ "${{ matrix.image }}" = "ruvector-server" ]; then
|
|
# Server needs special handling
|
|
CONTAINER_ID=$(docker run -d --rm "${IMAGE}")
|
|
sleep 5
|
|
if docker exec "${CONTAINER_ID}" pgrep -f ruvector > /dev/null 2>&1; then
|
|
echo "✓ Server started successfully"
|
|
docker stop "${CONTAINER_ID}"
|
|
else
|
|
echo "✗ Server failed to start"
|
|
docker stop "${CONTAINER_ID}"
|
|
exit 1
|
|
fi
|
|
else
|
|
# Other images - test with --help
|
|
docker run --rm "${IMAGE}" --help || true
|
|
echo "✓ Image executed successfully"
|
|
fi
|
|
|
|
- name: Check image size
|
|
run: |
|
|
IMAGE="${{ env.REGISTRY }}/${{ env.REGISTRY_USERNAME }}/${{ matrix.image }}:${{ steps.version.outputs.version }}"
|
|
SIZE=$(docker image inspect "${IMAGE}" --format='{{.Size}}' | awk '{print $1/1024/1024}')
|
|
echo "Image size: ${SIZE} MB"
|
|
|
|
create-release:
|
|
name: Create GitHub Release
|
|
needs: test-images
|
|
runs-on: ubuntu-latest
|
|
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
|
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Extract version
|
|
id: version
|
|
run: |
|
|
VERSION="${GITHUB_REF#refs/tags/}"
|
|
VERSION="${VERSION#v}"
|
|
echo "version=${VERSION}" >> $GITHUB_OUTPUT
|
|
|
|
- name: Create Release Notes
|
|
id: release_notes
|
|
run: |
|
|
cat << EOF > release_notes.md
|
|
## RuVector Docker Images v${{ steps.version.outputs.version }}
|
|
|
|
### Published Images
|
|
|
|
All images are available for \`linux/amd64\` and \`linux/arm64\` platforms:
|
|
|
|
- \`ruvnet/ruvector-core:${{ steps.version.outputs.version }}\` - Core RuVector library
|
|
- \`ruvnet/ruvector-server:${{ steps.version.outputs.version }}\` - RuVector server
|
|
- \`ruvnet/ruvector-cli:${{ steps.version.outputs.version }}\` - Command-line interface
|
|
- \`ruvnet/ruvector-gnn:${{ steps.version.outputs.version }}\` - Graph Neural Networks
|
|
- \`ruvnet/ruvector-graph:${{ steps.version.outputs.version }}\` - Graph processing
|
|
- \`ruvnet/ruvector-attention:${{ steps.version.outputs.version }}\` - Attention mechanisms
|
|
- \`ruvnet/ruvector-cluster:${{ steps.version.outputs.version }}\` - Clustering algorithms
|
|
- \`ruvnet/ruvector-sona:${{ steps.version.outputs.version }}\` - SONA framework
|
|
|
|
### Usage
|
|
|
|
\`\`\`bash
|
|
# Pull an image
|
|
docker pull ruvnet/ruvector-core:${{ steps.version.outputs.version }}
|
|
|
|
# Run the CLI
|
|
docker run --rm ruvnet/ruvector-cli:${{ steps.version.outputs.version }} --help
|
|
|
|
# Start the server
|
|
docker run -p 8080:8080 ruvnet/ruvector-server:${{ steps.version.outputs.version }}
|
|
\`\`\`
|
|
|
|
### Docker Compose
|
|
|
|
See [docker-compose.yml](https://github.com/${{ github.repository }}/blob/main/docker/docker-compose.yml) for a complete setup.
|
|
EOF
|
|
|
|
- name: Create Release
|
|
uses: softprops/action-gh-release@v1
|
|
with:
|
|
body_path: release_notes.md
|
|
draft: false
|
|
prerelease: false
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|