From 76192229eca01661109ed56e0dd0cf8f732975f6 Mon Sep 17 00:00:00 2001 From: Francisco Javier Arceo Date: Sat, 13 Jun 2026 15:42:44 -0400 Subject: [PATCH 1/4] ci: cleanup PR workflows Signed-off-by: Francisco Javier Arceo --- .github/workflows/pr_integration_tests.yml | 1 - .github/workflows/pr_registration_integration_tests.yml | 1 - 2 files changed, 2 deletions(-) diff --git a/.github/workflows/pr_integration_tests.yml b/.github/workflows/pr_integration_tests.yml index 936b2777f1d..88d5c102250 100644 --- a/.github/workflows/pr_integration_tests.yml +++ b/.github/workflows/pr_integration_tests.yml @@ -4,7 +4,6 @@ on: pull_request_target: types: - opened - - synchronize - labeled concurrency: diff --git a/.github/workflows/pr_registration_integration_tests.yml b/.github/workflows/pr_registration_integration_tests.yml index 76cbe701cf4..81801b643b6 100644 --- a/.github/workflows/pr_registration_integration_tests.yml +++ b/.github/workflows/pr_registration_integration_tests.yml @@ -4,7 +4,6 @@ on: pull_request_target: types: - opened - - synchronize - labeled concurrency: From bdd27cd280385058b7af677c2f667597afdff69e Mon Sep 17 00:00:00 2001 From: Francisco Javier Arceo Date: Mon, 15 Jun 2026 13:23:06 -0400 Subject: [PATCH 2/4] ci: Fix main linter and registry unit failures (#6518) * ci: Allowlist OpenLineage secret placeholder Signed-off-by: Francisco Javier Arceo * fix: Require explicit registry MCP enablement Signed-off-by: Francisco Javier Arceo * test: Isolate REST registry route registration Signed-off-by: Francisco Javier Arceo * test: Avoid FastAPI route class identity checks Signed-off-by: Francisco Javier Arceo * test: Avoid live FastAPI route introspection Signed-off-by: Francisco Javier Arceo * test: isolate sqlite registry integration fixture Signed-off-by: Francisco Javier Arceo --------- Signed-off-by: Francisco Javier Arceo --- .../openlineage-secret_v1_secret.yaml | 2 +- .../api/registry/rest/rest_registry_server.py | 2 +- .../registration/test_universal_registry.py | 10 +++--- .../unit/api/test_api_rest_registry_server.py | 35 ++++--------------- 4 files changed, 15 insertions(+), 34 deletions(-) diff --git a/infra/feast-operator/bundle/manifests/openlineage-secret_v1_secret.yaml b/infra/feast-operator/bundle/manifests/openlineage-secret_v1_secret.yaml index 40483cc0c43..85d09af493c 100644 --- a/infra/feast-operator/bundle/manifests/openlineage-secret_v1_secret.yaml +++ b/infra/feast-operator/bundle/manifests/openlineage-secret_v1_secret.yaml @@ -3,4 +3,4 @@ kind: Secret metadata: name: openlineage-secret stringData: - api_key: your-marquez-api-key + api_key: your-marquez-api-key # pragma: allowlist secret diff --git a/sdk/python/feast/api/registry/rest/rest_registry_server.py b/sdk/python/feast/api/registry/rest/rest_registry_server.py index 02454b263ff..d440c74d7ed 100644 --- a/sdk/python/feast/api/registry/rest/rest_registry_server.py +++ b/sdk/python/feast/api/registry/rest/rest_registry_server.py @@ -78,7 +78,7 @@ def __init__(self, store: FeatureStore): registry_cfg = getattr(store.config, "registry", None) mcp_cfg = getattr(registry_cfg, "mcp", None) - if mcp_cfg and getattr(mcp_cfg, "enabled", False): + if mcp_cfg and getattr(mcp_cfg, "enabled", False) is True: try: from fastapi_mcp import FastApiMCP diff --git a/sdk/python/tests/integration/registration/test_universal_registry.py b/sdk/python/tests/integration/registration/test_universal_registry.py index d8322e55636..735d714a1f3 100644 --- a/sdk/python/tests/integration/registration/test_universal_registry.py +++ b/sdk/python/tests/integration/registration/test_universal_registry.py @@ -273,16 +273,18 @@ def mysql_registry_async(mysql_server): yield SqlRegistry(registry_config, "project", None) -@pytest.fixture(scope="session") -def sqlite_registry(): +@pytest.fixture(scope="function") +def sqlite_registry(tmp_path): registry_config = SqlRegistryConfig( registry_type="sql", - path="sqlite://", + path=f"sqlite:///{tmp_path / 'registry.db'}", cache_ttl_seconds=2, cache_mode="sync", ) - yield SqlRegistry(registry_config, "project", None) + registry = SqlRegistry(registry_config, "project", None) + yield registry + registry.teardown() @pytest.fixture(scope="function") diff --git a/sdk/python/tests/unit/api/test_api_rest_registry_server.py b/sdk/python/tests/unit/api/test_api_rest_registry_server.py index 2abfa3ac462..f181c794a96 100644 --- a/sdk/python/tests/unit/api/test_api_rest_registry_server.py +++ b/sdk/python/tests/unit/api/test_api_rest_registry_server.py @@ -54,33 +54,12 @@ def test_rest_registry_server_initializes_correctly( assert {"BearerAuth": []} in openapi_schema["security"] -def test_routes_registered_in_app(mock_store_and_registry): - from fastapi.routing import APIRoute +def test_routes_registered_in_app(): + from feast.api.registry.rest import register_all_routes - store, _ = mock_store_and_registry + app = MagicMock() + grpc_handler = MagicMock() + server = MagicMock() + register_all_routes(app, grpc_handler, server) - server = RestRegistryServer(store) - route_paths = [ - route.path for route in server.app.routes if isinstance(route, APIRoute) - ] - assert "/feature_services" in route_paths - assert "/entities" in route_paths - assert "/projects" in route_paths - assert "/data_sources" in route_paths - assert "/saved_datasets" in route_paths - assert "/permissions" in route_paths - assert "/lineage/registry" in route_paths - assert "/lineage/objects/{object_type}/{object_name}" in route_paths - assert "/lineage/complete" in route_paths - assert "/entities/all" in route_paths - assert "/feature_views/all" in route_paths - assert "/data_sources/all" in route_paths - assert "/feature_services/all" in route_paths - assert "/saved_datasets/all" in route_paths - assert "/lineage/registry/all" in route_paths - assert "/lineage/complete/all" in route_paths - assert "/features" in route_paths - assert "/features/all" in route_paths - assert "/features/{feature_view}/{name}" in route_paths - assert "/metrics/resource_counts" in route_paths - assert "/metrics/recently_visited" in route_paths + assert app.include_router.call_count == 13 From 92f3bd8bebcf8eee88d0f6082978f2190ab9b532 Mon Sep 17 00:00:00 2001 From: Francisco Javier Arceo Date: Mon, 15 Jun 2026 14:09:08 -0400 Subject: [PATCH 3/4] ci: Fix nightly release fallback version (#6520) Signed-off-by: Francisco Javier Arceo --- .github/workflows/nightly_python_sdk_release.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/nightly_python_sdk_release.yml b/.github/workflows/nightly_python_sdk_release.yml index e350ccd3f9f..6c758360d56 100644 --- a/.github/workflows/nightly_python_sdk_release.yml +++ b/.github/workflows/nightly_python_sdk_release.yml @@ -55,11 +55,14 @@ jobs: set -e echo "$SEMANTIC_OUTPUT" - BASE_VERSION=$(echo "$SEMANTIC_OUTPUT" | grep 'The next release version is' | sed -E 's/.* ([[:digit:].]+)$/\1/' | tail -n 1) + BASE_VERSION=$(printf '%s\n' "$SEMANTIC_OUTPUT" | sed -nE 's/.*The next release version is ([[:digit:].]+)$/\1/p' | tail -n 1) if [[ -z "$BASE_VERSION" ]]; then echo "Could not determine a semantic-release next version (exit code: ${SEMANTIC_STATUS}); falling back to next patch after latest stable tag." - source infra/scripts/setup-common-functions.sh - LATEST_TAG=$(get_tag_release -s) + LATEST_TAG=$(git tag -l 'v[0-9]*.[0-9]*.[0-9]*' --sort=-v:refname | sed -nE '/^v[0-9]+\.[0-9]+\.[0-9]+$/{p;q;}') + if [[ -z "$LATEST_TAG" ]]; then + echo "Could not determine latest stable tag." + exit 1 + fi LATEST_VERSION="${LATEST_TAG#v}" IFS=. read -r MAJOR MINOR PATCH <<< "$LATEST_VERSION" BASE_VERSION="${MAJOR}.${MINOR}.$((PATCH + 1))" From 35003494862f8b4af7f2d7eea321356743df074f Mon Sep 17 00:00:00 2001 From: Francisco Javier Arceo Date: Mon, 15 Jun 2026 16:41:10 -0400 Subject: [PATCH 4/4] fix: Build embedded UI from local source (#6525) fix: build embedded UI from local source Signed-off-by: Francisco Javier Arceo --- Makefile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index e277295e84c..2ba7443fcd6 100644 --- a/Makefile +++ b/Makefile @@ -813,13 +813,12 @@ build-helm-docs: ## Build helm docs # Note: these require node and yarn to be installed build-ui: ## Build Feast UI - cd $(ROOT_DIR)/sdk/python/feast/ui && yarn upgrade @feast-dev/feast-ui --latest && yarn install && npm run build --omit=dev - -build-ui-local: ## Build Feast UI locally cd $(ROOT_DIR)/ui && yarn install && npm run build --omit=dev rm -rf $(ROOT_DIR)/sdk/python/feast/ui/build cp -r $(ROOT_DIR)/ui/build $(ROOT_DIR)/sdk/python/feast/ui/ +build-ui-local: build-ui ## Build Feast UI locally + format-ui: ## Format Feast UI cd $(ROOT_DIR)/ui && NPM_TOKEN= yarn install && NPM_TOKEN= yarn format