Files
beanflows/.gitlab/.gitlab-ci.yml
Deeman 817d9c16b7 ci: enable deploy stage with SSH-based blue/green deployment
Writes .env to web/, runs deploy.sh from web/. Pushes env vars
from GitLab CI/CD variables to the server on every master push.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 23:09:32 +01:00

115 lines
2.7 KiB
YAML

image: python:3.13
stages:
# - lint
- test
- deploy
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
#lint:
# stage: lint
# before_script:
# - *uv_setup
# script:
# - uv sync
# - uv run ruff check .
# --- 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:web:
stage: deploy
image: alpine:latest
needs: [test:web]
rules:
- if: $CI_COMMIT_BRANCH == "master"
before_script:
- apk add --no-cache openssh-client
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
script:
- |
ssh "$DEPLOY_USER@$DEPLOY_HOST" "cat > /opt/beanflows/web/.env" << ENVEOF
APP_NAME=$APP_NAME
SECRET_KEY=$SECRET_KEY
BASE_URL=$BASE_URL
DEBUG=false
DATABASE_PATH=data/app.db
MAGIC_LINK_EXPIRY_MINUTES=$MAGIC_LINK_EXPIRY_MINUTES
SESSION_LIFETIME_DAYS=$SESSION_LIFETIME_DAYS
RESEND_API_KEY=$RESEND_API_KEY
EMAIL_FROM=$EMAIL_FROM
RESEND_AUDIENCE_WAITLIST=$RESEND_AUDIENCE_WAITLIST
ADMIN_EMAILS=$ADMIN_EMAILS
WAITLIST_MODE=$WAITLIST_MODE
RATE_LIMIT_REQUESTS=$RATE_LIMIT_REQUESTS
RATE_LIMIT_WINDOW=$RATE_LIMIT_WINDOW
PADDLE_API_KEY=$PADDLE_API_KEY
PADDLE_WEBHOOK_SECRET=$PADDLE_WEBHOOK_SECRET
PADDLE_ENVIRONMENT=$PADDLE_ENVIRONMENT
PADDLE_PRICE_STARTER=$PADDLE_PRICE_STARTER
PADDLE_PRICE_PRO=$PADDLE_PRICE_PRO
UMAMI_SCRIPT_URL=$UMAMI_SCRIPT_URL
UMAMI_WEBSITE_ID=$UMAMI_WEBSITE_ID
SERVING_DUCKDB_PATH=$SERVING_DUCKDB_PATH
ENVEOF
- ssh "$DEPLOY_USER@$DEPLOY_HOST" "chmod 600 /opt/beanflows/web/.env"
- ssh "$DEPLOY_USER@$DEPLOY_HOST" "cd /opt/beanflows && git pull origin master && cd web && bash deploy.sh"