Page MenuHomePhorge

No OneTemporary

Authored By
Unknown
Size
27 KB
Referenced Files
None
Subscribers
None
diff --git a/bin/build.sh b/bin/build.sh
index d3c86603..bed9af26 100755
--- a/bin/build.sh
+++ b/bin/build.sh
@@ -1,51 +1,79 @@
#!/bin/bash
set -e
-if [[ $1 == "--podman" ]]; then
- echo "Building with podman"
+podman__build() {
+ path=$1
shift
- podman build docker/swoole/ -t apheleia/swoole
- podman build docker/base/ -f almalinux9 -t apheleia/almalinux9
- podman build --ulimit nofile=65535:65535 docker/webapp -t kolab-webapp \
+ name=$1
+ shift
+ if [[ "$CACHE_REGISTRY" != "" ]]; then
+ CACHE_ARGS="--layers --cache-from=$CACHE_REGISTRY/$name --cache-to=$CACHE_REGISTRY/$name --cache-ttl=24h"
+ fi
+ podman build $@ $CACHE_ARGS $path -t $name
+}
+
+podman__build_base() {
+ podman__build docker/base/ apheleia/almalinux9 -f almalinux9
+ podman__build docker/swoole apheleia/swoole
+}
+
+podman__build_webapp() {
+ podman__build docker/webapp kolab-webapp --ulimit nofile=65535:65535 \
${KOLAB_GIT_REMOTE:+"--build-arg=GIT_REMOTE=$KOLAB_GIT_REMOTE"} \
${KOLAB_GIT_REF:+"--build-arg=GIT_REF=$KOLAB_GIT_REF"}
- podman build --ulimit nofile=65535:65535 docker/meet -t kolab-meet \
+}
+
+podman__build_meet() {
+ podman__build docker/webapp kolab-webapp --ulimit nofile=65535:65535 \
${KOLAB_GIT_REMOTE:+"--build-arg=GIT_REMOTE=$KOLAB_GIT_REMOTE"} \
${KOLAB_GIT_REF:+"--build-arg=GIT_REF=$KOLAB_GIT_REF"}
- podman build docker/postfix -t kolab-postfix
- podman build docker/imap -t kolab-imap
- podman build docker/amavis -t kolab-amavis
- podman build docker/collabora -t kolab-collabora --build-arg=REPOSITORY="https://www.collaboraoffice.com/repos/CollaboraOnline/23.05-CODE/CODE-rpm/"
- podman build docker/mariadb -t mariadb
- podman build docker/redis -t redis
- podman build docker/proxy -t kolab-proxy
- podman build docker/coturn -t kolab-coturn
- podman build docker/utils -t kolab-utils
- podman build docker/fluentbit -t fluentbit
+}
- podman build --ulimit nofile=65535:65535 docker/roundcube -t roundcube \
+podman__build_roundcube() {
+ podman__build docker/roundcube roundcube --ulimit nofile=65535:65535 \
${GIT_REMOTE_ROUNDCUBEMAIL:+"--build-arg=GIT_REMOTE_ROUNDCUBEMAIL=$GIT_REMOTE_ROUNDCUBEMAIL"} \
${GIT_REF_ROUNDCUBEMAIL:+"--build-arg=GIT_REF_ROUNDCUBEMAIL=$GIT_REF_ROUNDCUBEMAIL"} \
${GIT_REMOTE_ROUNDCUBEMAIL_PLUGINS:+"--build-arg=GIT_REMOTE_ROUNDCUBEMAIL_PLUGINS=$GIT_REMOTE_ROUNDCUBEMAIL_PLUGINS"} \
${GIT_REF_ROUNDCUBEMAIL_PLUGINS:+"--build-arg=GIT_REF_ROUNDCUBEMAIL_PLUGINS=$GIT_REF_ROUNDCUBEMAIL_PLUGINS"} \
${GIT_REMOTE_CHWALA:+"--build-arg=GIT_REMOTE_CHWALA=$GIT_REMOTE_CHWALA"} \
${GIT_REF_CHWALA:+"--build-arg=GIT_REF_CHWALA=$GIT_REF_CHWALA"} \
${GIT_REMOTE_SYNCROTON:+"--build-arg=GIT_REMOTE_SYNCROTON=$GIT_REMOTE_SYNCROTON"} \
${GIT_REF_SYNCROTON:+"--build-arg=GIT_REF_SYNCROTON=$GIT_REF_SYNCROTON"} \
${GIT_REMOTE_AUTOCONF:+"--build-arg=GIT_REMOTE_AUTOCONF=$GIT_REMOTE_AUTOCONF"} \
${GIT_REF_AUTOCONF:+"--build-arg=GIT_REF_AUTOCONF=$GIT_REF_AUTOCONF"} \
${GIT_REMOTE_IRONY:+"--build-arg=GIT_REMOTE_IRONY=$GIT_REMOTE_IRONY"} \
${GIT_REF_IRONY:+"--build-arg=GIT_REF_IRONY=$GIT_REF_IRONY"} \
${GIT_REMOTE_FREEBUSY:+"--build-arg=GIT_REMOTE_FREEBUSY=$GIT_REMOTE_FREEBUSY"} \
${GIT_REF_FREEBUSY:+"--build-arg=GIT_REF_FREEBUSY=$GIT_REF_FREEBUSY"}
+}
+
+if [[ $1 == "--podman" ]]; then
+ echo "Building with podman"
+ shift
+ podman__build_base
+ podman__build_webapp
+ podman__build_meet
+ podman build docker/postfix -t kolab-postfix
+ podman build docker/imap -t kolab-imap
+ ${IMAP_GIT_REMOTE:+"--build-arg=GIT_REMOTE=$IMAP_GIT_REMOTE"} \
+ ${IMAP_GIT_REF:+"--build-arg=GIT_REF=$IMAP_GIT_REF"}
+ podman build docker/amavis -t kolab-amavis
+ podman build docker/collabora -t kolab-collabora --build-arg=REPOSITORY="https://www.collaboraoffice.com/repos/CollaboraOnline/23.05-CODE/CODE-rpm/"
+ podman build docker/mariadb -t mariadb
+ podman build docker/redis -t redis
+ podman build docker/proxy -t kolab-proxy
+ podman build docker/coturn -t kolab-coturn
+ podman build docker/utils -t kolab-utils
+ podman build docker/fluentbit -t fluentbit
+ podman__build_roundcube
else
echo "Building with docker compose"
# Workaround because docker-compose doesn't know build dependencies, so we build the dependencies first
# (It does respect depends_on, but we don't actually want the dependencies started, so....)
docker compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.build.yml build $@ almalinux9
docker compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.build.yml build $@ swoole
docker compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.build.yml build $@ webapp
docker compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.build.yml build $@
fi
diff --git a/ci/testctl b/ci/testctl
index 7f098ac4..8f444200 100755
--- a/ci/testctl
+++ b/ci/testctl
@@ -1,511 +1,478 @@
#!/bin/bash
base_dir="$(dirname $(realpath "$0"))"
pushd "${base_dir}"
pushd ..
set -e
set -x
PASSPORT_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----
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
bakhie7hJBP7BoOup+dD5NQPlXBQ434=
-----END PRIVATE KEY-----"
PASSPORT_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEApmHkae115z3vMF9IjiUa
XrJH1Ljifxqs+XbDCFhQenz2iOf/bZDBMqfrwhBe3hVywa13kIuhf1TZlcJ/nRhE
IZIbg6BF6/GeHN998Cx/IjhBeFkG7f1hdxEXY5ibd7yq8vAfzizZpnCu4+LM/NvI
ei9mU+hj3GxrDbpMQTHCDDqX5aNEix8uFU4XaOm9UOJw9ivz19cqcnxWqJ49znxw
XUlS5k4Hewbwf2s2BWFhz+CDWPHMpWViLQ17qj5QRklNn39sUymP1kXKP3Y76zvW
zNVniPvFt+hHixxEa7tUEaTdtk4FgkNnWy0bFa7DIPC8ukjHvHHg10LeQiygDduI
xbdVJwYK/qitU68ZAbbufldlj2FoVLwSyP9qpxUIdRoljCop1kDu6xQiAq0VHEAV
LtgMpZhtD/6D4z644QJ8atx4Ljp/HEtTngaTh+/vLc9AnhHclX0/JmlbP1VkWWxG
9FIxS0TVPolRBs8948kLioTif9lrltJicxd6T0OuA5fny8l6hdSlzaD3pnr5pkYw
mVn5FgBAFnd/skX6DsRs+eb2lNahkvNZZ15z9UeU2Rl6J9uBx0vbkcB7eiSCPhRM
IKq/CtkyEgz8ce4kG18fJHDFDASRvGjaBu91lV5h7NLmhFLFzMvb7XoHrv/yD6TV
E5W47J/DrfrevJkzS1GV++MCAwEAAQ==
-----END PUBLIC KEY-----"
-KOLAB_GIT_REF=master
-KOLAB_GIT_REMOTE=https://git.kolab.org/source/kolab
-GIT_REF_ROUNDCUBEMAIL=dev/kolab-1.5
-GIT_REMOTE_ROUNDCUBEMAIL=https://git.kolab.org/source/roundcubemail.git
-GIT_REF_ROUNDCUBEMAIL_PLUGINS=master
-GIT_REMOTE_ROUNDCUBEMAIL_PLUGINS=https://git.kolab.org/diffusion/RPK/roundcubemail-plugins-kolab.git
-GIT_REF_CHWALA=master
-GIT_REMOTE_CHWALA=https://git.kolab.org/diffusion/C/chwala.git
-GIT_REF_SYNCROTON=master
-GIT_REMOTE_SYNCROTON=https://git.kolab.org/diffusion/S/syncroton.git
-GIT_REF_AUTOCONF=master
-GIT_REMOTE_AUTOCONF=https://git.kolab.org/diffusion/AC/autoconf.git
-GIT_REF_IRONY=master
-GIT_REMOTE_IRONY=https://git.kolab.org/source/iRony.git
-GIT_REF_FREEBUSY=master
-GIT_REMOTE_FREEBUSY=https://git.kolab.org/diffusion/F/freebusy.git
-IMAP_GIT_REF=dev/kolab-3.6
-IMAP_GIT_REMOTE=https://git.kolab.org/source/cyrus-imapd
PODMAN="podman"
# Teardown the currently running environment
kolab__teardown() {
$PODMAN pod rm --force tests
$PODMAN pod rm --force dev
}
-podman__build() {
- path=$1
- shift
- name=$1
- shift
- if [[ "$CACHE_REGISTRY" != "" ]]; then
- CACHE_ARGS="--layers --cache-from=$CACHE_REGISTRY/$name --cache-to=$CACHE_REGISTRY/$name --cache-ttl=24h"
- fi
- $PODMAN build $@ $CACHE_ARGS $path -t $name
-}
# Build all containers required for testing
kolab__build() {
- podman__build docker/base/ apheleia/almalinux9 -f almalinux9
- podman__build docker/swoole apheleia/swoole
-
- podman__build docker/webapp kolab-webapp --ulimit nofile=65535:65535 \
- ${KOLAB_GIT_REMOTE:+"--build-arg=GIT_REMOTE=$KOLAB_GIT_REMOTE"} \
- ${KOLAB_GIT_REF:+"--build-arg=GIT_REF=$KOLAB_GIT_REF"}
- podman__build docker/meet kolab-meet --ulimit nofile=65535:65535 \
- ${KOLAB_GIT_REMOTE:+"--build-arg=GIT_REMOTE=$KOLAB_GIT_REMOTE"} \
- ${KOLAB_GIT_REF:+"--build-arg=GIT_REF=$KOLAB_GIT_REF"}
+ source ../bin/build.sh
+ podman__build_base
+ podman__build_webapp
+ podman__build_meet
podman__build docker/imap kolab-imap
podman__build docker/mariadb mariadb
podman__build docker/redis redis
podman__build docker/proxy kolab-proxy
podman__build docker/tests kolab-tests --ulimit nofile=65535:65535
- podman__build docker/roundcube roundcube --ulimit nofile=65535:65535
+ podman__build_roundcube
env CERT_DIR=ci/certs APP_DOMAIN=kolab.local bin/regen-certs
}
# Setup the test environment
kolab__setup() {
echo "Build"
kolab__build
echo "Setup"
POD=tests
# Create the pod first
$PODMAN pod create --replace --name $POD
podman__run_mariadb
podman__run_redis
podman__healthcheck $POD-mariadb $POD-redis
podman__run_webapp config.demo
podman__healthcheck $POD-webapp
podman__run_imap
podman__healthcheck $POD-imap
# Ensure all commands are processed
echo "Flushing work queue"
$PODMAN exec -ti $POD-webapp ./artisan queue:work --stop-when-empty
podman__run_minio
podman__healthcheck $POD-minio
# Validate the test environment
kolab__validate $POD
}
# "testsuite"
# "quicktest"
# "tests/Feature/Jobs/WalletCheckTest.php"
kolab__test() {
POD=tests
$PODMAN run -ti --pod tests --name $POD-kolab-tests --replace \
--env-file=ci/env \
-v ./src:/src/kolabsrc.orig:ro \
-e APP_SERVICES_DOMAINS="localhost" \
-e PASSPORT_PRIVATE_KEY="$PASSPORT_PRIVATE_KEY" \
-e PASSPORT_PUBLIC_KEY="$PASSPORT_PUBLIC_KEY" \
-e APP_URL="http://kolab.local" \
-e APP_PUBLIC_URL="http://kolab.local" \
-e APP_HEADER_CSP="" \
-e APP_HEADER_XFO="" \
-e ASSET_URL="http://kolab.local" \
-e MEET_SERVER_URLS="http://kolab.local/meetmedia/api/" \
kolab-tests:latest /init.sh $@
}
kolab__proxytest() {
$PODMAN run -ti --pod tests --name $POD-proxy-tests --replace \
-v ./ci/certs/:/etc/certs/:ro \
--env-file=ci/env \
-e SSL_CERTIFICATE=/etc/certs/imap.hosted.com.cert \
-e SSL_CERTIFICATE_KEY=/etc/certs/imap.hosted.com.key \
kolab-proxy:latest /init.sh validate
}
kolab__lint() {
kolab__test lint
}
# Setup the test environment and run a complete testsuite
kolab__testrun() {
echo "Setup"
kolab__setup
echo "Test"
kolab__test testsuite
}
# Setup the test environment and run all testsuites
kolab__testrun_complete() {
echo "Setup"
kolab__setup
echo "Test"
kolab__test lint
kolab__test testsuite
kolab__rctest syncroton lint
kolab__rctest syncroton testsuite
kolab__rctest irony lint
# kolab__rctest irony testsuite
kolab__rctest roundcubemail-plugins-kolab lint
# kolab__rctest roundcubemail-plugins-kolab testsuite
}
# Get a shell inside the test container to run/debug tests
kolab__shell() {
kolab__test shell
}
# Run the roundcube testsuite
kolab__rctest() {
$PODMAN run -t --pod tests --name $POD-roundcube --replace \
-v ./ext:/src.orig:ro \
-e APP_DOMAIN=kolab.local \
-e DES_KEY=kBxUM/53N9p9abusAoT0ZEAxwI2pxFz/ \
-e DB_HOST=127.0.0.1 \
-e DB_RC_DATABASE=roundcube \
-e DB_RC_USERNAME=roundcube \
-e DB_RC_PASSWORD=simple123 \
-e IMAP_HOST=localhost \
-e IMAP_PORT=11143 \
-e IMAP_ADMIN_LOGIN=cyrus-admin \
-e IMAP_ADMIN_PASSWORD=simple123 \
-e IMAP_DEBUG=false \
-e SQL_DEBUG=false \
-e ACTIVESYNC_DEBUG=false \
-e RUN_MIGRATIONS=true \
-e MAIL_HOST=localhost \
-e MAIL_PORT=10587 \
-e FILEAPI_WOPI_OFFICE=https://kolab.local \
-e CALENDAR_CALDAV_SERVER=http://imap:11080/dav \
-e KOLAB_ADDRESSBOOK_CARDDAV_SERVER=http://imap:11080/dav \
roundcube:latest ./init.sh $@
}
# Get a shell inside the roundcube test container to run/debug tests
kolab__rcshell() {
$PODMAN run -ti --pod tests --name $POD-roundcube --replace \
-v ./ext:/src.orig:ro \
-e APP_DOMAIN=kolab.local \
-e DES_KEY=kBxUM/53N9p9abusAoT0ZEAxwI2pxFz/ \
-e DB_HOST=127.0.0.1 \
-e DB_RC_DATABASE=roundcube \
-e DB_RC_USERNAME=roundcube \
-e DB_RC_PASSWORD=simple123 \
-e IMAP_HOST=localhost \
-e IMAP_PORT=11143 \
-e IMAP_ADMIN_LOGIN=cyrus-admin \
-e IMAP_ADMIN_PASSWORD=simple123 \
-e MAIL_HOST=localhost \
-e MAIL_PORT=10587 \
-e FILEAPI_WOPI_OFFICE=https://kolab.local \
-e CALENDAR_CALDAV_SERVER=http://localhost:11080/dav \
-e KOLAB_ADDRESSBOOK_CARDDAV_SERVER=http://localhost:11080/dav \
roundcube:latest ./init.sh shell
}
kolab__validate() {
POD=$1
$PODMAN exec $POD-imap testsaslauthd -u cyrus-admin -p simple123
$PODMAN exec $POD-imap testsaslauthd -u "john@kolab.org" -p simple123
# Ensure the inbox is created
FOUND=false
for i in {1..60}; do
if $PODMAN exec $POD-imap bash -c 'echo "lm" | cyradm --auth PLAIN -u cyrus-admin -w simple123 --port 11143 localhost | grep "user/john@kolab.org"'; then
echo "Found mailbox";
FOUND=true
break
else
echo "Waiting for mailbox";
sleep 1;
fi
done
if ! $FOUND; then
echo "Failed to find the inbox for john@kolab.org"
exit 1
fi
}
podman__healthcheck() {
for CONTAINER in $@; do
echo "Waiting for ${CONTAINER} become healthy "
while [ $(podman healthcheck run ${CONTAINER}) ]; do
echo -n "."; sleep 5;
done
done
}
podman__run_proxy() {
$PODMAN run -dt --pod $POD --name $POD-proxy --replace \
-v ./ci/certs:/etc/certs:ro \
-e APP_WEBSITE_DOMAIN="kolab.local" \
-e SSL_CERTIFICATE="/etc/certs/imap.hosted.com.cert" \
-e SSL_CERTIFICATE_KEY="/etc/certs/imap.hosted.com.key" \
-e WEBAPP_BACKEND="http://localhost:8000" \
-e MEET_BACKEND="https://localhost:12443" \
-e ROUNDCUBE_BACKEND="http://localhost:8080" \
-e DAV_BACKEND="http://localhost:11080/dav" \
-e COLLABORA_BACKEND="http://localhost:9980" \
kolab-proxy:latest
}
podman__run_roundcube() {
$PODMAN run -dt --pod $POD --name $POD-roundcube --replace \
-v ./ext:/src.orig:ro \
-e APP_DOMAIN=kolab.local \
-e DES_KEY=kBxUM/53N9p9abusAoT0ZEAxwI2pxFz/ \
-e DB_HOST=127.0.0.1 \
-e DB_RC_DATABASE=roundcube \
-e DB_RC_USERNAME=roundcube \
-e DB_RC_PASSWORD=simple123 \
-e IMAP_HOST=localhost \
-e IMAP_PORT=11143 \
-e IMAP_ADMIN_LOGIN=cyrus-admin \
-e IMAP_ADMIN_PASSWORD=simple123 \
-e MAIL_HOST=localhost \
-e MAIL_PORT=10587 \
-e IMAP_DEBUG=true \
-e FILEAPI_WOPI_OFFICE=https://kolab.local \
-e CALENDAR_CALDAV_SERVER=http://imap:11080/dav \
-e KOLAB_ADDRESSBOOK_CARDDAV_SERVER=http://imap:11080/dav \
roundcube:latest
}
podman__run_mariadb() {
$PODMAN run -dt --pod $POD --name $POD-mariadb --replace \
--mount=type=tmpfs,tmpfs-size=512M,destination=/var/lib/mysql,U=true \
-e MYSQL_ROOT_PASSWORD=simple123 \
-e TZ="+02:00" \
-e DB_HKCCP_DATABASE=kolabdev \
-e DB_HKCCP_USERNAME=kolabdev \
-e DB_HKCCP_PASSWORD=simple123 \
-e DB_KOLAB_DATABASE=kolab \
-e DB_KOLAB_USERNAME=kolab \
-e DB_KOLAB_PASSWORD=simple123 \
-e DB_RC_DATABASE=roundcube \
-e DB_RC_USERNAME=roundcube \
-e DB_RC_PASSWORD=simple123 \
--health-cmd "mysqladmin -u root ping && test -e /tmp/initialized" \
mariadb:latest
}
podman__run_redis() {
$PODMAN run -dt --pod $POD --name $POD-redis --replace \
--mount=type=tmpfs,tmpfs-size=128M,destination=/var/lib/redis,U=true \
--health-cmd "redis-cli ping || exit 1" \
redis:latest
}
podman__run_minio() {
$PODMAN run -dt --pod $POD --name $POD-minio --replace \
--mount=type=tmpfs,tmpfs-size=128M,destination=/data,U=true \
-e MINIO_ROOT_USER=minio \
-e MINIO_ROOT_PASSWORD=simple123 \
--health-cmd "mc ready local || exit 1" \
--entrypoint sh \
quay.io/minio/minio:latest -c 'mkdir -p /data/kolab && minio server /data --console-address ":9001"'
}
podman__run_webapp() {
# We run with a fixed config.demo overlay and override the environment with ci/env
$PODMAN run -dt --pod $POD --name $POD-webapp --replace \
--env-file=ci/env \
-v ./src:/src/kolabsrc.orig:ro \
-v ./$1/src:/src/overlay:ro \
-e NOENVFILE=true \
-e APP_SERVICES_ALLOWED_DOMAINS="webapp,localhost,services.kolab.local" \
-e KOLAB_ROLE=combined \
-e PASSPORT_PRIVATE_KEY="$PASSPORT_PRIVATE_KEY" \
-e PASSPORT_PUBLIC_KEY="$PASSPORT_PUBLIC_KEY" \
--health-cmd "./artisan octane:status || exit 1" \
kolab-webapp:latest
}
podman__run_imap() {
$PODMAN run -dt --pod $POD --name $POD-imap --replace \
--mount=type=tmpfs,tmpfs-size=128M,tmpfs-mode=777,destination=/var/spool/imap,U=true,notmpcopyup \
--mount=type=tmpfs,tmpfs-size=128M,tmpfs-mode=777,destination=/var/lib/imap,U=true,notmpcopyup \
-e APP_SERVICES_DOMAIN="localhost" \
-e SERVICES_PORT=8000 \
-e IMAP_ADMIN_LOGIN=cyrus-admin \
-e IMAP_ADMIN_PASSWORD=simple123 \
--health-cmd "test -e /run/saslauthd/mux && kill -0 \$(cat /var/run/master.pid)" \
kolab-imap:latest
}
podman__run_meet() {
$PODMAN run -dt --pod $POD --name $POD-meet --replace \
-v ./meet/server:/src/meet:ro \
-v ./ci/certs/meet.kolab.local.cert:/etc/pki/tls/certs/meet.kolab.local.cert \
-v ./ci/certs/meet.kolab.local.key:/etc/pki/tls/private/meet.kolab.local.key \
-e WEBRTC_LISTEN_IP=127.0.0.1 \
-e WEBRTC_ANNOUNCED_ADDRESS=127.0.0.1 \
-e PUBLIC_DOMAIN=kolab.local \
-e LISTENING_HOST=127.0.0.1 \
-e LISTENING_PORT=12443 \
-e DEBUG="*" \
-e TURN_SERVER=none \
-e AUTH_TOKEN=simple123 \
-e WEBHOOK_TOKEN=simple123 \
-e WEBHOOK_URL=kolab.local/api/webhooks/meet \
-e SSL_CERT=/etc/pki/tls/certs/meet.kolab.local.cert \
-e SSL_KEY=/etc/pki/tls/private/meet.kolab.local.key \
kolab-meet:latest
}
kolab__deploy() {
POD=dev
# Create the pod first
$PODMAN pod create \
--replace \
--add-host=kolab.local:127.0.0.1 \
--publish "443:6443" \
--publish "465:6465" \
--publish "587:6587" \
--publish "143:6143" \
--publish "993:6993" \
--publish "44444:44444/udp" \
--publish "44444:44444/tcp" \
--name $POD
podman__run_mariadb
podman__run_redis
podman__healthcheck $POD-mariadb $POD-redis
podman__run_webapp config.prod
podman__healthcheck $POD-webapp
podman__run_imap
podman__healthcheck $POD-imap
# Ensure all commands are processed
echo "Flushing work queue"
$PODMAN exec -ti $POD-webapp ./artisan queue:work --stop-when-empty
$PODMAN exec $POD-webapp ./artisan user:password "admin@kolab.local" "simple123"
podman__run_minio
podman__healthcheck $POD-minio
podman__run_meet
podman__run_roundcube
podman__run_proxy
}
kolab__generate_mail() {
$PODMAN run --pod=dev -t --rm kolab-utils:latest ./generatemail.py --maxAttachmentSize=3 --type=mail --count 100 --username admin@kolab.local --password simple123 --host localhost --port 11143 INBOX
}
kolab__syncroton_sync() {
$PODMAN run -t --network=host --add-host=kolab.local:127.0.0.1 --rm kolab-utils:latest ./activesynccli.py --host kolab.local --user admin@kolab.local --password simple123 sync 38b950ebd62cd9a66929c89615d0fc04
}
kolab__db() {
POD=dev
$PODMAN exec -ti $POD-mariadb /bin/bash -c "mysql -h 127.0.0.1 -u kolabdev --password=simple123 kolabdev"
}
kolab__help() {
cat <<EOF
This is the kolab test execution utility.
This script manages building the containers, setting up a test environment, and executing the tests in that environment, using podman.
To run the kolab 4 testsuite:
testctl testrun
The following commands are available:
setup: Build containers and setup the test pod
test: Run tests (pass testsuite/quicktest or a path to a test starting with tests/ as argument)
rctest: Run tests roundcube testsuite (WIP)
shell: Get a shell in the test container
testrun: Setup & test in one command, suitable as one shot command to run the main tests.
deploy: Setup a test environment
EOF
}
cmdname=$1
shift
# make sure we actually *did* get passed a valid function name
if declare -f "kolab__$cmdname" >/dev/null 2>&1; then
"kolab__$cmdname" "${@:1}"
else
echo "Function $cmdname not recognized" >&2
kolab__help
exit 1
fi
diff --git a/docker/ci/init.sh b/docker/ci/init.sh
index 0a645b98..c032d924 100755
--- a/docker/ci/init.sh
+++ b/docker/ci/init.sh
@@ -1,59 +1,95 @@
#!/bin/bash
-if [[ "$CACHE_REGISTRY" != "" ]]; then
- cat <<EOF >> /etc/containers/registries.conf
-[[registry]]
-prefix = "$CACHE_REGISTRY"
-insecure = true
-location = "$CACHE_REGISTRY"
-EOF
-fi
-
function check_success() {
if [[ "$1" == "0" ]]; then
echo "1";
else
echo "0";
fi;
}
function checkout() {
if [ ! -d "$1" ]; then
git clone "$2" "$1" || exit
pushd "$1" || exit
git checkout "$3" || exit
popd || exit
fi
}
+function pin_commit() {
+ git ls-remote --exit-code -h "$1" "refs/heads/$2" | awk '{print $1}'
+}
+
+if [[ "$CACHE_REGISTRY" != "" ]]; then
+ cat <<EOF >> /etc/containers/registries.conf
+[[registry]]
+prefix = "$CACHE_REGISTRY"
+insecure = true
+location = "$CACHE_REGISTRY"
+EOF
+fi
+
+# This is the code that we are going to test
checkout kolab "$GIT_REMOTE" "$GIT_REF"
pushd kolab || exit
+
+# This are the pinned commits that are going to be used for the base images
+export KOLAB_GIT_REMOTE=https://git.kolab.org/source/kolab
+export KOLAB_GIT_REF=$(pin_commit "$KOLAB_GIT_REMOTE" "dev/mollekopf")
+
+export GIT_REMOTE_ROUNDCUBEMAIL=https://git.kolab.org/source/roundcubemail.git
+export GIT_REF_ROUNDCUBEMAIL=$(pin_commit "$GIT_REMOTE_ROUNDCUBEMAIL" "dev/kolab-1.5")
+
+export GIT_REMOTE_ROUNDCUBEMAIL_PLUGINS=https://git.kolab.org/diffusion/RPK/roundcubemail-plugins-kolab.git
+export GIT_REF_ROUNDCUBEMAIL_PLUGINS=$(pin_commit "$GIT_REMOTE_ROUNDCUBEMAIL_PLUGINS" "master")
+
+export GIT_REMOTE_CHWALA=https://git.kolab.org/diffusion/C/chwala.git
+export GIT_REF_CHWALA=$(pin_commit "$GIT_REMOTE_CHWALA" "dev/mollekopf")
+
+export GIT_REMOTE_SYNCROTON=https://git.kolab.org/diffusion/S/syncroton.git
+export GIT_REF_SYNCROTON=$(pin_commit "$GIT_REMOTE_SYNCROTON" "master")
+
+export GIT_REMOTE_AUTOCONF=https://git.kolab.org/diffusion/AC/autoconf.git
+export GIT_REF_AUTOCONF=$(pin_commit "$GIT_REMOTE_AUTOCONF" "master")
+
+export GIT_REMOTE_IRONY=https://git.kolab.org/source/iRony.git
+export GIT_REF_IRONY=$(pin_commit "$GIT_REMOTE_IRONY" "master")
+
+export GIT_REMOTE_FREEBUSY=https://git.kolab.org/diffusion/F/freebusy.git
+export GIT_REF_FREEBUSY=$(pin_commit "$GIT_REMOTE_FREEBUSY" "master")
+
+export IMAP_GIT_REMOTE=https://git.kolab.org/source/cyrus-imapd
+export IMAP_GIT_REF=$(pin_commit "$GIT_REMOTE_FREEBUSY" "dev/kolab-3.6")
+
+# Execute
ci/testctl build
BUILD_RESULT=$(check_success $?)
ci/testctl lint
LINT_RESULT=$(check_success $?)
ci/testctl testrun
TESTRUN_RESULT=$(check_success $?)
+# Publish test results
if [[ "$PROMETHEUS_PUSHGATEWAY" != "" ]]; then
EPOCH=$(date +"%s")
METRICS=$(
cat <<EOF
kolab_ci_timestamp $EPOCH
# HELP kolab_ci_testsuite Displays whether or not the testsuite passed
# TYPE kolab_ci_testsuite gauge
kolab_ci_testsuite{host="$HOSTNAME", testsuite="build"} $BUILD_RESULT
kolab_ci_testsuite{host="$HOSTNAME", testsuite="lint"} $LINT_RESULT
kolab_ci_testsuite{host="$HOSTNAME", testsuite="testrun"} $TESTRUN_RESULT
EOF
)
echo "Pushing result to $PROMETHEUS_PUSHGATEWAY"
echo "$METRICS"
echo "$METRICS" | curl -k --data-binary @- "$PROMETHEUS_PUSHGATEWAY"
fi
if [[ $TESTRUN_RESULT != "1" || $BUILD_RESULT != "1" || $LINT_RESULT != "1" ]]; then
exit 1
fi

File Metadata

Mime Type
text/x-diff
Expires
Sat, Apr 4, 4:17 AM (1 d, 21 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18821321
Default Alt Text
(27 KB)

Event Timeline