diff --git a/.gitea/workflows/migrate.yaml b/.gitea/workflows/migrate.yaml new file mode 100644 index 0000000..84c25e0 --- /dev/null +++ b/.gitea/workflows/migrate.yaml @@ -0,0 +1,76 @@ +name: DB Migration + +on: + push: + branches: [main] + paths: + - 'crates/mem-store/migrations/**' + workflow_dispatch: + +env: + DB_HOST: memory-db-rw.poimen.svc.cluster.local + DB_PORT: "5432" + DB_NAME: memory + +jobs: + migrate: + name: Run Migrations + runs-on: rust + steps: + - name: Install psql + run: apt-get update && apt-get install -y postgresql-client + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Fetch previous migrations state + run: | + git fetch origin main --depth=2 + # List changed migration files + CHANGED=$(git diff --name-only HEAD~1 HEAD -- crates/mem-store/migrations/ || echo "") + echo "Changed migrations: $CHANGED" + echo "CHANGED_MIGRATIONS=$CHANGED" >> $GITHUB_ENV + + - name: Run migrations + if: env.CHANGED_MIGRATIONS != '' + run: | + export PGPASSWORD="${DB_PASSWORD}" + + echo "=== Running changed migrations ===" + for f in $CHANGED_MIGRATIONS; do + if [ -f "$f" ]; then + echo "--- Applying: $f ---" + psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -f "$f" 2>&1 + if [ $? -ne 0 ]; then + echo "ERROR: Migration $f failed!" + exit 1 + fi + echo "--- OK: $f ---" + fi + done + + echo "=== Verify schema ===" + psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c "\dt memory*" + env: + DB_USER: ${{ secrets.DB_USER }} + DB_PASSWORD: ${{ secrets.DB_PASSWORD }} + + - name: Run all migrations (manual trigger) + if: github.event_name == 'workflow_dispatch' + run: | + export PGPASSWORD="${DB_PASSWORD}" + + echo "=== Running all migrations in order ===" + for f in $(ls crates/mem-store/migrations/*.sql | sort); do + echo "--- Applying: $f ---" + psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -f "$f" 2>&1 || true + echo "--- Done: $f ---" + done + + echo "=== Final schema ===" + psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c "\dt memory*" + psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c "\d memory_entity" + psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c "\d memory_edge" + env: + DB_USER: ${{ secrets.DB_USER }} + DB_PASSWORD: ${{ secrets.DB_PASSWORD }}