Files
comet-ml--opik/scripts/worktree-utils.sh
T
wehub-resource-sync 5a558eb09e
Backend Tests / discover-tests (push) Waiting to run
Backend Tests / ${{ matrix.name }} (push) Blocked by required conditions
Build and Publish SDK / build-and-publish (push) Waiting to run
Build Opik Docker Images / set-version (push) Waiting to run
Build Opik Docker Images / build-backend (push) Blocked by required conditions
Build Opik Docker Images / build-sandbox-executor-python (push) Blocked by required conditions
Build Opik Docker Images / build-python-backend (push) Blocked by required conditions
Build Opik Docker Images / build-frontend (push) Blocked by required conditions
Build Opik Docker Images / create-git-tag (push) Blocked by required conditions
ClickHouse Migration Cluster Check / validate-clickhouse-migrations (push) Waiting to run
Docs - Publish / run (push) Waiting to run
E2E Tests - Post Merge (v2) / 🧪 E2E v2 Tests (${{ github.event.inputs.tier || 't1' }}) (push) Waiting to run
E2E Tests - Post Merge (v2) / 📢 Slack Notification (push) Blocked by required conditions
Frontend Unit Tests / Test on Node 20 (push) Waiting to run
Guardrails E2E Tests / Select Python version matrix (push) Waiting to run
Guardrails E2E Tests / Guardrails E2E Tests ${{matrix.python_version}} (push) Blocked by required conditions
Guardrails E2E Tests / 📢 Slack Notification (push) Blocked by required conditions
Guardrails Backend Unit Tests / Guardrails Backend Unit Tests (push) Waiting to run
Guardrails Backend Unit Tests / 📢 Slack Notification (push) Blocked by required conditions
SDK Library Integration Tests Runner / Check Secrets (push) Waiting to run
SDK Library Integration Tests Runner / Missed OpenAI API Key Warning (push) Blocked by required conditions
SDK Library Integration Tests Runner / Build (push) Blocked by required conditions
SDK Library Integration Tests Runner / openai_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / langchain_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / langchain_legacy_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / llama_index_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / anthropic_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / mistral_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / groq_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / aisuite_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / haystack_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / dspy_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / crewai_v0_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / crewai_v1_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / genai_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / adk_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / adk_legacy_1_3_0_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / evaluation_metrics_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / bedrock_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / litellm_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / harbor_tests (push) Blocked by required conditions
SDK Library Integration Tests Runner / Slack Notification (push) Blocked by required conditions
Lint Opik Helm Chart / lint-helm-chart (Helm v3.21.0) (push) Waiting to run
Lint Opik Helm Chart / lint-helm-chart (Helm v4.2.0) (push) Waiting to run
Lint Opik Helm Chart / unittest-helm-chart (push) Waiting to run
Lint Opik Helm Chart / render-equality (push) Waiting to run
Opik Optimizer - Unit Tests / Opik Optimizer Unit Tests Python ${{matrix.python_version}} (push) Waiting to run
Python BE E2E Tests / Python BE E2E (push) Waiting to run
Python Backend Tests / run-python-backend-tests (push) Waiting to run
Python SDK Unit Tests / Python SDK Unit Tests ${{matrix.python_version}} (push) Waiting to run
Release Drafter / update_release_draft (push) Waiting to run
SDK E2E Libraries Integration Tests / Check Secrets (push) Waiting to run
SDK E2E Libraries Integration Tests / Missed OpenAI API Key Warning (push) Blocked by required conditions
SDK E2E Libraries Integration Tests / build-opik (push) Blocked by required conditions
SDK E2E Libraries Integration Tests / E2E Lib Integration Python ${{matrix.python_version}} (push) Blocked by required conditions
TypeScript SDK Integration Build & Publish / build-and-publish (opik-gemini) (push) Waiting to run
TypeScript SDK Integration Build & Publish / build-and-publish (opik-langchain) (push) Waiting to run
TypeScript SDK Integration Build & Publish / build-and-publish (opik-openai) (push) Waiting to run
TypeScript SDK Integration Build & Publish / build-and-publish (opik-otel) (push) Waiting to run
TypeScript SDK Integration Build & Publish / build-and-publish (opik-vercel) (push) Waiting to run
TypeScript SDK Library Integration Tests / Check Secrets (push) Waiting to run
TypeScript SDK Library Integration Tests / opik-vercel (Vercel AI SDK / eve) (push) Blocked by required conditions
TypeScript SDK Build & Publish / build-and-publish (push) Waiting to run
TypeScript SDK Unit Tests / Test on Node ${{ matrix.node-version }} (push) Waiting to run
TypeScript SDK Compatibility V1.x E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / TypeScript SDK Compatibility V1.x E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
TypeScript SDK E2E Tests / TypeScript SDK E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
Python SDK E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK E2E Tests / Python SDK E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK E2E Tests / build-opik (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Python SDK Compatibility V1.x E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK E2E Tests / build-opik (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer E2E Tests Python ${{matrix.python_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer Integration Smoke Tests (push) Has been cancelled
🐙 Code Quality / detect (push) Has been cancelled
🐙 Code Quality / lint (${{ matrix.leg.name }}) (push) Has been cancelled
🐙 Code Quality / summary (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:25:44 +08:00

130 lines
4.7 KiB
Bash
Executable File

#!/bin/bash
# Shared Worktree Utilities for Multi-Worktree Development
# This file provides common functions for worktree detection and port calculation
# Used by both dev-runner.sh and opik.sh to ensure consistent behavior
# Get the project root directory (caller should set WORKTREE_UTILS_ROOT before sourcing)
# Falls back to the directory of this script's parent
WORKTREE_PROJECT_ROOT="${WORKTREE_UTILS_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
# Extract worktree name from git (uses directory name if not in a worktree)
# Returns: sanitized directory name suitable for Docker project names
get_worktree_id() {
local worktree_path
worktree_path=$(git -C "$WORKTREE_PROJECT_ROOT" rev-parse --show-toplevel 2>/dev/null)
if [ -z "$worktree_path" ]; then
worktree_path="$WORKTREE_PROJECT_ROOT"
fi
# Sanitize for Docker: lowercase, alphanumeric, hyphens only
local name
name=$(basename "$worktree_path" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9-]/-/g' | sed 's/--*/-/g' | sed 's/^-//;s/-$//')
if [ -z "$name" ]; then
name="default"
fi
echo "$name"
}
# Check if we're in a git worktree (not the main repo)
# Returns: 0 if worktree, 1 if main repo
is_git_worktree() {
local git_dir="$WORKTREE_PROJECT_ROOT/.git"
# In a worktree, .git is a file; in main repo, .git is a directory
[ -f "$git_dir" ]
}
# Calculate deterministic port offset based on path hash
# Returns: 0-99 for port offset (0 for main repo, calculated for worktrees)
calculate_port_offset() {
# Allow manual override
if [ -n "${OPIK_PORT_OFFSET:-}" ]; then
echo "$OPIK_PORT_OFFSET"
return
fi
# Main repo uses offset 0 for backward compatibility
if ! is_git_worktree; then
echo "0"
return
fi
# Calculate offset from path hash
local hash_input="$WORKTREE_PROJECT_ROOT"
local hash_hex
if command -v md5 &>/dev/null; then
hash_hex=$(echo -n "$hash_input" | md5)
elif command -v md5sum &>/dev/null; then
hash_hex=$(echo -n "$hash_input" | md5sum | cut -d' ' -f1)
else
# Fallback: simple character-based hash
local sum=0
for (( i=0; i<${#hash_input}; i++ )); do
sum=$(( (sum + $(printf '%d' "'${hash_input:$i:1}")) % 100 ))
done
echo "$sum"
return
fi
# Convert first 4 hex chars to decimal mod 100
local first_four="${hash_hex:0:4}"
local decimal=$((16#$first_four))
echo $((decimal % 100))
}
# Base ports (standard Opik ports)
readonly BASE_BACKEND_PORT=8080
readonly BASE_BACKEND_ADMIN_PORT=8081
readonly BASE_NGINX_PORT=5173
readonly BASE_FRONTEND_DEV_PORT=5174
readonly BASE_MYSQL_PORT=3306
readonly BASE_REDIS_PORT=6379
readonly BASE_CLICKHOUSE_HTTP_PORT=8123
readonly BASE_CLICKHOUSE_NATIVE_PORT=9000
readonly BASE_PYTHON_BACKEND_PORT=8000
readonly BASE_ZOOKEEPER_PORT=2181
readonly BASE_MINIO_API_PORT=9001
readonly BASE_MINIO_CONSOLE_PORT=9090
# Initialize worktree variables
# Call this function after sourcing to set up all port variables
init_worktree_ports() {
WORKTREE_ID=$(get_worktree_id)
PORT_OFFSET=$(calculate_port_offset)
RESOURCE_PREFIX="opik-${WORKTREE_ID}"
# Calculate ports — pre-set env vars win, so users can pin a single port
# (e.g. NGINX_PORT=5293) without disabling the worktree offset for the rest.
BACKEND_PORT=${BACKEND_PORT:-$((BASE_BACKEND_PORT + PORT_OFFSET))}
BACKEND_ADMIN_PORT=${BACKEND_ADMIN_PORT:-$((BASE_BACKEND_ADMIN_PORT + PORT_OFFSET))}
NGINX_PORT=${NGINX_PORT:-$((BASE_NGINX_PORT + PORT_OFFSET))}
FRONTEND_PORT=${FRONTEND_PORT:-$((BASE_FRONTEND_DEV_PORT + PORT_OFFSET))}
MYSQL_PORT=${MYSQL_PORT:-$((BASE_MYSQL_PORT + PORT_OFFSET))}
REDIS_PORT=${REDIS_PORT:-$((BASE_REDIS_PORT + PORT_OFFSET))}
CLICKHOUSE_HTTP_PORT=${CLICKHOUSE_HTTP_PORT:-$((BASE_CLICKHOUSE_HTTP_PORT + PORT_OFFSET))}
CLICKHOUSE_NATIVE_PORT=${CLICKHOUSE_NATIVE_PORT:-$((BASE_CLICKHOUSE_NATIVE_PORT + PORT_OFFSET))}
PYTHON_BACKEND_PORT=${PYTHON_BACKEND_PORT:-$((BASE_PYTHON_BACKEND_PORT + PORT_OFFSET))}
ZOOKEEPER_PORT=${ZOOKEEPER_PORT:-$((BASE_ZOOKEEPER_PORT + PORT_OFFSET))}
MINIO_API_PORT=${MINIO_API_PORT:-$((BASE_MINIO_API_PORT + PORT_OFFSET))}
MINIO_CONSOLE_PORT=${MINIO_CONSOLE_PORT:-$((BASE_MINIO_CONSOLE_PORT + PORT_OFFSET))}
# Export for child processes (docker-compose, etc.)
export OPIK_BACKEND_PORT="$BACKEND_PORT"
export OPIK_FRONTEND_PORT="$NGINX_PORT"
export NGINX_PORT
export FRONTEND_PORT
export MYSQL_PORT
export REDIS_PORT
export CLICKHOUSE_HTTP_PORT
export CLICKHOUSE_NATIVE_PORT
export PYTHON_BACKEND_PORT
export ZOOKEEPER_PORT
export MINIO_API_PORT
export MINIO_CONSOLE_PORT
export COMPOSE_PROJECT_NAME="$RESOURCE_PREFIX"
}