Skip to content

feat: single-file schema example #11

feat: single-file schema example

feat: single-file schema example #11

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
});
}