File: ci.yml

package info (click to toggle)
pg-statviz 0.9-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,012 kB
  • sloc: python: 3,428; sql: 2,951; makefile: 18; sh: 13
file content (199 lines) | stat: -rw-r--r-- 8,545 bytes parent folder | download
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
name: CI

on:
    push:
        branches: [ master ]
    pull_request:
        branches: [ master ]

jobs:
    lint-and-build:
        name: Lint and Build
        runs-on: ubuntu-latest
        steps:
            - name: Check out code
              uses: actions/checkout@v4

            - name: Set up Python
              uses: actions/setup-python@v5
              with:
                  python-version: '3.13'

            - name: Install Python dependencies
              run: |
                  python -m pip install --upgrade pip
                  pip install flake8 build

            - name: Lint Python code
              run: |
                  cd src/pg_statviz
                  bash flake.sh

            - name: Build Python package
              run: python -m build

            - name: Upload Python package
              uses: actions/upload-artifact@v4
              with:
                  name: python-package
                  path: dist/
                  retention-days: 1

    test-extension:
        name: Test Extension - PG${{ matrix.pg_version }}
        runs-on: ubuntu-latest
        needs: lint-and-build
        strategy:
            matrix:
                pg_version: [13, 14, 15, 16, 17, 18]
        steps:
            - name: Check out code
              uses: actions/checkout@v4

            - name: Install PostgreSQL ${{ matrix.pg_version }}
              run: |
                  wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
                  echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
                  sudo apt-get update
                  sudo apt-get install -y postgresql-${{ matrix.pg_version }} postgresql-server-dev-${{ matrix.pg_version }}

            - name: Build and install extension
              run: |
                  sudo make install PG_CONFIG=/usr/lib/postgresql/${{ matrix.pg_version }}/bin/pg_config

            - name: Initialize PostgreSQL
              run: |
                  sudo -u postgres /usr/lib/postgresql/${{ matrix.pg_version }}/bin/initdb -D /tmp/pgdata
                  sudo -u postgres /usr/lib/postgresql/${{ matrix.pg_version }}/bin/pg_ctl -D /tmp/pgdata -l /tmp/postgres.log start

            - name: Wait for PostgreSQL
              run: |
                  for i in {1..30}; do
                      if sudo -u postgres /usr/lib/postgresql/${{ matrix.pg_version }}/bin/pg_isready -q; then
                          echo "PostgreSQL is ready"
                          break
                      fi
                      echo "Waiting for PostgreSQL... ($i/30)"
                      sleep 1
                  done

            - name: Run extension tests
              run: |
                  sudo cp -r . /tmp/pg_statviz_test
                  sudo chown -R postgres:postgres /tmp/pg_statviz_test
                  cd /tmp/pg_statviz_test && sudo -u postgres make installcheck PG_CONFIG=/usr/lib/postgresql/${{ matrix.pg_version }}/bin/pg_config

            - name: Show regression diffs on failure
              if: failure()
              run: |
                  if [ -f regression.diffs ]; then
                      cat regression.diffs
                  fi

            - name: Shutdown PostgreSQL
              if: always()
              run: |
                  sudo -u postgres /usr/lib/postgresql/${{ matrix.pg_version }}/bin/pg_ctl -D /tmp/pgdata stop || true

    test-python:
        name: Test Python Utility - PG${{ matrix.pg_version }}
        runs-on: ubuntu-latest
        needs: lint-and-build
        strategy:
            matrix:
                pg_version: [13, 14, 15, 16, 17, 18]
        steps:
            - name: Check out code
              uses: actions/checkout@v4

            - name: Set up Python
              uses: actions/setup-python@v5
              with:
                  python-version: '3.13'

            - name: Install PostgreSQL ${{ matrix.pg_version }}
              run: |
                  wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
                  echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
                  sudo apt-get update
                  sudo apt-get install -y postgresql-${{ matrix.pg_version }}

            - name: Install extension
              run: |
                  sudo make install PG_CONFIG=/usr/lib/postgresql/${{ matrix.pg_version }}/bin/pg_config

            - name: Initialize PostgreSQL
              run: |
                  sudo -u postgres /usr/lib/postgresql/${{ matrix.pg_version }}/bin/initdb -D /tmp/pgdata
                  sudo -u postgres tee -a /tmp/pgdata/postgresql.conf > /dev/null << 'EOF'
                  wal_level = logical
                  max_replication_slots = 4
                  max_wal_senders = 4
                  EOF
                  sudo -u postgres /usr/lib/postgresql/${{ matrix.pg_version }}/bin/pg_ctl -D /tmp/pgdata -l /tmp/postgres.log start

            - name: Wait for PostgreSQL
              run: |
                  for i in {1..30}; do
                      if sudo -u postgres /usr/lib/postgresql/${{ matrix.pg_version }}/bin/pg_isready -q; then
                          echo "PostgreSQL is ready"
                          break
                      fi
                      echo "Waiting for PostgreSQL... ($i/30)"
                      sleep 1
                  done

            - name: Create test database
              run: |
                  sudo -u postgres psql -c "CREATE DATABASE testdb;"
                  sudo -u postgres psql -d testdb -c "CREATE EXTENSION pg_statviz;"

            - name: Setup logical replication
              run: |
                  sudo -u postgres psql -c "CREATE DATABASE dummydb;"
                  # PG15+ supports FOR TABLES IN SCHEMA, older versions need explicit table list
                  if [ ${{ matrix.pg_version }} -ge 15 ]; then
                      sudo -u postgres psql -d testdb -c 'CREATE PUBLICATION dummy_pub FOR TABLES IN SCHEMA pgstatviz;'
                  else
                      sudo -u postgres psql -d testdb -c 'CREATE PUBLICATION dummy_pub FOR TABLE pgstatviz.snapshots, pgstatviz.buf, pgstatviz.conf, pgstatviz.conn, pgstatviz.db, pgstatviz.io, pgstatviz.lock, pgstatviz.repl, pgstatviz.slru, pgstatviz.wait, pgstatviz.wal;'
                  fi
                  sudo -u postgres psql -d dummydb -c "CREATE EXTENSION pg_statviz;"
                  sudo -u postgres psql -d testdb -c "SELECT pg_create_logical_replication_slot('dummy_sub', 'pgoutput');"
                  # PG16+ supports origin parameter
                  if [ ${{ matrix.pg_version }} -ge 16 ]; then
                      sudo -u postgres psql -d dummydb -c "CREATE SUBSCRIPTION dummy_sub CONNECTION 'dbname=testdb host=localhost' PUBLICATION dummy_pub WITH (copy_data = false, origin = none, create_slot = false);"
                  else
                      sudo -u postgres psql -d dummydb -c "CREATE SUBSCRIPTION dummy_sub CONNECTION 'dbname=testdb host=localhost' PUBLICATION dummy_pub WITH (copy_data = false, create_slot = false);"
                  fi

            - name: Take snapshots
              run: |
                  for i in {1..5}; do
                      sudo -u postgres psql -d testdb -c "SELECT pgstatviz.snapshot();"
                      sleep 2
                  done

            - name: Install Python package
              run: |
                  sudo pip install .

            - name: Test pg_statviz utility
              run: |
                  sudo -u postgres mkdir -p /tmp/output
                  pg_statviz --help
                  pg_statviz --version
                  sudo -u postgres pg_statviz -d testdb -O /tmp/output

            - name: Verify output files
              run: |
                  ls -lh /tmp/output/
                  if [ $(ls /tmp/output/*.png 2>/dev/null | wc -l) -lt 1 ]; then
                      echo "ERROR: No visualization files generated"
                      exit 1
                  fi
                  echo "✓ Visualization files generated"

            - name: Shutdown PostgreSQL
              if: always()
              run: |
                  sudo -u postgres /usr/lib/postgresql/${{ matrix.pg_version }}/bin/pg_ctl -D /tmp/pgdata stop || true