name: Publish Prisma Migrations permissions: contents: write pull-requests: write on: push: paths: - 'schema.prisma' # Check root schema.prisma branches: - main jobs: publish-migrations: runs-on: ubuntu-latest services: postgres: image: postgres:14 env: POSTGRES_DB: temp_db POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres ports: - 5432:5432 options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 # Add shadow database service postgres_shadow: image: postgres:14 env: POSTGRES_DB: shadow_db POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres ports: - 5433:5432 options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 steps: - uses: actions/checkout@v3 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.x' - name: Install Dependencies run: | pip install prisma pip install python-dotenv - name: Generate Initial Migration if None Exists env: DATABASE_URL: "postgresql://postgres:postgres@localhost:5432/temp_db" DIRECT_URL: "postgresql://postgres:postgres@localhost:5432/temp_db" SHADOW_DATABASE_URL: "postgresql://postgres:postgres@localhost:5433/shadow_db" run: | mkdir -p deploy/migrations echo 'provider = "postgresql"' > deploy/migrations/migration_lock.toml if [ -z "$(ls -A deploy/migrations/2* 2>/dev/null)" ]; then echo "No existing migrations found, creating baseline..." VERSION=$(date +%Y%m%d%H%M%S) mkdir -p deploy/migrations/${VERSION}_initial echo "Generating initial migration..." # Save raw output for debugging prisma migrate diff \ --from-empty \ --to-schema-datamodel schema.prisma \ --shadow-database-url "${SHADOW_DATABASE_URL}" \ --script > deploy/migrations/${VERSION}_initial/raw_migration.sql echo "Raw migration file content:" cat deploy/migrations/${VERSION}_initial/raw_migration.sql echo "Cleaning migration file..." # Clean the file sed '/^Installing/d' deploy/migrations/${VERSION}_initial/raw_migration.sql > deploy/migrations/${VERSION}_initial/migration.sql # Verify the migration file if [ ! -s deploy/migrations/${VERSION}_initial/migration.sql ]; then echo "ERROR: Migration file is empty after cleaning" echo "Original content was:" cat deploy/migrations/${VERSION}_initial/raw_migration.sql exit 1 fi echo "Final migration file content:" cat deploy/migrations/${VERSION}_initial/migration.sql # Verify it starts with SQL if ! head -n 1 deploy/migrations/${VERSION}_initial/migration.sql | grep -q "^--\|^CREATE\|^ALTER"; then echo "ERROR: Migration file does not start with SQL command or comment" echo "First line is:" head -n 1 deploy/migrations/${VERSION}_initial/migration.sql echo "Full content is:" cat deploy/migrations/${VERSION}_initial/migration.sql exit 1 fi echo "Initial migration generated at $(date -u)" > deploy/migrations/${VERSION}_initial/README.md fi - name: Compare and Generate Migration if: success() env: DATABASE_URL: "postgresql://postgres:postgres@localhost:5432/temp_db" DIRECT_URL: "postgresql://postgres:postgres@localhost:5432/temp_db" SHADOW_DATABASE_URL: "postgresql://postgres:postgres@localhost:5433/shadow_db" run: | # Create temporary migration workspace mkdir -p temp_migrations # Copy existing migrations (will not fail if directory is empty) cp -r deploy/migrations/* temp_migrations/ 2>/dev/null || true VERSION=$(date +%Y%m%d%H%M%S) # Generate diff against existing migrations or empty state prisma migrate diff \ --from-migrations temp_migrations \ --to-schema-datamodel schema.prisma \ --shadow-database-url "${SHADOW_DATABASE_URL}" \ --script > temp_migrations/migration_${VERSION}.sql # Check if there are actual changes if [ -s temp_migrations/migration_${VERSION}.sql ]; then echo "Changes detected, creating new migration" mkdir -p deploy/migrations/${VERSION}_schema_update mv temp_migrations/migration_${VERSION}.sql deploy/migrations/${VERSION}_schema_update/migration.sql echo "Migration generated at $(date -u)" > deploy/migrations/${VERSION}_schema_update/README.md else echo "No schema changes detected" exit 0 fi - name: Verify Migration if: success() env: DATABASE_URL: "postgresql://postgres:postgres@localhost:5432/temp_db" DIRECT_URL: "postgresql://postgres:postgres@localhost:5432/temp_db" SHADOW_DATABASE_URL: "postgresql://postgres:postgres@localhost:5433/shadow_db" run: | # Create test database psql "${SHADOW_DATABASE_URL}" -c 'CREATE DATABASE migration_test;' # Apply all migrations in order to verify for migration in deploy/migrations/*/migration.sql; do echo "Applying migration: $migration" psql "${SHADOW_DATABASE_URL}" -f $migration done # Add this step before create-pull-request to debug permissions - name: Check Token Permissions run: | echo "Checking token permissions..." curl -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ -H "Accept: application/vnd.github.v3+json" \ https://api.github.com/repos/BerriAI/litellm/collaborators echo "\nChecking if token can create PRs..." curl -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ -H "Accept: application/vnd.github.v3+json" \ https://api.github.com/repos/BerriAI/litellm # Add this debug step before git push - name: Debug Changed Files run: | echo "Files staged for commit:" git diff --name-status --staged echo "\nAll changed files:" git status - name: Create Pull Request if: success() uses: peter-evans/create-pull-request@v5 with: token: ${{ secrets.GITHUB_TOKEN }} commit-message: "chore: update prisma migrations" title: "Update Prisma Migrations" body: | Auto-generated migration based on schema.prisma changes. Generated files: - deploy/migrations/${VERSION}_schema_update/migration.sql - deploy/migrations/${VERSION}_schema_update/README.md branch: feat/prisma-migration-${{ env.VERSION }} base: main delete-branch: true - name: Generate and Save Migrations run: | # Only add migration files git add deploy/migrations/ git status # Debug what's being committed git commit -m "chore: update prisma migrations"