-
Notifications
You must be signed in to change notification settings - Fork 0
148 lines (119 loc) · 4.11 KB
/
pgschema-multifile-plan.yml
File metadata and controls
148 lines (119 loc) · 4.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
name: pgschema Plan - Multi File
on:
pull_request:
types: [opened, synchronize, reopened]
paths:
- "multifile/**"
- ".github/workflows/pgschema-multifile-plan.yml"
permissions:
contents: read
pull-requests: write
jobs:
pgschema-plan-multi:
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/pgplex/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 }}/multifile/main.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-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-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) Multi 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
});
}