diff --git a/.docker/scalingo-job/Dockerfile b/.docker/scalingo-job/Dockerfile new file mode 100644 index 0000000000..8db81321c2 --- /dev/null +++ b/.docker/scalingo-job/Dockerfile @@ -0,0 +1,21 @@ +FROM alpine:3.19 + +RUN apk add --no-cache \ + bash \ + curl \ + ca-certificates \ + coreutils \ + tar \ + gzip \ + && update-ca-certificates + +ENV TMPDIR=/tmp +RUN mkdir -p /tmp + +RUN curl -fsSL https://cli-dl.scalingo.com/install.sh | bash && scalingo --version + +COPY .docker/scalingo-job/sync-db.sh /sync-db.sh + +RUN chmod +x /sync-db.sh + +ENTRYPOINT ["/sync-db.sh"] diff --git a/.docker/scalingo-job/sync-db.sh b/.docker/scalingo-job/sync-db.sh new file mode 100644 index 0000000000..269844d827 --- /dev/null +++ b/.docker/scalingo-job/sync-db.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +set -eu + +IMAGE_VERSION="1.0.1" + +log() { + level="$1" + shift + echo "$(date -u '+%Y-%m-%dT%H:%M:%SZ') [$level] $*" +} + +log INFO "Image version: ${IMAGE_VERSION}" + +: "${SCALINGO_API_TOKEN:?Missing SCALINGO_API_TOKEN}" +SCALINGO_APP="${METABASE_SYNC_SCALINGO_APP:-histologe-preprod}" + +command -v scalingo >/dev/null 2>&1 || { log ERROR "scalingo CLI not found"; exit 127; } + +log INFO "Starting Scalingo job" +log INFO "App: ${SCALINGO_APP}" +log INFO "Remote command: sh /app/scripts/sync-db.sh" + +log INFO "Version installée : $(scalingo --version)" + +# LOCAL MODE +if [ "${METABASE_SYNC_LOCAL_MODE:-0}" = "1" ]; then + log WARN "Running in LOCAL MODE" + log INFO "Executing safe Scalingo command: scalingo apps" + exec scalingo apps +fi + +# PROD MODE +log INFO "Executing remote sync-db script on Scalingo" +exec scalingo -a "$SCALINGO_APP" run -d -- sh /app/scripts/sync-db.sh diff --git a/Makefile b/Makefile index f059840c15..b78b3650fa 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,13 @@ PHPUNIT = ./vendor/bin/phpunit SYMFONY = php bin/console NPX = npx NPM = npm +METABASE_SYNC_LOCAL_MODE = 1 +METABASE_SYNC_IMAGE_NAME = scalingo-sync-silo-metabase +METABASE_SYNC_SCALINGO_APP = histologe-preprod +METABASE_SYNC_IMAGE_LOCAL = $(METABASE_SYNC_IMAGE_NAME):local +METABASE_SYNC_SCALINGO_JOB_DOCKERFILE = .docker/scalingo-job/Dockerfile +METABASE_SYNC_SCW_REGISTRY = rg.fr-par.scw.cloud +METABASE_SYNC_SCW_NAMESPACE = signal-logement help: @grep -E '(^[a-zA-Z0-9_-]+:.*?##.*$$)|(^##)' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}{printf "\033[32m%-30s\033[0m %s\n", $$1, $$2}' | sed -e 's/\[32m##/[33m/' @@ -267,6 +274,42 @@ scalingo-update-cli: ## Install/Update Scalingo CLI run-concurrency-request: ## Run concurrency request based postman collection ex: make run-concurrency-request nb=5 envName=local|demo @bash -l -c 'node ./tools/newman/run_concurrency_request.js nb=$(nb) envName=$(envName)' +## Sync metabase +scalingo-job-build: ## Build Scalingo sync job container + @echo "\033[33mBuilding Scalingo job image...\033[0m" + docker build \ + -f $(METABASE_SYNC_SCALINGO_JOB_DOCKERFILE) \ + -t $(METABASE_SYNC_IMAGE_NAME):local \ + . + @echo "\033[32m✅ Image built: $(METABASE_SYNC_IMAGE_NAME):local\033[0m" + @echo "\n\033[36m💡 Vous pouvez tester l'image localement en exécutant : make scalingo-job-run\033[0m" + @echo "\033[33m⚠️ Note : Assurez-vous d'avoir ajouté la variable d'envionnement export SCALINGO_API_TOKEN=xxxxxxxxxxxxxx" + @echo " Pour générez un token API : https://dashboard.scalingo.com/account/tokens\033[0m" + @echo "\n\033[31m/!\ ATTENTION : Vérifiez bien le dernier tag distant avant de pousser /!\ \033[0m" + @echo "\033[33mTags actuellement présents sur le registry distant https://console.scaleway.com/registry \033[0m" + @echo "\n\033[35m🚀 RELEASE : Pour pousser l'image, exécutez :" + @echo " make scalingo-job-release IMAGE_VERSION=999.999\033[0m" + +scalingo-job-run: ## Run Scalingo sync job locally + @echo "\033[33mRunning Scalingo job locally...\033[0m" + docker run --rm \ + -e SCALINGO_API_TOKEN=$(METABASE_SYNC_SCALINGO_API_TOKEN) \ + -e METABASE_SYNC_SCALINGO_APP=$(METABASE_SYNC_SCALINGO_APP) \ + -e METABASE_SYNC_LOCAL_MODE=0 \ + $(METABASE_SYNC_IMAGE_NAME):local + +scalingo-job-tag: ## Tag the local image with a version for Scaleway registry - make scalingo-job-tag IMAGE_VERSION=1.0.x + @echo "Tagging image $(METABASE_SYNC_IMAGE_LOCAL) as $(IMAGE_VERSION)" + docker tag $(METABASE_SYNC_IMAGE_LOCAL) \ + $(METABASE_SYNC_SCW_REGISTRY)/$(METABASE_SYNC_SCW_NAMESPACE)/$(METABASE_SYNC_IMAGE_NAME):$(IMAGE_VERSION) + +scalingo-job-push: ## Push the versioned image to Scaleway registry - make scalingo-job-push IMAGE_VERSION=1.0.x + @echo "Pushing image version $(IMAGE_VERSION) to Scaleway registry" + docker push \ + $(METABASE_SYNC_SCW_REGISTRY)/$(METABASE_SYNC_SCW_NAMESPACE)/$(METABASE_SYNC_IMAGE_NAME):$(IMAGE_VERSION) + +scalingo-job-release: scalingo-job-tag scalingo-job-push ## Tag and push image to Scaleway - make scalingo-job-release IMAGE_VERSION=1.0.x + .tools-destroy: @echo "\033[33mRemoving tools containers ...\033[0m" @$(DOCKER_COMP) -f $(DOCKER_COMP_FILE_TOOLS) rm -v --force --stop || true diff --git a/config/app/cron_scheduler.yaml b/config/app/cron_scheduler.yaml index 9527298503..3a3c36a29c 100644 --- a/config/app/cron_scheduler.yaml +++ b/config/app/cron_scheduler.yaml @@ -11,6 +11,4 @@ parameters: - command: 'php bin/console app:sync-esabora-schs' schedule: '%env(ESABORA_CRON_SCHEDULE_SYNC_SCHS)%' - - - command: 'sh /app/scripts/sync-db.sh' - schedule: '%env(METABASE_CRON_SCHEDULE_SYNC_BDD)%' +