feat: single-file schema example #11
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: pgschema Plan - Single File | |
| on: | |
| pull_request: | |
| types: [opened, synchronize, reopened] | |
| paths: | |
| - "singlefile/**" | |
| - ".github/workflows/pgschema-singlefile-plan.yml" | |
| permissions: | |
| contents: read | |
| pull-requests: write | |
| jobs: | |
| pgschema-plan-single: | |
| runs-on: ubuntu-latest | |
| env: | |
| PGPASSWORD: postgres | |
| services: | |
| postgres: | |
| image: postgres:17 | |
| env: | |
| POSTGRES_PASSWORD: postgres | |
| POSTGRES_USER: postgres | |
| POSTGRES_DB: testdb | |
| options: >- | |
| --health-cmd pg_isready | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| ports: | |
| - 5432:5432 | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Go | |
| uses: actions/setup-go@v5 | |
| with: | |
| go-version: "stable" | |
| - name: Install pgschema | |
| run: go install github.com/pgschema/pgschema@latest | |
| - name: Load baseline schema | |
| run: | | |
| echo "::group::Loading baseline schema to emulate remote database" | |
| PGPASSWORD=postgres psql -h localhost -p 5432 -U postgres -d testdb -f baseline.sql | |
| echo "::endgroup::" | |
| - name: Run pgschema plan | |
| id: plan | |
| run: | | |
| echo "Running pgschema plan with detailed logging..." | |
| # Enable detailed error reporting | |
| set -x # Show commands as they execute | |
| # Run pgschema plan and generate both text and JSON output | |
| PLAN_OUTPUT=$(pgschema plan \ | |
| --debug \ | |
| --host localhost \ | |
| --port 5432 \ | |
| --db testdb \ | |
| --user postgres \ | |
| --file "${{ github.workspace }}/singlefile/schema.sql" \ | |
| --output-json plan.json \ | |
| --output-human stdout \ | |
| 2>&1) | |
| set +x # Disable command tracing | |
| # Verify plan.json was created | |
| if [ ! -f "plan.json" ]; then | |
| echo "❌ Error: plan.json was not generated" | |
| exit 1 | |
| fi | |
| echo "✅ plan.json generated successfully" | |
| # Set output for PR comment | |
| echo "plan<<EOF" >> $GITHUB_OUTPUT | |
| echo "$PLAN_OUTPUT" >> $GITHUB_OUTPUT | |
| echo "EOF" >> $GITHUB_OUTPUT | |
| - name: Upload plan.json artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: pgschema-singlefile-plan-${{ github.event.pull_request.number }} | |
| path: plan.json | |
| retention-days: 30 | |
| - name: Comment PR | |
| uses: actions/github-script@v7 | |
| with: | |
| github-token: ${{secrets.GITHUB_TOKEN}} | |
| script: | | |
| const planOutput = `${{ steps.plan.outputs.plan }}`; | |
| const decodedOutput = planOutput; | |
| const body = `## pgschema Plan Output | |
| 📋 **Plan artifact created:** \`pgschema-singlefile-plan-${{ github.event.pull_request.number }}\` | |
| This plan will be used automatically when the PR is merged. | |
| <details> | |
| <summary>Click to expand plan details</summary> | |
| \`\`\` | |
| ${decodedOutput} | |
| \`\`\` | |
| </details> | |
| --- | |
| *This comment was automatically generated by the [pgschema](https://www.pgschema.com) Single File Plan workflow.*`; | |
| // Try to find existing comment | |
| const { data: comments } = await github.rest.issues.listComments({ | |
| ...context.repo, | |
| issue_number: context.issue.number, | |
| }); | |
| const botComment = comments.find(comment => | |
| comment.user.type === 'Bot' && | |
| comment.body.includes('pgschema Plan Output') | |
| ); | |
| if (botComment) { | |
| // Update existing comment | |
| await github.rest.issues.updateComment({ | |
| ...context.repo, | |
| comment_id: botComment.id, | |
| body: body | |
| }); | |
| } else { | |
| // Create new comment | |
| await github.rest.issues.createComment({ | |
| ...context.repo, | |
| issue_number: context.issue.number, | |
| body: body | |
| }); | |
| } |