From 5cd9a3e3770073f486f1f2a021d93d4db91f9e95 Mon Sep 17 00:00:00 2001 From: Beth Rennie Date: Wed, 20 Aug 2025 21:51:19 -0400 Subject: [PATCH 1/2] wip: docker bake support, unify compose files --- .env.sample | 6 +- Makefile | 52 +++--- cirrus/server/Dockerfile | 12 +- cirrus/server/cirrus/main.py | 2 + docker-bake.hcl | 101 ++++++++++++ docker-compose-cirrus.yml | 42 ----- docker-compose-integration-test.yml | 44 ------ docker-compose-legacy.yml | 18 --- docker-compose-prod.yml | 79 ---------- docker-compose-test.yml | 29 ---- docker-compose.yml | 183 +++++++++++++++++++--- experimenter/Dockerfile | 4 +- experimenter/tests/integration/Dockerfile | 3 +- 13 files changed, 293 insertions(+), 282 deletions(-) create mode 100644 docker-bake.hcl delete mode 100644 docker-compose-cirrus.yml delete mode 100644 docker-compose-integration-test.yml delete mode 100644 docker-compose-legacy.yml delete mode 100644 docker-compose-prod.yml delete mode 100644 docker-compose-test.yml diff --git a/.env.sample b/.env.sample index b4c50d880c..b989d017f1 100644 --- a/.env.sample +++ b/.env.sample @@ -54,14 +54,10 @@ UPLOADS_FILE_STORAGE=django.core.files.storage.FileSystemStorage CIRRUS_REMOTE_SETTING_REFRESH_RATE_IN_SECONDS=10 CIRRUS_REMOTE_SETTING_URL=http://kinto:8888/v1/buckets/main/collections/nimbus-web-experiments/records CIRRUS_REMOTE_SETTING_PREVIEW_URL=http://kinto:8888/v1/buckets/main-workspace/collections/nimbus-web-preview/records -CIRRUS_APP_ID=demo-app-beta -CIRRUS_APP_NAME=demo_app -CIRRUS_CHANNEL=beta -CIRRUS_FML_PATH=./feature_manifest/sample.yml CIRRUS_SENTRY_DSN= CIRRUS_SENTRY_TRACES_SAMPLE_RATE=1 CIRRUS_SENTRY_PROFILES_SAMPLE_RATE=1 CIRRUS_INSTANCE_NAME= CIRRUS_ENV_NAME=test_instance_stage CIRRUS_GLEAN_MAX_EVENTS_BUFFER=20 -CIRRUS_URL=http://cirrus-experimenter:8001/v2/features/ +CIRRUS_URL=http://cirrus:8001/v2/features/ diff --git a/Makefile b/Makefile index a180d325ba..d5e0e75445 100644 --- a/Makefile +++ b/Makefile @@ -10,9 +10,6 @@ COMPOSE_LEGACY = ${COMPOSE} -f docker-compose-legacy.yml COMPOSE_TEST = docker compose -f docker-compose-test.yml COMPOSE_TEST_RUN = ${COMPOSE_TEST} run --name experimenter_test COMPOSE_PROD = docker compose -f docker-compose-prod.yml $$(${COMPOSE_CIRRUS}) -COMPOSE_INTEGRATION = ${COMPOSE_PROD} -f docker-compose-integration-test.yml $$(${COMPOSE_CIRRUS}) -COMPOSE_INTEGRATION_RUN = ${COMPOSE_INTEGRATION} run --name experimenter_integration -DOCKER_BUILD = docker buildx build WORKFLOW := build EPOCH_TIME := $(shell date +"%s") @@ -111,42 +108,30 @@ fetch_external_resources: jetstream_config install_nimbus_cli feature_manifests update_kinto: ## Update latest Kinto/Remote Settings container docker pull mozilla/kinto-dist:latest -compose_build: ## Build containers - $(COMPOSE) build - -build_megazords: - $(DOCKER_BUILD) -f application-services/Dockerfile -t experimenter:megazords application-services/ - -update_application_services: build_megazords +update_application_services: + docker bake megazords docker run \ -v ./application-services/application-services.env:/application-services/application-services.env \ experimenter:megazords \ /application-services/update-application-services.sh -build_dev: ssl build_megazords - $(DOCKER_BUILD) --target dev -f experimenter/Dockerfile -t experimenter:dev experimenter/ +build_dev: ssl + docker bake default -build_integration_test: ssl build_megazords - $(DOCKER_BUILD) -f experimenter/tests/integration/Dockerfile -t experimenter:integration-tests experimenter/ +build_integration_test: ssl + docker bake integration-tests -build_test: ssl build_megazords - $(DOCKER_BUILD) --target test -f experimenter/Dockerfile -t experimenter:test experimenter/ +build_test: ssl + docker bake experimenter-test -build_ui: ssl - $(DOCKER_BUILD) --target ui -f experimenter/Dockerfile -t experimenter:ui experimenter/ - -build_prod: ssl build_megazords - $(DOCKER_BUILD) --target deploy -f experimenter/Dockerfile -t experimenter:deploy experimenter/ +build_prod: ssl + docker bake prod compose_stop: - $(COMPOSE) kill || true - $(COMPOSE_INTEGRATION) kill || true - $(COMPOSE_PROD) kill || true + $(COMPOSE) --profile dev --profile prod --profile integration-tests kill || true compose_rm: - $(COMPOSE) rm -f -v || true - $(COMPOSE_INTEGRATION) rm -f -v || true - $(COMPOSE_PROD) rm -f -v || true + $(COMPOSE) --profile dev --profile prod --profile integration-tests rm -f -v || true docker_prune: docker container prune -f @@ -183,10 +168,11 @@ check_and_report: build_test ## Only to be used on CI test: build_test ## Run tests $(COMPOSE_TEST_RUN) experimenter sh -c '$(WAIT_FOR_DB) $(PYTHON_TEST)' + pytest: test -start: build_dev ## Start containers - $(COMPOSE) up +start: build_dev ## Start containers + $(COMPOSE) --profile dev up up: start @@ -227,7 +213,7 @@ migrate: build_dev ## Run database migrations bash: build_dev $(COMPOSE_RUN) experimenter bash -refresh: kill build_dev compose_build refresh_db ## Rebuild all containers and the database +refresh: kill build_dev refresh_db ## Rebuild all containers and the database refresh_db: # Rebuild the database $(COMPOSE_RUN) -e SKIP_DUMMY=$$SKIP_DUMMY experimenter bash -c '$(WAIT_FOR_DB) $(PYTHON_MIGRATE)&&$(LOAD_LOCALES)&&$(LOAD_COUNTRIES)&&$(LOAD_LANGUAGES)&&$(LOAD_FEATURES)&&$(LOAD_DUMMY_EXPERIMENTS)' @@ -282,13 +268,13 @@ CIRRUS_GENERATE_DOCS = python cirrus/generate_docs.py CIRRUS_COVERAGE_JSON := $(TEST_RESULTS_DIR)/$(TEST_FILE_PREFIX)unit__coverage.json CIRRUS_JUNIT_XML := $(TEST_RESULTS_DIR)/$(TEST_FILE_PREFIX)integration__results.xml -cirrus_build: build_megazords +cirrus_build: $(CIRRUS_ENABLE) $(DOCKER_BUILD) --target deploy -f cirrus/server/Dockerfile -t cirrus:deploy --build-context=fml=experimenter/experimenter/features/manifests/ cirrus/server/ -cirrus_build_dev: build_megazords +cirrus_build_dev: $(CIRRUS_ENABLE) $(DOCKER_BUILD) --target dev -f cirrus/server/Dockerfile -t cirrus:dev --build-context=fml=experimenter/experimenter/features/manifests/ cirrus/server/ -cirrus_build_test: build_megazords +cirrus_build_test: $(CIRRUS_ENABLE) $(COMPOSE_TEST) build cirrus cirrus_bash: cirrus_build_dev diff --git a/cirrus/server/Dockerfile b/cirrus/server/Dockerfile index b98f17405d..7d99688bcc 100644 --- a/cirrus/server/Dockerfile +++ b/cirrus/server/Dockerfile @@ -38,9 +38,9 @@ FROM python-builder AS dev WORKDIR /cirrus # Copy specific Rust components -COPY --from=experimenter:megazords /application-services/megazords/cirrus/libcirrus.so /application-services/libcirrus.so -COPY --from=experimenter:megazords /application-services/megazords/cirrus/cirrus.py /application-services/cirrus_sdk.py -COPY --from=experimenter:megazords /application-services/megazords/cirrus/fml.py /application-services/fml_sdk.py +COPY --from=megazords /application-services/megazords/cirrus/libcirrus.so /application-services/libcirrus.so +COPY --from=megazords /application-services/megazords/cirrus/cirrus.py /application-services/cirrus_sdk.py +COPY --from=megazords /application-services/megazords/cirrus/fml.py /application-services/fml_sdk.py ENV PYTHONPATH=$PYTHONPATH:/application-services @@ -68,9 +68,9 @@ RUN groupadd --gid $USER_GID $USERNAME \ WORKDIR /cirrus # Copy specific Rust components -COPY --from=experimenter:megazords /application-services/megazords/cirrus/libcirrus.so /application-services/libcirrus.so -COPY --from=experimenter:megazords /application-services/megazords/cirrus/cirrus.py /application-services/cirrus_sdk.py -COPY --from=experimenter:megazords /application-services/megazords/cirrus/fml.py /application-services/fml_sdk.py +COPY --from=megazords /application-services/megazords/cirrus/libcirrus.so /application-services/libcirrus.so +COPY --from=megazords /application-services/megazords/cirrus/cirrus.py /application-services/cirrus_sdk.py +COPY --from=megazords /application-services/megazords/cirrus/fml.py /application-services/fml_sdk.py # Copy Python site packages and scripts COPY --from=python-builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages diff --git a/cirrus/server/cirrus/main.py b/cirrus/server/cirrus/main.py index 46ba6a64cd..adc586121e 100644 --- a/cirrus/server/cirrus/main.py +++ b/cirrus/server/cirrus/main.py @@ -303,6 +303,8 @@ async def compute_features_enrollments_v2( async def fetch_schedule_recipes() -> None: + print("fetch_schedule_recipes") + live_failed = False preview_failed = False diff --git a/docker-bake.hcl b/docker-bake.hcl new file mode 100644 index 0000000000..5486d9fad8 --- /dev/null +++ b/docker-bake.hcl @@ -0,0 +1,101 @@ +group "default" { + targets = ["experimenter-dev", "experimenter-deploy", "cirrus-deploy", "nginx"] +} + +group "prod" { + targets = ["experimenter-deploy", "cirrus-deploy", "nginx"] +} + +group "integration-tests" { + targets = ["default", "rust-sdk"] +} + +group "cirrus" { + targets = ["cirrus-deploy", "cirrus-dev"] +} + +group "demo" { + targets = ["demo-app-frontend", "demo-app-backend"] +} + +target "megazords" { + context = "./application-services" + + tags = ["experimenter:megazords"] +} + +target "experimenter" { + matrix = { + item = [ + { + build_target = "deploy" + }, + { + build_target = "dev" + }, + { + build_target = "test" + } + ] + } + + tags = ["experimenter:${item.build_target}"] + name = "experimenter-${item.build_target}" + + context = "./experimenter" + target = "dev" + + contexts = { + megazords = "target:megazords" + } +} + +target "cirrus" { + matrix = { + item = [ + { + build_target = "deploy" + }, + { + build_target = "dev" + } + ] + } + + name = "cirrus-${item.build_target}" + tags = ["cirrus:${item.build_target}"] + + context = "./cirrus/server" + target = "deploy" + contexts = { + fml = "./experimenter/experimenter/features/manifests/" + megazords = "target:megazords" + } +} + +target "nginx" { + tags = ["experimenter:nginx"] + + context = "./nginx" +} + +target "rust-sdk" { + tags = ["experimenter:integration-tests"] + + context = "./experimenter/tests/integration" + contexts = { + megazords = "target:megazords" + } +} + +target "demo-app-backend" { + tags = ["demo-app:backend"] + + context = "./demo-app/server" +} + +target "demo-app-frontend" { + tags = ["demo-app:frontend"] + + context = "./demo-app/frontend" +} diff --git a/docker-compose-cirrus.yml b/docker-compose-cirrus.yml deleted file mode 100644 index 1c4d85b77c..0000000000 --- a/docker-compose-cirrus.yml +++ /dev/null @@ -1,42 +0,0 @@ -version: "3" - -services: - cirrus: - build: - additional_contexts: - - fml=experimenter/experimenter/features/manifests/ - context: cirrus/server/ - dockerfile: Dockerfile - env_file: .env - depends_on: - - kinto - volumes: - - ./cirrus/server/:/cirrus - working_dir: /cirrus - ports: - - "8001:8001" - - demo-app-server: - build: - context: ./demo-app/server - dockerfile: Dockerfile - ports: - - '3002:3002' - restart: always - depends_on: - - cirrus - environment: - - CIRRUS=http://cirrus:8001 - - demo-app-frontend: - build: - context: ./demo-app/frontend - dockerfile: Dockerfile - ports: - - '8080:3000' - restart: always - depends_on: - - demo-app-server - environment: - - DEMO_APP_SERVER=http://demo-app-server:3002 - command: npm start diff --git a/docker-compose-integration-test.yml b/docker-compose-integration-test.yml deleted file mode 100644 index 01793a3a34..0000000000 --- a/docker-compose-integration-test.yml +++ /dev/null @@ -1,44 +0,0 @@ -version: "3" - -services: - firefox: - image: selenium/standalone-firefox - env_file: .env - platform: linux/amd64 - environment: - - MOZ_HEADLESS - - FIREFOX_CHANNEL - - PYTEST_ARGS - - PYTEST_BASE_URL - - INTEGRATION_TEST_KINTO_URL - - INTEGRATION_TEST_NGINX_URL - - MOZ_REMOTE_SETTINGS_DEVTOOLS=1 - volumes: - - .:/code - - /code/experimenter/tests/integration/.tox - depends_on: - - nginx - - kinto - - demo-app-frontend - expose: - - "4444" - ports: - - "5900:5900" - - "7902:7900" - shm_size: 2g - working_dir: /code - rust-sdk: - image: experimenter:integration-tests - env_file: .env - volumes: - - .:/code - - /code/experimenter/tests/integration/.tox - working_dir: /code - depends_on: - - nginx - - kinto - demo-app-frontend: - build: - context: ./demo-app/frontend - dockerfile: Dockerfile - command: /bin/true diff --git a/docker-compose-legacy.yml b/docker-compose-legacy.yml deleted file mode 100644 index fe77196155..0000000000 --- a/docker-compose-legacy.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: "3" - -services: - yarn-legacy: - image: experimenter:dev - env_file: .env - tty: true - volumes: - - ./experimenter:/experimenter - - media_volume:/experimenter/experimenter/media - - /experimenter/experimenter/legacy/legacy-ui/core/.cache/ - - /experimenter/experimenter/legacy/legacy-ui/core/node_modules/ - - /experimenter/experimenter/served/ - - /experimenter/node_modules/ - command: bash -c "yarn workspace @experimenter/core watch" - -volumes: - media_volume: diff --git a/docker-compose-prod.yml b/docker-compose-prod.yml deleted file mode 100644 index 4a2380f03d..0000000000 --- a/docker-compose-prod.yml +++ /dev/null @@ -1,79 +0,0 @@ -version: "3" - -services: - experimenter: - image: experimenter:deploy - env_file: .env - environment: - - DEBUG=True - - USE_YARN_DEV=False - stdin_open: true - tty: true - depends_on: - - db - - redis - - kinto - ports: - - "7001:7001" - volumes: - - media_volume:/experimenter/experimenter/media - command: bash -c "python bin/setup_kinto.py;/experimenter/bin/wait-for-it.sh db:5432 -- python manage.py collectstatic --noinput&&gunicorn -w 4 -b 0.0.0.0:7001 experimenter.wsgi" - - worker: - image: experimenter:deploy - env_file: .env - depends_on: - - db - - redis - command: bash -c "/experimenter/bin/wait-for-it.sh db:5432 -- celery -A experimenter worker -l DEBUG" - - beat: - image: experimenter:deploy - env_file: .env - depends_on: - - db - - redis - command: bash -c "/experimenter/bin/wait-for-it.sh db:5432 -- celery -A experimenter beat -l DEBUG" - - nginx: - build: ./nginx - env_file: .env - depends_on: - - experimenter - ports: - - "443:443" - - db: - restart: always - image: postgres:14.8 - environment: - POSTGRES_PASSWORD: postgres - ports: - - "5432:5432" - volumes: - - db_volume:/var/lib/postgresql - - redis: - image: redis:6.2.6 - ports: - - "6379:6379" - - kinto: - image: mozilla/remote-settings:30.1.1 - environment: - KINTO_INI: /etc/kinto.ini - ports: - - "8888:8888" - depends_on: - - autograph - volumes: - - ./kinto/server.ini:/etc/kinto.ini - - autograph: - image: mozilla/autograph:4.1.1 - ports: - - "8000:8000" - -volumes: - db_volume: - media_volume: diff --git a/docker-compose-test.yml b/docker-compose-test.yml deleted file mode 100644 index befffc5997..0000000000 --- a/docker-compose-test.yml +++ /dev/null @@ -1,29 +0,0 @@ -version: "3" - -services: - experimenter: - image: experimenter:test - env_file: .env.sample - environment: - - DEBUG=False - - CIRCLE_PULL_REQUEST - - CIRCLE_BRANCH - volumes: - - ./docs/experimenter:/experimenter/experimenter/docs - depends_on: - - db - - db: - restart: always - image: postgres:14.8 - environment: - POSTGRES_PASSWORD: postgres - - cirrus: - env_file: .env.test - build: - additional_contexts: - - fml=experimenter/experimenter/features/manifests/ - context: cirrus/server/ - dockerfile: Dockerfile - working_dir: /cirrus diff --git a/docker-compose.yml b/docker-compose.yml index 0e17d2cf17..4232e39eb7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,16 +1,25 @@ -version: "3" +# This compose file contains several profiles: +# +# - dev: The Experimenter development server environment. +# - prod: The Experimenter production environment. +# - integration-tests: Services required to run our integration tests (e.g., +# headless Firefox). +# - test: The Experimenter test environment. +# - demo: A demo application for testing Cirrus. services: - experimenter: + experimenter-dev: + profiles: [dev] image: experimenter:dev - env_file: .env - stdin_open: true - tty: true + depends_on: - db - redis - kinto - cirrus-experimenter + env_file: .env + stdin_open: true + tty: true ports: - "7001:7001" volumes: @@ -23,10 +32,45 @@ services: - /experimenter/experimenter/nimbus_ui/static/node_modules/ - /experimenter/experimenter/served/ - /experimenter/node_modules/ - - ${GOOGLE_ADC_FILE}:${GOOGLE_APPLICATION_CREDENTIALS}:ro + # - ${GOOGLE_ADC_FILE}:${GOOGLE_APPLICATION_CREDENTIALS}:ro command: bash -c "python bin/setup_kinto.py;/experimenter/bin/wait-for-it.sh db:5432 -- python /experimenter/manage.py runserver 0:7001" + experimenter-prod: + profiles: [prod, integration-tests] + image: experimenter:deploy + + depends_on: + - db + - redis + - kinto + env_file: .env + environment: + - DEBUG=True + - USE_YARN_DEV=False + stdin_open: true + tty: true + ports: + - "7001:7001" + volumes: + - media_volume:/experimenter/experimenter/media + command: bash -c "python bin/setup_kinto.py;/experimenter/bin/wait-for-it.sh db:5432 -- python manage.py collectstatic --noinput&&gunicorn -w 4 -b 0.0.0.0:7001 experimenter.wsgi" + + experimenter-test: + profiles: [test] + image: experimenter:test + + depends_on: + - db + env_file: .env.sample + environment: + - DEBUG=false + - CIRCLE_PULL_REQUEST + - CIRCLE_BRANCH + volumes: + - ./docs/experimenter:/experimenter/experimenter/docs + yarn-nimbus_ui: + profiles: [dev] image: experimenter:dev env_file: .env stdin_open: true @@ -41,10 +85,11 @@ services: - /experimenter/experimenter/nimbus_ui/static/node_modules/ - /experimenter/experimenter/served/ - /experimenter/node_modules/ - - ${GOOGLE_ADC_FILE}:${GOOGLE_APPLICATION_CREDENTIALS}:ro + # - ${GOOGLE_ADC_FILE}:${GOOGLE_APPLICATION_CREDENTIALS}:ro command: bash -c "FORCE_COLOR=true yarn workspace @experimenter/nimbus_ui watch | cat" yarn-results: + profiles: [dev] image: experimenter:dev env_file: .env tty: true @@ -59,40 +104,50 @@ services: - /experimenter/experimenter/nimbus_ui/static/node_modules/ - /experimenter/experimenter/served/ - /experimenter/node_modules/ - - ${GOOGLE_ADC_FILE}:${GOOGLE_APPLICATION_CREDENTIALS}:ro + # - ${GOOGLE_ADC_FILE}:${GOOGLE_APPLICATION_CREDENTIALS}:ro command: bash -c "FORCE_COLOR=true yarn workspace @experimenter/results start | cat" worker: - image: experimenter:dev + profiles: [dev, prod] + image: experimenter:deploy env_file: .env depends_on: - db - redis volumes: - ./experimenter:/experimenter - - ${GOOGLE_ADC_FILE}:${GOOGLE_APPLICATION_CREDENTIALS}:ro + # - ${GOOGLE_ADC_FILE}:${GOOGLE_APPLICATION_CREDENTIALS}:ro command: bash -c "/experimenter/bin/wait-for-it.sh db:5432 -- celery -A experimenter worker -l DEBUG" beat: - image: experimenter:dev + profiles: [dev, prod] + image: experimenter:deploy env_file: .env depends_on: - db - redis volumes: - ./experimenter:/experimenter - - ${GOOGLE_ADC_FILE}:${GOOGLE_APPLICATION_CREDENTIALS}:ro + # - ${GOOGLE_ADC_FILE}:${GOOGLE_APPLICATION_CREDENTIALS}:ro command: bash -c "/experimenter/bin/wait-for-it.sh db:5432 -- celery -A experimenter beat -s /tmp/celerybeat-schedule -l DEBUG" - nginx: - build: ./nginx + nginx-dev: &nginx + profiles: [dev] + image: experimenter:nginx env_file: .env depends_on: - - experimenter + - experimenter-dev ports: - "443:443" + nginx-prod: + <<: *nginx + profiles: [prod, integration-tests] + depends_on: + - experimenter-prod + db: + profiles: [dev, prod, test] restart: always image: postgres:14.8 environment: @@ -103,11 +158,13 @@ services: - db_volume:/var/lib/postgresql redis: + profiles: [dev, prod, integration-test] image: redis:6.2.6 ports: - "6379:6379" kinto: + profiles: [dev, prod, integration-test, demo] image: mozilla/remote-settings:30.1.1 environment: KINTO_INI: /etc/kinto.ini @@ -119,16 +176,14 @@ services: - ./kinto/server.ini:/etc/kinto.ini autograph: + profiles: [dev, prod, integration-test, demo] image: mozilla/autograph:4.1.1 ports: - "8000:8000" - cirrus-experimenter: - build: - additional_contexts: - - fml=experimenter/experimenter/features/manifests/ - context: cirrus/server/ - dockerfile: Dockerfile + cirrus-experimenter: &cirrus-experimenter + profiles: [dev, prod] + image: cirrus:deploy env_file: .env environment: CIRRUS_APP_ID: experimenter.cirrus @@ -139,7 +194,91 @@ services: - kinto volumes: - ./cirrus/server/:/cirrus - working_dir: /cirrus + + cirrus-test: + profiles: [test] + image: cirrus:deploy + env_file: .env.test + depends_on: + - kinto + + firefox: + profiles: [integration-test] + image: selenium/standalone-firefox + env_file: .env + platform: linux/amd64 + environment: + - MOZ_HEADLESS + - FIREFOX_CHANNEL + - PYTEST_ARGS + - PYTEST_BASE_URL + - INTEGRATION_TEST_KINTO_URL + - INTEGRATION_TEST_NGINX_URL + - MOZ_REMOTE_SETTINGS_DEVTOOLS=1 + volumes: + - .:/code + - /code/experimenter/tests/integration/.tox + depends_on: + - nginx + - kinto + - demo-app-frontend + expose: + - "4444" + ports: + - "5900:5900" + - "7902:7900" + shm_size: 2g + working_dir: /code + + rust-sdk: + profiles: [integration-test] + image: experimenter:integration-tests + env_file: .env + volumes: + - .:/code + - /code/experimenter/tests/integration/.tox + working_dir: /code + depends_on: + - nginx + - kinto + + yarn-legacy: + profiles: [legacy] + image: experimenter:dev + env_file: .env + tty: true + volumes: + - ./experimenter:/experimenter + - media_volume:/experimenter/experimenter/media + - /experimenter/experimenter/legacy/legacy-ui/core/.cache/ + - /experimenter/experimenter/legacy/legacy-ui/core/node_modules/ + - /experimenter/experimenter/served/ + - /experimenter/node_modules/ + command: bash -c "yarn workspace @experimenter/core watch" + + cirrus-demo: + <<: *cirrus-experimenter + profiles: [demo] + environment: + CIRRUS_APP_ID: demo-app-beta + CIRRUS_APP_NAME: demo_app + CIRRUS_CHANNEL: beta + CIRRUS_FML_PATH: ./feature_manifests/sample.yml + + demo-app-backend: + profiles: [demo] + image: demo-app:backend + ports: + - '3002:3002' + restart: always + depends_on: + - cirrus-demo + environment: + - CIRRUS=http://cirrus:8001 + + demo-app-frontend: + profiles: [demo, integration-test] + image: demo-app:frontend volumes: db_volume: diff --git a/experimenter/Dockerfile b/experimenter/Dockerfile index 3555d16f30..8e87efacd2 100644 --- a/experimenter/Dockerfile +++ b/experimenter/Dockerfile @@ -80,7 +80,7 @@ COPY --from=node-builder /experimenter/experimenter/nimbus_ui/static/node_module COPY --from=node-builder /experimenter/node_modules/ /experimenter/node_modules/ # Rust packages -COPY --from=experimenter:megazords /application-services/megazords/nimbus-experimenter/ /application-services/nimbus_megazord/ +COPY --from=megazords /application-services/megazords/nimbus-experimenter/ /application-services/nimbus_megazord/ ENV PYTHONPATH=$PYTHONPATH:/application-services/ # Install nimbus-cli @@ -128,7 +128,7 @@ ENV PYTHONDONTWRITEBYTECODE=1 # System packages RUN apt-get update -RUN apt-get --no-install-recommends install -y apt-utils ca-certificates git postgresql-client +RUN apt-get --no-install-recommends install -y apt-utils ca-certificates git postgresql-client # Copy source from previously built containers COPY --from=dev /usr/local/bin/ /usr/local/bin/ diff --git a/experimenter/tests/integration/Dockerfile b/experimenter/tests/integration/Dockerfile index 9bd47b0b27..43cf789827 100755 --- a/experimenter/tests/integration/Dockerfile +++ b/experimenter/tests/integration/Dockerfile @@ -1,7 +1,6 @@ FROM python:3.11-bullseye -COPY --from=experimenter:megazords \ - /application-services/megazords/nimbus-experimenter /application-services/nimbus_megazord +COPY --from=megazords /application-services/megazords/nimbus-experimenter /application-services/nimbus_megazord ENV PYTHONPATH=$PYTHONPATH:/application-services/ From 3c9fcab62a86a8a8966b83100708ede546239fcd Mon Sep 17 00:00:00 2001 From: Beth Rennie Date: Thu, 21 Aug 2025 14:06:12 -0400 Subject: [PATCH 2/2] more wips --- docker-compose.yml | 45 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 4232e39eb7..5ef65b0e88 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,7 +9,9 @@ services: experimenter-dev: - profiles: [dev] + profiles: + - dev + image: experimenter:dev depends_on: @@ -36,7 +38,10 @@ services: command: bash -c "python bin/setup_kinto.py;/experimenter/bin/wait-for-it.sh db:5432 -- python /experimenter/manage.py runserver 0:7001" experimenter-prod: - profiles: [prod, integration-tests] + profiles: + - prod + - integration-tests + image: experimenter:deploy depends_on: @@ -56,7 +61,9 @@ services: command: bash -c "python bin/setup_kinto.py;/experimenter/bin/wait-for-it.sh db:5432 -- python manage.py collectstatic --noinput&&gunicorn -w 4 -b 0.0.0.0:7001 experimenter.wsgi" experimenter-test: - profiles: [test] + profiles: + - test + image: experimenter:test depends_on: @@ -70,8 +77,11 @@ services: - ./docs/experimenter:/experimenter/experimenter/docs yarn-nimbus_ui: - profiles: [dev] + profiles: + - dev + image: experimenter:dev + env_file: .env stdin_open: true tty: true @@ -89,8 +99,11 @@ services: command: bash -c "FORCE_COLOR=true yarn workspace @experimenter/nimbus_ui watch | cat" yarn-results: - profiles: [dev] + profiles: + - dev + image: experimenter:dev + env_file: .env tty: true ports: @@ -108,35 +121,45 @@ services: command: bash -c "FORCE_COLOR=true yarn workspace @experimenter/results start | cat" worker: - profiles: [dev, prod] + profiles: + - dev + - prod + image: experimenter:deploy - env_file: .env depends_on: - db - redis + env_file: .env volumes: - ./experimenter:/experimenter # - ${GOOGLE_ADC_FILE}:${GOOGLE_APPLICATION_CREDENTIALS}:ro command: bash -c "/experimenter/bin/wait-for-it.sh db:5432 -- celery -A experimenter worker -l DEBUG" beat: - profiles: [dev, prod] + profiles: + - dev + - prod + image: experimenter:deploy - env_file: .env + depends_on: - db - redis + env_file: .env volumes: - ./experimenter:/experimenter # - ${GOOGLE_ADC_FILE}:${GOOGLE_APPLICATION_CREDENTIALS}:ro command: bash -c "/experimenter/bin/wait-for-it.sh db:5432 -- celery -A experimenter beat -s /tmp/celerybeat-schedule -l DEBUG" nginx-dev: &nginx - profiles: [dev] + profiles: + - dev + image: experimenter:nginx - env_file: .env + depends_on: - experimenter-dev + env_file: .env ports: - "443:443"