image: python:3.13 stages: - test - tag variables: UV_CACHE_DIR: "$CI_PROJECT_DIR/.uv-cache" cache: paths: - .uv-cache/ .uv_setup: &uv_setup - curl -LsSf https://astral.sh/uv/install.sh | sh - export PATH="$HOME/.cargo/bin:$PATH" - source $HOME/.local/bin/env workflow: rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - if: $CI_COMMIT_TAG # --- Data platform --- test:cli: stage: test before_script: - *uv_setup script: - uv sync - uv run pytest tests rules: - changes: - src/**/* - tests/**/* - pyproject.toml test:sqlmesh: stage: test before_script: - *uv_setup script: - uv sync - cd transform/sqlmesh_materia && uv run sqlmesh test rules: - changes: - transform/**/* # --- Web app --- test:web: stage: test before_script: - *uv_setup script: - uv sync - cd web && uv run pytest tests/ -x -q - cd web && uv run ruff check src/ tests/ rules: - changes: - web/**/* # --- Deploy (pull-based via supervisor) --- # The on-server supervisor (src/materia/supervisor.py) polls for new tags # every 60s and deploys automatically when a new v tag appears. # No SSH keys, no deploy credentials needed in CI. tag: stage: tag image: alpine:latest needs: [] before_script: - apk add --no-cache git script: - git tag "v${CI_PIPELINE_IID}" - git push "https://gitlab-ci-token:${CI_JOB_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git" "v${CI_PIPELINE_IID}" rules: - if: $CI_COMMIT_BRANCH == "master"