From 9addaf09a49665ad9699fd2179d7c6e350eb18e2 Mon Sep 17 00:00:00 2001 From: Nathan Brake <33383515+njbrake@users.noreply.github.com> Date: Mon, 13 Jan 2025 11:39:46 -0500 Subject: [PATCH 1/7] .env is for overrides only --- .env.example | 46 +++++++++++++++++++++++++++++++++------------- Makefile | 24 ++++++++++-------------- 2 files changed, 43 insertions(+), 27 deletions(-) diff --git a/.env.example b/.env.example index f8a4e01b4..280a829bb 100644 --- a/.env.example +++ b/.env.example @@ -1,11 +1,15 @@ # .env.example +# This file can be used as a template for the .env file. Copy this file to .env and modify the values as needed. +################ # Lumigator container control # Set to "TRUE" if the containers need to be up and running after # a test target failed (e.g. in CI where containers are inspected # for logs after failed steps) -KEEP_CONTAINERS_UP="FALSE" +# KEEP_CONTAINERS_UP="FALSE" +################ +################ # Lumigator API configuration # LUMI_API_CORS_ALLOWED_ORIGINS: # Comma separated list of origins (See: https://developer.mozilla.org/en-US/docs/Glossary/Origin) @@ -14,27 +18,43 @@ KEEP_CONTAINERS_UP="FALSE" # e.g. "http://localhost:3000,http://lumigator.mydomain.com" # To allow CORS requests from anywhere specify "*" as any, or the only value. # e.g. "*" -LUMI_API_CORS_ALLOWED_ORIGINS=${LUMI_API_CORS_ALLOWED_ORIGINS:-http://localhost,http://localhost:3000} +#LUMI_API_CORS_ALLOWED_ORIGINS=${LUMI_API_CORS_ALLOWED_ORIGINS:-http://localhost,http://localhost:3000} +################ + +################ # AWS Variables for S3 Object Storage # Configure these for AWS access, or use defaults for local development with LocalStack. -AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-test} -AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-test} -AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION:-us-east-2} -AWS_ENDPOINT_URL=${AWS_ENDPOINT_URL:-http://localhost:4566} -S3_BUCKET=${S3_BUCKET:-lumigator-storage} +#AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-test} +#AWS_SECRET_ACCESS_KEY=test +#AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION:-us-east-2} +#AWS_ENDPOINT_URL=${AWS_ENDPOINT_URL:-http://localhost:4566} +################ + + +################ +# Storage Options +#S3_BUCKET=${S3_BUCKET:-lumigator-storage} # Optional: Required only if using LocalStack with advanced features/LocalStack Pro. -LOCALSTACK_AUTH_TOKEN= +#LOCALSTACK_AUTH_TOKEN= +################ # Ray Cluster Configuration # These settings are for the local Ray setup. To use an external Ray cluster, you MUST use an external S3-compatible storage # to ensure the Ray workers can access data from your Lumigator server. -RAY_HEAD_NODE_HOST=${RAY_HEAD_NODE_HOST:-ray} -RAY_DASHBOARD_PORT=${RAY_DASHBOARD_PORT:-8265} +#RAY_HEAD_NODE_HOST=${RAY_HEAD_NODE_HOST:-ray} +#RAY_DASHBOARD_PORT=${RAY_DASHBOARD_PORT:-8265} +################ + +################ # External API Keys # Provide keys for external services as required by your application. # Optional: Key for Mistral API access. -MISTRAL_API_KEY=${MISTRAL_API_KEY:-} +#MISTRAL_API_KEY=${MISTRAL_API_KEY:-} # Optional: Key for OpenAI API access. -OPENAI_API_KEY=${OPENAI_API_KEY:-} +#OPENAI_API_KEY=${OPENAI_API_KEY:-} +################ + +################ # Frontend configuration # URL to connect with the backend -VUE_APP_BASE_URL=http://localhost:8000/api/v1/ +#VUE_APP_BASE_URL=http://localhost:8000/api/v1/ +################ diff --git a/Makefile b/Makefile index 6f68f7d8e..3cfa235bf 100644 --- a/Makefile +++ b/Makefile @@ -5,9 +5,8 @@ UNAME:= $(shell uname -o) PROJECT_ROOT := $(shell git rev-parse --show-toplevel) CONTAINERS_RUNNING := $(shell docker ps -q --filter "name=lumigator-") -KEEP_CONTAINERS_UP := $(shell grep -E '^KEEP_CONTAINERS_UP=' .env | cut -d'=' -f2 | tr -d '"') - -KEEP_CONTAINERS_UP ?= "FALSE" +# Use the .env file if it exists, ignore it if it doesn't. +-include .env #used in docker-compose to choose the right Ray image ARCH := $(shell uname -m) @@ -18,10 +17,10 @@ ifeq ($(ARCH), arm64) endif define run_with_containers - @echo "No Lumigator containers are running. Starting containers..." - make start-lumigator-build - @if [ $(KEEP_CONTAINERS_UP) = "FALSE" ]; then echo "The script will remove containers after tests"; trap "cd $(PROJECT_ROOT); make stop-lumigator" EXIT; fi; \ - make $(1) + @echo "No Lumigator containers are running. Starting containers..." + make start-lumigator-build + @if [ "${KEEP_CONTAINERS_UP:-FALSE}" = "FALSE" ]; then echo "The script will remove containers after tests"; trap "cd $(PROJECT_ROOT); make stop-lumigator" EXIT; fi; \ + make $(1) endef define run_with_existing_containers @@ -64,11 +63,8 @@ endef LOCAL_DOCKERCOMPOSE_FILE:= docker-compose.yaml DEV_DOCKER_COMPOSE_FILE:= .devcontainer/docker-compose.override.yaml -.env: - @if [ ! -f .env ]; then cp .env.example .env; echo ".env created from .env.example"; fi - # Launches Lumigator in 'development' mode (all services running locally, code mounted in) -local-up: .env +local-up: uv run pre-commit install RAY_ARCH_SUFFIX=$(RAY_ARCH_SUFFIX) docker compose --profile local -f $(LOCAL_DOCKERCOMPOSE_FILE) -f ${DEV_DOCKER_COMPOSE_FILE} up --watch --build @@ -79,15 +75,15 @@ local-logs: docker compose -f $(LOCAL_DOCKERCOMPOSE_FILE) logs # Launches lumigator in 'user-local' mode (All services running locally, using latest docker container, no code mounted in) -start-lumigator: .env +start-lumigator: RAY_ARCH_SUFFIX=$(RAY_ARCH_SUFFIX) docker compose --profile local -f $(LOCAL_DOCKERCOMPOSE_FILE) up -d # Launches lumigator with no code mounted in, and forces build of containers (used in CI for integration tests) -start-lumigator-build: .env +start-lumigator-build: RAY_ARCH_SUFFIX=$(RAY_ARCH_SUFFIX) docker compose --profile local -f $(LOCAL_DOCKERCOMPOSE_FILE) up -d --build # Launches lumigator without local dependencies (ray, S3) -start-lumigator-external-services: .env +start-lumigator-external-services: docker compose -f $(LOCAL_DOCKERCOMPOSE_FILE) up -d stop-lumigator: From 7c37189ec2954a36da78270b9ef0b09889d4f41b Mon Sep 17 00:00:00 2001 From: Nathan Brake <33383515+njbrake@users.noreply.github.com> Date: Mon, 13 Jan 2025 11:51:29 -0500 Subject: [PATCH 2/7] Set a default app base url --- lumigator/frontend/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lumigator/frontend/Dockerfile b/lumigator/frontend/Dockerfile index f8b8b95c6..ce1c1494e 100644 --- a/lumigator/frontend/Dockerfile +++ b/lumigator/frontend/Dockerfile @@ -6,7 +6,7 @@ FROM node:${NODE_VERSION}-alpine AS base COPY ../../ /mzai WORKDIR /mzai/ -ARG VUE_APP_BASE_URL +ARG VUE_APP_BASE_URL=http://localhost:8000/api/v1/ # Install dependencies RUN npm --prefix /mzai/lumigator/frontend install From 9a0853153fd941522d9dba73f0ac53ceb089ba85 Mon Sep 17 00:00:00 2001 From: Nathan Brake <33383515+njbrake@users.noreply.github.com> Date: Mon, 13 Jan 2025 13:00:04 -0500 Subject: [PATCH 3/7] Centralize a few settings --- .env.example => .env.template | 28 ++++++++++--------- Makefile | 24 +++++++++------- docs/source/user-guides/inference.md | 2 +- .../python/mzai/backend/backend/settings.py | 6 ++-- 4 files changed, 33 insertions(+), 27 deletions(-) rename .env.example => .env.template (73%) diff --git a/.env.example b/.env.template similarity index 73% rename from .env.example rename to .env.template index 280a829bb..0a75c5949 100644 --- a/.env.example +++ b/.env.template @@ -1,4 +1,4 @@ -# .env.example +# .env.template # This file can be used as a template for the .env file. Copy this file to .env and modify the values as needed. ################ @@ -6,7 +6,7 @@ # Set to "TRUE" if the containers need to be up and running after # a test target failed (e.g. in CI where containers are inspected # for logs after failed steps) -# KEEP_CONTAINERS_UP="FALSE" +KEEP_CONTAINERS_UP="FALSE" ################ ################ @@ -18,43 +18,45 @@ # e.g. "http://localhost:3000,http://lumigator.mydomain.com" # To allow CORS requests from anywhere specify "*" as any, or the only value. # e.g. "*" -#LUMI_API_CORS_ALLOWED_ORIGINS=${LUMI_API_CORS_ALLOWED_ORIGINS:-http://localhost,http://localhost:3000} +LUMI_API_CORS_ALLOWED_ORIGINS=${LUMI_API_CORS_ALLOWED_ORIGINS:-http://localhost,http://localhost:3000} ################ ################ # AWS Variables for S3 Object Storage # Configure these for AWS access, or use defaults for local development with LocalStack. -#AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-test} -#AWS_SECRET_ACCESS_KEY=test -#AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION:-us-east-2} -#AWS_ENDPOINT_URL=${AWS_ENDPOINT_URL:-http://localhost:4566} +AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-test} +AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-test} +AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION:-us-east-2} +AWS_ENDPOINT_URL=${AWS_ENDPOINT_URL:-http://localhost:4566} ################ ################ # Storage Options -#S3_BUCKET=${S3_BUCKET:-lumigator-storage} +S3_BUCKET=${S3_BUCKET:-lumigator-storage} # Optional: Required only if using LocalStack with advanced features/LocalStack Pro. #LOCALSTACK_AUTH_TOKEN= +################ + ################ # Ray Cluster Configuration # These settings are for the local Ray setup. To use an external Ray cluster, you MUST use an external S3-compatible storage # to ensure the Ray workers can access data from your Lumigator server. -#RAY_HEAD_NODE_HOST=${RAY_HEAD_NODE_HOST:-ray} -#RAY_DASHBOARD_PORT=${RAY_DASHBOARD_PORT:-8265} +RAY_HEAD_NODE_HOST=${RAY_HEAD_NODE_HOST:-ray} +RAY_DASHBOARD_PORT=${RAY_DASHBOARD_PORT:-8265} ################ ################ # External API Keys # Provide keys for external services as required by your application. # Optional: Key for Mistral API access. -#MISTRAL_API_KEY=${MISTRAL_API_KEY:-} +MISTRAL_API_KEY=${MISTRAL_API_KEY:-} # Optional: Key for OpenAI API access. -#OPENAI_API_KEY=${OPENAI_API_KEY:-} +OPENAI_API_KEY=${OPENAI_API_KEY:-} ################ ################ # Frontend configuration # URL to connect with the backend -#VUE_APP_BASE_URL=http://localhost:8000/api/v1/ +VUE_APP_BASE_URL=http://localhost:8000/api/v1/ ################ diff --git a/Makefile b/Makefile index 3cfa235bf..5879cb860 100644 --- a/Makefile +++ b/Makefile @@ -5,8 +5,9 @@ UNAME:= $(shell uname -o) PROJECT_ROOT := $(shell git rev-parse --show-toplevel) CONTAINERS_RUNNING := $(shell docker ps -q --filter "name=lumigator-") -# Use the .env file if it exists, ignore it if it doesn't. --include .env +KEEP_CONTAINERS_UP := $(shell grep -E '^KEEP_CONTAINERS_UP=' .env | cut -d'=' -f2 | tr -d '"') + +KEEP_CONTAINERS_UP ?= "FALSE" #used in docker-compose to choose the right Ray image ARCH := $(shell uname -m) @@ -17,10 +18,10 @@ ifeq ($(ARCH), arm64) endif define run_with_containers - @echo "No Lumigator containers are running. Starting containers..." - make start-lumigator-build - @if [ "${KEEP_CONTAINERS_UP:-FALSE}" = "FALSE" ]; then echo "The script will remove containers after tests"; trap "cd $(PROJECT_ROOT); make stop-lumigator" EXIT; fi; \ - make $(1) + @echo "No Lumigator containers are running. Starting containers..." + make start-lumigator-build + @if [ $(KEEP_CONTAINERS_UP) = "FALSE" ]; then echo "The script will remove containers after tests"; trap "cd $(PROJECT_ROOT); make stop-lumigator" EXIT; fi; \ + make $(1) endef define run_with_existing_containers @@ -63,8 +64,11 @@ endef LOCAL_DOCKERCOMPOSE_FILE:= docker-compose.yaml DEV_DOCKER_COMPOSE_FILE:= .devcontainer/docker-compose.override.yaml +.env: + @if [ ! -f .env ]; then cp .env.template .env; echo ".env created from .env.template"; fi + # Launches Lumigator in 'development' mode (all services running locally, code mounted in) -local-up: +local-up: .env uv run pre-commit install RAY_ARCH_SUFFIX=$(RAY_ARCH_SUFFIX) docker compose --profile local -f $(LOCAL_DOCKERCOMPOSE_FILE) -f ${DEV_DOCKER_COMPOSE_FILE} up --watch --build @@ -75,15 +79,15 @@ local-logs: docker compose -f $(LOCAL_DOCKERCOMPOSE_FILE) logs # Launches lumigator in 'user-local' mode (All services running locally, using latest docker container, no code mounted in) -start-lumigator: +start-lumigator: .env RAY_ARCH_SUFFIX=$(RAY_ARCH_SUFFIX) docker compose --profile local -f $(LOCAL_DOCKERCOMPOSE_FILE) up -d # Launches lumigator with no code mounted in, and forces build of containers (used in CI for integration tests) -start-lumigator-build: +start-lumigator-build: .env RAY_ARCH_SUFFIX=$(RAY_ARCH_SUFFIX) docker compose --profile local -f $(LOCAL_DOCKERCOMPOSE_FILE) up -d --build # Launches lumigator without local dependencies (ray, S3) -start-lumigator-external-services: +start-lumigator-external-services: .env docker compose -f $(LOCAL_DOCKERCOMPOSE_FILE) up -d stop-lumigator: diff --git a/docs/source/user-guides/inference.md b/docs/source/user-guides/inference.md index 1ba854080..d94217bfb 100644 --- a/docs/source/user-guides/inference.md +++ b/docs/source/user-guides/inference.md @@ -7,7 +7,7 @@ text data. ```{note} You can also use the OpenAI GPT family of models or the Mistal API to run an inference job. To do so, you need to set the appropriate environment variables: `OPENAI_API_KEY` or `MISTRAL_API_KEY`. -Refer to the `.env.example` file in the repository for more details. +Refer to the `.env.template` file in the repository for more details. ``` ## What You'll Need diff --git a/lumigator/python/mzai/backend/backend/settings.py b/lumigator/python/mzai/backend/backend/settings.py index b165ad93e..05232ba32 100644 --- a/lumigator/python/mzai/backend/backend/settings.py +++ b/lumigator/python/mzai/backend/backend/settings.py @@ -19,15 +19,15 @@ class BackendSettings(BaseSettings): # AWS S3_ENDPOINT_URL: str | None = None - S3_BUCKET: str = "lumigator-storage" + S3_BUCKET: str # Default is specified in .env file S3_URL_EXPIRATION: int = 3600 # Time in seconds for pre-signed url expiration S3_DATASETS_PREFIX: str = "datasets" S3_JOB_RESULTS_PREFIX: str = "jobs/results" S3_JOB_RESULTS_FILENAME: str = "{job_name}/{job_id}/results.json" # Ray - RAY_HEAD_NODE_HOST: str = "localhost" - RAY_DASHBOARD_PORT: int = 8265 + RAY_HEAD_NODE_HOST: str # Default is specified in .env file + RAY_DASHBOARD_PORT: int # Default is specified in .env file RAY_SERVE_INFERENCE_PORT: int = 8000 # the following vars will be copied, if present, from Ray head to workers # Secrets should be added directly to ray by setting env vars on the ray head/worker nodes From aa9df77ff8ad49ea75b5fbb59d741911c1333ac6 Mon Sep 17 00:00:00 2001 From: Nathan Brake <33383515+njbrake@users.noreply.github.com> Date: Mon, 13 Jan 2025 13:01:09 -0500 Subject: [PATCH 4/7] No default in dockerfile --- lumigator/frontend/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lumigator/frontend/Dockerfile b/lumigator/frontend/Dockerfile index ce1c1494e..f8b8b95c6 100644 --- a/lumigator/frontend/Dockerfile +++ b/lumigator/frontend/Dockerfile @@ -6,7 +6,7 @@ FROM node:${NODE_VERSION}-alpine AS base COPY ../../ /mzai WORKDIR /mzai/ -ARG VUE_APP_BASE_URL=http://localhost:8000/api/v1/ +ARG VUE_APP_BASE_URL # Install dependencies RUN npm --prefix /mzai/lumigator/frontend install From 3fa674e2219a1abce312174d2c34e9dbc7672f9d Mon Sep 17 00:00:00 2001 From: Nathan Brake <33383515+njbrake@users.noreply.github.com> Date: Mon, 13 Jan 2025 13:09:32 -0500 Subject: [PATCH 5/7] cleanup of where env vars go --- Makefile | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 5879cb860..9601e048c 100644 --- a/Makefile +++ b/Makefile @@ -123,12 +123,26 @@ endif test-backend-unit: cd lumigator/python/mzai/backend/; \ - SQLALCHEMY_DATABASE_URL=sqlite:////tmp/local.db uv run pytest -o python_files="backend/tests/unit/*/test_*.py" + S3_BUCKET=lumigator-storage \ + RAY_HEAD_NODE_HOST=localhost \ + RAY_DASHBOARD_PORT=8265 \ + SQLALCHEMY_DATABASE_URL=sqlite:////tmp/local.db \ + uv run pytest -o python_files="backend/tests/unit/*/test_*.py" test-backend-integration-target: cd lumigator/python/mzai/backend/; \ docker container list --all; \ - SQLALCHEMY_DATABASE_URL=sqlite:////tmp/local.db RAY_WORKER_GPUS="0.0" RAY_WORKER_GPUS_FRACTION="0.0" INFERENCE_PIP_REQS=../jobs/inference/requirements_cpu.txt INFERENCE_WORK_DIR=../jobs/inference EVALUATOR_PIP_REQS=../jobs/evaluator/requirements.txt EVALUATOR_WORK_DIR=../jobs/evaluator uv run pytest -s -o python_files="backend/tests/integration/*/test_*.py" + S3_BUCKET=lumigator-storage \ + RAY_HEAD_NODE_HOST=localhost \ + RAY_DASHBOARD_PORT=8265 \ + SQLALCHEMY_DATABASE_URL=sqlite:////tmp/local.db \ + RAY_WORKER_GPUS="0.0" \ + RAY_WORKER_GPUS_FRACTION="0.0" \ + INFERENCE_PIP_REQS=../jobs/inference/requirements_cpu.txt \ + INFERENCE_WORK_DIR=../jobs/inference \ + EVALUATOR_PIP_REQS=../jobs/evaluator/requirements.txt \ + EVALUATOR_WORK_DIR=../jobs/evaluator \ + uv run pytest -s -o python_files="backend/tests/integration/*/test_*.py" test-backend-integration: ifeq ($(CONTAINERS_RUNNING),) From ecf66ee869fe4813d68e293cadc40f15d359cbf3 Mon Sep 17 00:00:00 2001 From: Nathan Brake Date: Wed, 15 Jan 2025 08:54:33 -0500 Subject: [PATCH 6/7] Update naming to make it more clear what is going on. --- Makefile | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 9601e048c..8ed7693b1 100644 --- a/Makefile +++ b/Makefile @@ -5,9 +5,7 @@ UNAME:= $(shell uname -o) PROJECT_ROOT := $(shell git rev-parse --show-toplevel) CONTAINERS_RUNNING := $(shell docker ps -q --filter "name=lumigator-") -KEEP_CONTAINERS_UP := $(shell grep -E '^KEEP_CONTAINERS_UP=' .env | cut -d'=' -f2 | tr -d '"') - -KEEP_CONTAINERS_UP ?= "FALSE" +KEEP_CONTAINERS_UP := $(shell grep -E '^KEEP_CONTAINERS_UP=' .env | cut -d'=' -f2 | tr -d '"' || echo "FALSE") #used in docker-compose to choose the right Ray image ARCH := $(shell uname -m) @@ -64,11 +62,11 @@ endef LOCAL_DOCKERCOMPOSE_FILE:= docker-compose.yaml DEV_DOCKER_COMPOSE_FILE:= .devcontainer/docker-compose.override.yaml -.env: +check-dot-env: @if [ ! -f .env ]; then cp .env.template .env; echo ".env created from .env.template"; fi # Launches Lumigator in 'development' mode (all services running locally, code mounted in) -local-up: .env +local-up: check-dot-env uv run pre-commit install RAY_ARCH_SUFFIX=$(RAY_ARCH_SUFFIX) docker compose --profile local -f $(LOCAL_DOCKERCOMPOSE_FILE) -f ${DEV_DOCKER_COMPOSE_FILE} up --watch --build @@ -79,15 +77,15 @@ local-logs: docker compose -f $(LOCAL_DOCKERCOMPOSE_FILE) logs # Launches lumigator in 'user-local' mode (All services running locally, using latest docker container, no code mounted in) -start-lumigator: .env +start-lumigator: check-dot-env RAY_ARCH_SUFFIX=$(RAY_ARCH_SUFFIX) docker compose --profile local -f $(LOCAL_DOCKERCOMPOSE_FILE) up -d # Launches lumigator with no code mounted in, and forces build of containers (used in CI for integration tests) -start-lumigator-build: .env +start-lumigator-build: check-dot-env RAY_ARCH_SUFFIX=$(RAY_ARCH_SUFFIX) docker compose --profile local -f $(LOCAL_DOCKERCOMPOSE_FILE) up -d --build # Launches lumigator without local dependencies (ray, S3) -start-lumigator-external-services: .env +start-lumigator-external-services: check-dot-env docker compose -f $(LOCAL_DOCKERCOMPOSE_FILE) up -d stop-lumigator: From 3cf3e41c42b905bac24f75d7b3e6426828c08373 Mon Sep 17 00:00:00 2001 From: Nathan Brake <33383515+njbrake@users.noreply.github.com> Date: Fri, 17 Jan 2025 07:54:19 -0500 Subject: [PATCH 7/7] Add check-dot-env to the phony Signed-off-by: Nathan Brake <33383515+njbrake@users.noreply.github.com> --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 18f617622..f3fafde07 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: local-up local-down local-logs clean-docker-buildcache clean-docker-images clean-docker-containers start-lumigator-external-services start-lumigator stop-lumigator test-sdk-unit test-sdk-integration test-sdk-integration-containers test-sdk test-backend-unit test-backend-integration test-backend-integration-containers test-backend test-jobs-evaluation-unit test-jobs-inference-unit test-jobs test-all +.PHONY: local-up local-down local-logs clean-docker-buildcache clean-docker-images clean-docker-containers start-lumigator-external-services start-lumigator stop-lumigator test-sdk-unit test-sdk-integration test-sdk-integration-containers test-sdk test-backend-unit test-backend-integration test-backend-integration-containers test-backend test-jobs-evaluation-unit test-jobs-inference-unit test-jobs test-all check-dot-env SHELL:=/bin/bash UNAME:= $(shell uname -o)