Skip to content

Commit 66a5254

Browse files
committed
meson: ci: test extensions
1 parent 3203147 commit 66a5254

File tree

3 files changed

+179
-0
lines changed

3 files changed

+179
-0
lines changed

.cirrus.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,35 @@ task:
378378
type: text/plain
379379

380380

381+
task:
382+
<<: *linux_opensuse_template
383+
384+
name: Linux - OpenSuse Tumbleweed Test Extensions (LLVM) - Meson
385+
386+
container:
387+
dockerfile: src/tools/ci/docker/linux_opensuse_tumbleweed_extension
388+
389+
configure_script:
390+
- su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs -Dllvm=enabled build'
391+
392+
build_script: su postgres -c 'ninja -C build'
393+
394+
install_script: ninja -C build install
395+
396+
dont_ask_sudo_pw_script:
397+
- echo "postgres ALL=(ALL:ALL) NOPASSWD: ALL" | tee /etc/sudoers.d/postgres
398+
399+
install_extensions_script: su postgres -c 'python3 src/tools/ci/test_extensions'
400+
401+
on_failure:
402+
<<: *on_failure
403+
404+
always:
405+
meson_log_artifacts:
406+
path: "build/meson-logs/*.txt"
407+
type: text/plain
408+
409+
381410
linux_rhel_template: &linux_rhel_template
382411
env:
383412
CPUS: 4
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
FROM opensuse/tumbleweed
2+
RUN \
3+
zypper -n clean -a && \
4+
zypper -n ref && \
5+
zypper -n dup && \
6+
zypper -n update && \
7+
zypper -n install \
8+
diffutils \
9+
git \
10+
icu \
11+
make \
12+
meson \
13+
perl-IPC-Run \
14+
shadow \
15+
systemd-devel \
16+
util-linux \
17+
\
18+
bison \
19+
ccache \
20+
clang \
21+
flex \
22+
gcc \
23+
gcc-c++ \
24+
gettext-runtime \
25+
ninja \
26+
\
27+
krb5-devel \
28+
libicu-devel \
29+
libldapcpp-devel \
30+
liblz4-devel \
31+
libopenssl-devel \
32+
libselinux-devel \
33+
libuuid-devel \
34+
libxml2-devel \
35+
libxslt-devel \
36+
libzstd-devel \
37+
llvm-devel \
38+
pam-devel \
39+
python38-devel \
40+
readline-devel \
41+
tcl-devel \
42+
\
43+
openldap2 \
44+
openldap2-client \
45+
\
46+
krb5-client \
47+
krb5-plugin-kdb-ldap \
48+
krb5-server \
49+
lz4 \
50+
zstd \
51+
\
52+
### packages needed by extensions ###
53+
sudo \
54+
\
55+
# pgbouncer
56+
libevent-devel \
57+
pandoc \
58+
\
59+
&& \
60+
zypper -n clean -a
61+
62+
# Fixing ICU errors caused by locale being set to 'POSIX'
63+
ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8

src/tools/ci/test_extensions

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#!/usr/bin/env python3
2+
3+
import os
4+
import shutil
5+
import subprocess
6+
import sys
7+
8+
tmp_dir = '/tmp'
9+
extension_dir = '/tmp/extension'
10+
extensions = []
11+
failed_extensions = []
12+
13+
# add pg_cron
14+
extensions.append(
15+
{
16+
'extension_name': 'pg_cron',
17+
'download': [
18+
['git', 'clone', 'https://github.com/citusdata/pg_cron.git', extension_dir],
19+
],
20+
'build': [
21+
['make'],
22+
['sudo', 'make', 'install']
23+
],
24+
'test': [
25+
['make', 'installcheck'],
26+
]
27+
}
28+
)
29+
30+
# add pgbouncer
31+
extensions.append(
32+
{
33+
'extension_name': 'pgbouncer',
34+
'download': [
35+
['git', 'clone', 'https://github.com/pgbouncer/pgbouncer.git', extension_dir],
36+
],
37+
'build': [
38+
['git', 'submodule', 'init'],
39+
['git', 'submodule', 'update'],
40+
['./autogen.sh'],
41+
['./configure', '--prefix=/usr/local'],
42+
['make'],
43+
['sudo', 'make', 'install']
44+
],
45+
'test': [
46+
['make', '-C', './test', 'all'],
47+
['make', '-C', './test', 'check']
48+
]
49+
}
50+
)
51+
52+
# if that function returns True, that means there is
53+
# error while running command
54+
def run_commands(extension, current_process, cwd=extension_dir) -> bool:
55+
if current_process in extension and extension[current_process]:
56+
print('\n\n### {} {} ###\n'.format(current_process, extension['extension_name']), flush=True)
57+
for command in extension[current_process]:
58+
result = subprocess.run(command, cwd=cwd,)
59+
if result.returncode:
60+
failed_extensions.append('`{}` is failed at step `{}`'
61+
.format(extension['extension_name'], current_process))
62+
return True
63+
else:
64+
print('\n\n### No {} found for {} ###\n'.format(current_process, extension['extension_name']), flush=True)
65+
return False
66+
67+
def clear_extension_dir():
68+
if os.path.exists(extension_dir) and os.path.isdir(extension_dir):
69+
print('### Clearing {} ###'.format(extension_dir), flush=True)
70+
shutil.rmtree(extension_dir)
71+
72+
for extension in extensions:
73+
print('\n\n##### {} #####\n'.format(extension['extension_name']), flush=True)
74+
75+
clear_extension_dir()
76+
77+
process_order = [['download', tmp_dir], ['build', extension_dir], ['test', extension_dir]]
78+
for process, cwd in process_order:
79+
if run_commands(extension, process, cwd):
80+
break
81+
82+
print('\n##### {} is completed #####\n\n'.format(extension['extension_name']), flush=True)
83+
84+
if failed_extensions:
85+
for failed_extension in failed_extensions:
86+
print(failed_extension)
87+
sys.exit('There are failed extensions')

0 commit comments

Comments
 (0)