Skip to content

Commit 3f0e471

Browse files
committed
Add freeBSD support in CI
Signed-off-by: Arshdeep54 <balarsh535@gmail.com>
1 parent 0a9b3d8 commit 3f0e471

2 files changed

Lines changed: 177 additions & 28 deletions

File tree

.github/workflows/ci.yml

Lines changed: 92 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ on:
55
branches:
66
- main
77
- 0.15.x
8+
- freeBSD-citest
89
pull_request:
910
branches:
1011
- main
@@ -157,4 +158,94 @@ jobs:
157158
/tmp/*.log
158159
retention-days: 7
159160

160-
161+
build-freebsd:
162+
runs-on: ubuntu-latest
163+
name: FreeBSD Build and Test
164+
strategy:
165+
matrix:
166+
compiler: [clang]
167+
build_type: [Debug, Release]
168+
fail-fast: false
169+
170+
steps:
171+
- uses: actions/checkout@v4
172+
- name: Install QEMU dependencies
173+
run: |
174+
sudo apt-get update
175+
sudo apt-get install -y \
176+
qemu-system-x86 \
177+
qemu-utils \
178+
libvirt-daemon-system \
179+
libvirt-clients \
180+
bridge-utils
181+
sudo systemctl start libvirtd
182+
183+
- name: Setup FreeBSD VM
184+
uses: vmactions/freebsd-vm@v1
185+
id: freebsd-vm
186+
with:
187+
release: "14.2"
188+
usesh: true
189+
envs: "PATH,GITHUB_ENV,GITHUB_WORKSPACE,RUNNER_USER"
190+
mem: 6144
191+
sync: rsync
192+
copyback: true
193+
prepare: |
194+
# System bootstrap
195+
ASSUME_ALWAYS_YES=yes pkg bootstrap
196+
pkg update
197+
pkg upgrade -y
198+
199+
# Base dependencies
200+
pkg install -y \
201+
bash \
202+
sudo \
203+
libev \
204+
cmake \
205+
llvm11 \
206+
postgresql17-server \
207+
postgresql17-contrib \
208+
zstd \
209+
liblz4 \
210+
bzip2 \
211+
libssh \
212+
libarchive \
213+
check \
214+
py311-docutils \
215+
curl \
216+
doxygen \
217+
hs-pandoc \
218+
texlive-base \
219+
texlive-texmf \
220+
graphviz
221+
222+
- name: Build Project
223+
shell: freebsd {0}
224+
run: |
225+
mkdir -p $GITHUB_WORKSPACE/build
226+
cd $GITHUB_WORKSPACE/build
227+
cmake -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} "$GITHUB_WORKSPACE"
228+
make -j$(sysctl -n hw.ncpu)
229+
230+
231+
- name: Debug Testsuite Path
232+
shell: freebsd {0}
233+
run: |
234+
cd "${GITHUB_WORKSPACE}/build"
235+
bash ./testsuite.sh
236+
237+
- name: Clean Testsuite
238+
shell: freebsd {0}
239+
run: |
240+
cd ${GITHUB_WORKSPACE}/build
241+
bash ./testsuite.sh clean
242+
243+
- name: Upload Build Artifacts
244+
if: always()
245+
uses: actions/upload-artifact@v4
246+
with:
247+
name: freebsd-${{ matrix.compiler }}-${{ matrix.build_type }}-logs
248+
path: |
249+
$GITHUB_WORKSPACE/build/log/*
250+
/tmp/*.log
251+
retention-days: 7

test/testsuite.sh

Lines changed: 85 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,20 @@ RESTORE_DIRECTORY=$PGMONETA_OPERATION_DIR/restore
5454
BACKUP_DIRECTORY=$PGMONETA_OPERATION_DIR/backup
5555
CONFIGURATION_DIRECTORY=$PGMONETA_OPERATION_DIR/conf
5656

57+
PSQL_USER=$USER
58+
if [ "$OS" = "FreeBSD" ]; then
59+
PSQL_USER=postgres
60+
fi
61+
5762
########################### UTILS ############################
5863
is_port_in_use() {
5964
local port=$1
6065
if [[ "$OS" == "Linux" ]]; then
6166
ss -tuln | grep $port >/dev/null 2>&1
6267
elif [[ "$OS" == "Darwin" ]]; then
6368
lsof -i:$port >/dev/null 2>&1
69+
elif [[ "$OS" == "FreeBSD" ]]; then
70+
sockstat -4 -l | grep $port >/dev/null 2>&1
6471
fi
6572
return $?
6673
}
@@ -97,10 +104,10 @@ wait_for_server_ready() {
97104
}
98105

99106
function sed_i() {
100-
if [[ "$OS" == "Darwin" ]]; then
101-
sed -i '' "$@"
107+
if [[ "$OS" == "Darwin" || "$OS" == "FreeBSD" ]]; then
108+
sed -i '' -E "$@"
102109
else
103-
sed -i "$@"
110+
sed -i -E "$@"
104111
fi
105112
}
106113

@@ -127,6 +134,22 @@ check_pg_ctl() {
127134
fi
128135
}
129136

137+
stop_pgctl(){
138+
if [[ "$OS" == "FreeBSD" ]]; then
139+
su - postgres -c "$PGCTL_PATH -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop"
140+
else
141+
pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
142+
fi
143+
}
144+
145+
run_as_postgres() {
146+
if [[ "$OS" == "FreeBSD" ]]; then
147+
su - postgres -c "$*"
148+
else
149+
eval "$@"
150+
fi
151+
}
152+
130153
check_psql() {
131154
if which psql >/dev/null 2>&1; then
132155
echo "check psql in path ... ok"
@@ -188,9 +211,39 @@ initialize_log_files() {
188211
create_cluster() {
189212
local port=$1
190213
echo -e "\e[34mInitializing Cluster \e[0m"
191-
initdb -k -D $DATA_DIRECTORY 2>/dev/null
214+
215+
if [ "$OS" = "FreeBSD" ]; then
216+
mkdir -p "$POSTGRES_OPERATION_DIR"
217+
mkdir -p "$DATA_DIRECTORY"
218+
mkdir -p $BACKUP_DIRECTORY
219+
if ! pw user show postgres >/dev/null 2>&1; then
220+
pw groupadd -n postgres -g 770
221+
pw useradd -n postgres -u 770 -g postgres -d /var/db/postgres -s /bin/sh
222+
fi
223+
chown postgres:postgres $PGCTL_LOG_FILE
224+
chown -R postgres:postgres "$DATA_DIRECTORY"
225+
chown -R postgres:postgres $CONFIGURATION_DIRECTORY
226+
chown -R postgres:postgres $PGMONETA_LOG_FILE
227+
chown -R postgres:postgres $BACKUP_DIRECTORY
228+
229+
fi
230+
231+
echo $DATA_DIRECTORY
232+
233+
INITDB_PATH=$(command -v initdb)
234+
235+
if [ -z "$INITDB_PATH" ]; then
236+
echo "Error: initdb not found!" >&2
237+
exit 1
238+
fi
239+
run_as_postgres "$INITDB_PATH -k -D $DATA_DIRECTORY"
240+
echo "initdb exit code: $?"
241+
echo "initialize database ... ok"
192242
set +e
193-
error_out=$(sed_i "s/^#\s*password_encryption\s*=\s*\(md5\|scram-sha-256\)/password_encryption = scram-sha-256/" $DATA_DIRECTORY/postgresql.conf 2>&1)
243+
echo "setting postgresql.conf"
244+
245+
error_out=$(sed_i "s/^#[[:space:]]*password_encryption[[:space:]]*=[[:space:]]*(md5|scram-sha-256)/password_encryption = scram-sha-256/" "$DATA_DIRECTORY/postgresql.conf" 2>&1)
246+
194247
if [ $? -ne 0 ]; then
195248
echo "setting password_encryption ... $error_out"
196249
clean
@@ -310,7 +363,12 @@ initialize_hba_configuration() {
310363
initialize_cluster() {
311364
echo -e "\e[34mInitializing Cluster \e[0m"
312365
set +e
313-
pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE start
366+
PGCTL_PATH=$(command -v pg_ctl)
367+
if [ -z "$PGCTL_PATH" ]; then
368+
echo "Error: pg_ctl not found!" >&2
369+
exit 1
370+
fi
371+
run_as_postgres "$PGCTL_PATH -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE start"
314372
if [ $? -ne 0 ]; then
315373
clean
316374
exit 1
@@ -323,44 +381,44 @@ initialize_cluster() {
323381
clean
324382
exit 1
325383
fi
326-
err_out=$(psql -h /tmp -p $PORT -U $USER -d postgres -c "CREATE ROLE repl WITH LOGIN REPLICATION PASSWORD '$PGPASSWORD';" 2>&1)
384+
err_out=$(psql -h /tmp -p $PORT -U $PSQL_USER -d postgres -c "CREATE ROLE repl WITH LOGIN REPLICATION PASSWORD '$PGPASSWORD';" 2>&1)
327385
if [ $? -ne 0 ]; then
328386
echo "create role repl ... $err_out"
329-
pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
387+
stop_pgctl
330388
clean
331389
exit 1
332390
else
333391
echo "create role repl ... ok"
334392
fi
335-
err_out=$(psql -h /tmp -p $PORT -U $USER -d postgres -c "SELECT pg_create_physical_replication_slot('repl', true, false);" 2>&1)
393+
err_out=$(psql -h /tmp -p $PORT -U $PSQL_USER -d postgres -c "SELECT pg_create_physical_replication_slot('repl', true, false);" 2>&1)
336394
if [ $? -ne 0 ]; then
337395
echo "create replication slot for repl ... $err_out"
338-
pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
396+
stop_pgctl
339397
clean
340398
exit 1
341399
else
342400
echo "create replication slot for repl ... ok"
343401
fi
344-
err_out=$(psql -h /tmp -p $PORT -U $USER -d postgres -c "CREATE USER myuser WITH PASSWORD '$PGPASSWORD';" 2>&1)
402+
err_out=$(psql -h /tmp -p $PORT -U $PSQL_USER -d postgres -c "CREATE USER myuser WITH PASSWORD '$PGPASSWORD';" 2>&1)
345403
if [ $? -ne 0 ]; then
346404
echo "create user myuser ... $err_out"
347-
pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
405+
stop_pgctl
348406
clean
349407
exit 1
350408
else
351409
echo "create user myuser ... ok"
352410
fi
353-
err_out=$(psql -h /tmp -p $PORT -U $USER -d postgres -c "CREATE DATABASE mydb WITH OWNER myuser ENCODING 'UTF8';" 2>&1)
411+
err_out=$(psql -h /tmp -p $PORT -U $PSQL_USER -d postgres -c "CREATE DATABASE mydb WITH OWNER myuser ENCODING 'UTF8';" 2>&1)
354412
if [ $? -ne 0 ]; then
355413
echo "create database mydb with owner myuser ... $err_out"
356-
pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
414+
stop_pgctl
357415
clean
358416
exit 1
359417
else
360418
echo "create database mydb with owner myuser ... ok"
361419
fi
362420
set -e
363-
pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
421+
stop_pgctl
364422
echo ""
365423
}
366424

@@ -425,54 +483,54 @@ user = repl
425483
wal_slot = repl
426484
EOF
427485
echo "add test configuration to pgmoneta.conf ... ok"
428-
$EXECUTABLE_DIRECTORY/pgmoneta-admin master-key -P $PGPASSWORD || true
429-
$EXECUTABLE_DIRECTORY/pgmoneta-admin -f $CONFIGURATION_DIRECTORY/pgmoneta_users.conf -U repl -P $PGPASSWORD user add
486+
run_as_postgres "$EXECUTABLE_DIRECTORY/pgmoneta-admin -f $CONFIGURATION_DIRECTORY/pgmoneta_users.conf -U repl -P $PGPASSWORD user add"
430487
echo "add user repl to pgmoneta_users.conf file ... ok"
431488
echo ""
432489
}
433490

434491
execute_testcases() {
435492
echo -e "\e[34mExecute Testcases \e[0m"
436493
set +e
437-
pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE start
494+
run_as_postgres "pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE start"
438495
pg_isready -h localhost -p $PORT
439496
if [ $? -eq 0 ]; then
440497
echo "postgres server accepting requests ... ok"
441498
else
442499
echo "postgres server is not accepting response ... not ok"
443-
pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
500+
stop_pgctl
444501
clean
445502
exit 1
446503
fi
447504
echo "starting pgmoneta server in daemon mode"
448-
$EXECUTABLE_DIRECTORY/pgmoneta -c $CONFIGURATION_DIRECTORY/pgmoneta.conf -u $CONFIGURATION_DIRECTORY/pgmoneta_users.conf -d
505+
run_as_postgres "$EXECUTABLE_DIRECTORY/pgmoneta -c $CONFIGURATION_DIRECTORY/pgmoneta.conf -u $CONFIGURATION_DIRECTORY/pgmoneta_users.conf -d"
449506
wait_for_server_ready
450507
if [ $? -ne 0 ]; then
451-
pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
508+
echo "pgmoneta server not ready ... not ok"
509+
stop_pgctl
452510
clean
453511
exit 1
454512
fi
455-
$EXECUTABLE_DIRECTORY/pgmoneta-cli -c $CONFIGURATION_DIRECTORY/pgmoneta.conf ping
513+
run_as_postgres "$EXECUTABLE_DIRECTORY/pgmoneta-cli -c $CONFIGURATION_DIRECTORY/pgmoneta.conf ping"
456514
if [ $? -eq 0 ]; then
457515
echo "pgmoneta server started ... ok"
458516
else
459517
echo "pgmoneta server not started ... not ok"
460-
pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
518+
stop_pgctl
461519
clean
462520
exit 1
463521
fi
464522
### RUN TESTCASES ###
465523
$TEST_DIRECTORY/pgmoneta_test $PROJECT_DIRECTORY
466524
if [ $? -ne 0 ]; then
467-
$EXECUTABLE_DIRECTORY/pgmoneta-cli -c $CONFIGURATION_DIRECTORY/pgmoneta.conf shutdown
468-
pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
525+
run_as_postgres "$EXECUTABLE_DIRECTORY/pgmoneta-cli -c $CONFIGURATION_DIRECTORY/pgmoneta.conf shutdown"
526+
stop_pgctl
469527
clean
470528
exit 1
471529
fi
472530
echo "running shutdown cli command"
473-
$EXECUTABLE_DIRECTORY/pgmoneta-cli -c $CONFIGURATION_DIRECTORY/pgmoneta.conf shutdown
531+
run_as_postgres "$EXECUTABLE_DIRECTORY/pgmoneta-cli -c $CONFIGURATION_DIRECTORY/pgmoneta.conf shutdown"
474532
echo "shutdown pgmoneta server ... ok"
475-
pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
533+
stop_pgctl
476534
set -e
477535
echo ""
478536
}

0 commit comments

Comments
 (0)