Skip to content

Commit c6588f6

Browse files
committed
WIP
1 parent e9c5c0d commit c6588f6

File tree

4 files changed

+63
-1
lines changed

4 files changed

+63
-1
lines changed

.github/workflows/ci.yaml

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@ jobs:
6060
popd
6161
6262
ansible:
63+
strategy:
64+
matrix:
65+
db_backup:
66+
# Clean install
67+
- ''
68+
# Restore a database backup
69+
- 'testdata/xsnippet-api_20241003-030004.pgc'
70+
6371
runs-on: ubuntu-latest
6472
steps:
6573
- uses: actions/checkout@v4
@@ -96,8 +104,28 @@ jobs:
96104
97105
- name: Run the playbook
98106
run: |
107+
read -r -d '' extra_vars << 'EOF' || true
108+
{
109+
"volume_device": "${{ steps.volume-device.outputs.uri }}",
110+
"postgres_users": [
111+
{
112+
"database": "{{ xsnippet_api_user }}",
113+
"username": "{{ xsnippet_api_user }}",
114+
"backup_schedule": "*-*-* 3:00:00",
115+
"backup_restore": "${{ matrix.db_backup }}"
116+
}
117+
]
118+
}
119+
EOF
120+
99121
ansible-playbook \
100122
-vvv \
101-
-e volume_device="${{ steps.volume-device.outputs.uri }}" \
123+
-e "${extra_vars}" \
102124
--inventory inventories/ci \
103125
site.yml
126+
127+
- name: Verify that the database backup has been restored correctly
128+
if: matrix.db_backup != ''
129+
run: |
130+
# Expect at least one full page of results
131+
test "$(curl http://127.0.0.1:8080/v1/snippets | jq length)" == "20"

roles/postgres/meta/main.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ argument_specs:
2828
description: |
2929
The time of when database backups should be triggered. Uses the systemd calendar event expression syntax (see man 7 systemd.time).
3030
If not set, backups will not be created.
31+
backup_restore:
32+
type: str
33+
required: false
34+
description: |
35+
Path to a database backup to be restored.
3136
default: []
3237
description: |
3338
The list of database/username pairs to create.

roles/postgres/tasks/main.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,35 @@
5757
become: true
5858
become_user: postgres
5959

60+
- name: Create a temporary backup directory
61+
ansible.builtin.tempfile:
62+
state: directory
63+
suffix: backup
64+
register: backup_tmp_dir
65+
become: true
66+
become_user: postgres
67+
68+
- name: Copy the database backup
69+
ansible.builtin.copy:
70+
src: "{{ item.backup_restore }}"
71+
dest: "{{ [backup_tmp_dir.path, item.backup_restore | basename] | path_join }}"
72+
mode: 'u=rw,g=r,o='
73+
with_items: "{{ postgres_users }}"
74+
when: item.backup_restore is defined and item.backup_restore
75+
become: true
76+
become_user: postgres
77+
78+
- name: Restore the database backup
79+
community.postgresql.postgresql_db:
80+
name: "{{ item.database }}"
81+
state: "restore"
82+
target: "{{ [backup_tmp_dir.path, item.backup_restore | basename] | path_join }}"
83+
target_opts: "--single-transaction --exit-on-error"
84+
with_items: "{{ postgres_users }}"
85+
when: item.backup_restore is defined and item.backup_restore
86+
become: true
87+
become_user: postgres
88+
6089
- name: Install the script for backup rotation
6190
ansible.builtin.copy:
6291
src: 'rotate.py'
11.7 KB
Binary file not shown.

0 commit comments

Comments
 (0)