Merge branch 'ci' into 'master'

Add Gitlab CI

See merge request davical-project/davical!56
This commit is contained in:
Andrew Ruthven 2018-11-30 11:03:51 +00:00
commit 5effad3e80
9 changed files with 235 additions and 4 deletions

1
.gitignore vendored
View File

@ -25,6 +25,7 @@ random_crap
testing/tests/x-*
testing/tests/local
testing/timing.stats*
testing/report.xml
.sync-cache
.buildpath
.cvsignore

71
.gitlab-ci.yml Normal file
View File

@ -0,0 +1,71 @@
image: php:apache-stretch
build:
stage: build
script:
- apt-get -y update
- bash -c 'mkdir -p /usr/share/man/man{0..10}'
- apt-get -y install build-essential devscripts fakeroot dh-exec jdupes rst2pdf doxygen # todo build-dep instead, change this task's image to plain debian
- mv debian/changelog debian/changelog.old
- >
cat
<(echo "davical ($(cat VERSION)~git$(date +"%Y%m%d")-$(git rev-parse --short $CI_COMMIT_SHA)) unstable; urgency=medium")
<(echo "")
<(echo " * Build on CI")
<(echo "")
<(echo " -- ${GITLAB_USER_NAME} <${GITLAB_USER_EMAIL}> $(date -R)")
<(echo "")
debian/changelog.old
>debian/changelog
- rm debian/changelog.old
- debuild -us -uc -b -d
- 'mv ../davical_*_all.deb ./davical.deb'
artifacts:
paths:
- '*.deb'
test:
stage: test
artifacts:
paths:
- testing/report.xml
reports:
junit: testing/report.xml
when:
always
script:
- apt-get -y update
- bash -c 'mkdir -p /usr/share/man/man{0..10}'
- apt-get -y install locales
- echo "en_NZ.UTF-8 UTF-8" >> /etc/locale.gen
- locale-gen
- echo "LANG=en_NZ.UTF-8" > /etc/default/locale
- apt-get -y install libdbd-pg-perl libyaml-perl perl postgresql postgresql-client libpq-dev xmlstarlet
- curl 'https://gitlab.com/davical-project/awl/-/archive/master/awl-master.tar.gz' | tar zxf -
- mv awl-master /usr/share/awl/
- chown -R www-data /usr/share/awl/
- dpkg --ignore-depends=php,php-pgsql,php-xml,libawl-php,php-cli -i *.deb
- docker-php-ext-install -j$(nproc) pgsql
- docker-php-ext-install -j$(nproc) pdo_pgsql
- docker-php-ext-install -j$(nproc) calendar
- echo '127.0.1.1 regression mycaldav myempty' >> /etc/hosts
- cp testing/apache-site.conf.example /etc/apache2/sites-enabled/davical-regression.conf
- sed -i 's/\/path\/to/\/usr\/share/g' /etc/apache2/sites-enabled/davical-regression.conf
- mkdir /usr/share/davical/testing/
- cp testing/*.php /usr/share/davical/testing/
- rm /etc/davical/config.php
- cp testing/regression-conf.php.example /etc/davical/regression-conf.php
- ln -s /etc/davical/regression-conf.php /etc/davical/mycaldav-conf.php
- ln -s /etc/davical/regression-conf.php /etc/davical/myempty-conf.php
- sed -i '/peer/d' /etc/postgresql/9.6/main/pg_hba.conf
- echo 'local all all trust' >> /etc/postgresql/9.6/main/pg_hba.conf
- pg_ctlcluster 9.6 main start
- su postgres -c 'createuser davical_dba --createdb --createrole --superuser'
- su postgres -c 'createuser davical_app --superuser'
- su postgres -c 'createuser testrunner --superuser'
- pg_ctlcluster 9.6 main restart
- a2enmod rewrite
- apache2ctl start
- useradd testrunner
- cd testing && su testrunner -c 'IS_CI=yes ALLSUITES="regression-suite binding carddav" ./run_regressions.sh all x'

View File

@ -1534,7 +1534,7 @@ EOQRY;
*/
function DAV_AllProperties() {
if ( !isset($this->dead_properties) ) $this->FetchDeadProperties();
$allprop = array_merge( (isset($this->dead_properties)?$this->dead_properties:array()),
$allprop = array_merge( (isset($this->dead_properties)?array_keys($this->dead_properties):array()),
(isset($include_properties)?$include_properties:array()),
array(
'DAV::getcontenttype', 'DAV::resourcetype', 'DAV::getcontentlength', 'DAV::displayname', 'DAV::getlastmodified',

View File

@ -0,0 +1,28 @@
Listen 127.0.1.1:80
<VirtualHost 127.0.1.1:80>
ServerName regression
ServerAlias myempty mycaldav
DocumentRoot /path/to/davical/htdocs
CustomLog ${APACHE_LOG_DIR}/regression-access.log combined
ErrorLog ${APACHE_LOG_DIR}/regression-error.log
Alias /davical /path/to/davical/htdocs
<Directory /path/to/davical/htdocs>
Require all granted
DirectoryIndex index.php index.html
php_value include_path /path/to/awl/inc:/path/to/davical/testing
</Directory>
RewriteEngine On
# Redirect /.well-known URLs
RewriteRule ^/\.well-known/(.*)$ /caldav.php/.well-known/$1 [NC,L]
# and other special URLs
RewriteRule ^/principals/users/(.*)$ /caldav.php/$1 [NC,L]
RewriteRule ^/principals/resources/(.*)$ /caldav.php/$1 [NC,L]
RewriteRule ^/calendars/__uids__/(.*)$ /caldav.php/$1 [NC,L]
RewriteRule ^/addressbooks/__uids__/(.*)$ /caldav.php/$1 [NC,L]
# let caldav.php handle "anything else"
RewriteCond %{REQUEST_URI} !^/$
RewriteCond %{REQUEST_URI} !\.(php|css|png|gif|js|jpg|ico)
RewriteRule ^(.*)$ /caldav.php$1 [NC,L]
</VirtualHost>

View File

@ -0,0 +1,22 @@
<?php
$c->pg_connect[] = 'dbname=regression user=davical_app';
// use strict result ordering for regression testing only
$c->strict_result_ordering = true;
// PUT: 405 Method Not Allowed
$c->readonly_webdav_collections = false;
// fix ETag differences (CRLF) in 0218-Moz-REPORT and later
$c->hide_alarm = true;
// some freebusy queries will be 404 otherwise
$c->public_freebusy_url = true;
// helps with 1035-GET-mashup
$c->get_includes_subcollections = true;
// helps with 1036-REPORT-sync-initial-bound
$c->hide_TODO = false;
// for ischedule suite; also needs DKIM set up?
$c->enable_scheduling = true;
// enable for debugging, as needed
//$c->dbg['ALL'] = 1;
?>

View File

@ -0,0 +1,75 @@
setup_report() {
if [ ! -z "$IS_CI" ]; then
cat > "$REPORTFILE" <<EOHEADER
<?xml version="1.0" encoding="UTF-8"?>
<testsuites>
</testsuites>
EOHEADER
fi
}
report_test_success() {
if [ ! -z "$IS_CI" ]; then
SUITEPATH="/testsuites/testsuite[@name=\"$SUITE\"]"
xmlstarlet ed -L \
-s "$SUITEPATH" -t elem -n testcase \
-i "$SUITEPATH/testcase[not(@name)]" -t attr -n wip -v "1" \
-i "$SUITEPATH/testcase[@wip]" -t attr -n name -v "$TEST" \
-i "$SUITEPATH/testcase[@wip]" -t attr -n classname -v "$TEST" \
-i "$SUITEPATH/testcase[@wip]" -t attr -n timestamp -v "0" \
-d "$SUITEPATH/testcase[@wip]/@wip" \
"$REPORTFILE"
fi
}
report_test_failure() {
if [ ! -z "$IS_CI" ]; then
SUITEPATH="/testsuites/testsuite[@name=\"$SUITE\"]"
xmlstarlet ed -L \
-s "$SUITEPATH" -t elem -n testcase \
-i "$SUITEPATH/testcase[not(@name)]" -t attr -n wip -v "1" \
-i "$SUITEPATH/testcase[@wip]" -t attr -n name -v "$SUITE: $TEST" \
-i "$SUITEPATH/testcase[@wip]" -t attr -n classname -v "$TEST" \
-i "$SUITEPATH/testcase[@wip]" -t attr -n timestamp -v "0" \
-s "$SUITEPATH/testcase[@wip]" -t elem -n failure -v "xxxPERL_REPLACE_THIS_WITH_THE_ESCAPED_DIFFxxx" \
-i "$SUITEPATH/testcase[@wip]/failure" -t attr -n message -v "test failure" \
-d "$SUITEPATH/testcase[@wip]/@wip" \
"$REPORTFILE"
# I encountered a bug in xmlstarlet where small sections of large files are not properly escaped if inserted directly :/
perl -pi -e 'BEGIN {$diff = `xmlstarlet esc < "'"${REGRESSION}/diffs/${TEST}"'"`} s/xxxPERL_REPLACE_THIS_WITH_THE_ESCAPED_DIFFxxx/$diff/g' "$REPORTFILE"
fi
}
report_suite_setup() {
if [ ! -z "$IS_CI" ]; then
xmlstarlet ed -L \
-s '/testsuites' -t elem -n testsuite \
-i '/testsuites/testsuite[not(@name)]' -t attr -n name -v "$SUITE" \
-i '/testsuites/testsuite[not(@time)]' -t attr -n time -v "0" \
-i '/testsuites/testsuite[not(@errors)]' -t attr -n errors -v "0" \
-i '/testsuites/testsuite[not(@timestamp)]' -t attr -n timestamp -v "$(date -u +'%FT%TZ')" \
"$REPORTFILE"
fi
}
report_suite_counts() {
if [ ! -z "$IS_CI" ]; then
xmlstarlet ed -L \
-i "/testsuites/testsuite[@name=\"$SUITE\"]" -t attr -n tests -v "$(xmlstarlet sel -t -v "count(/testsuites/testsuite[@name=\"$SUITE\"]/testcase)" "$REPORTFILE")" \
-i "/testsuites/testsuite[@name=\"$SUITE\"]" -t attr -n failures -v "$(xmlstarlet sel -t -v "count(/testsuites/testsuite[@name=\"$SUITE\"]/testcase/failure)" "$REPORTFILE")" \
"$REPORTFILE"
fi
}
exit_based_on_reported_failures() {
if [ ! -z "$IS_CI" ]; then
FAILCOUNT="$(xmlstarlet sel -t -v "count(//failure)" "$REPORTFILE")"
if [ "$FAILCOUNT" -gt 0 ]; then
exit 2
else
exit 0
fi
fi
exit 0
}

View File

@ -12,6 +12,7 @@
DBNAME=regression
PGPOOL=inactive
HOSTNAME=mycaldav
REPORTFILE=report.xml
# We need to run the regression tests in the timezone they were written for.
export PGTZ=Pacific/Auckland
@ -49,6 +50,7 @@ ACCEPT_ALL=${2:-""}
# psql ${PSQLOPTS} -l
. ./regression_reporting.sh
check_result() {
TEST="$1"
@ -59,6 +61,7 @@ check_result() {
diff --text -u "${REGRESSION}/${TEST}.result" "${RESULTS}/${TEST}" >"${REGRESSION}/diffs/${TEST}"
if [ -s "${REGRESSION}/diffs/${TEST}" ] ; then
report_test_failure
if [ -z "$SKIPDIFF" ]; then
echo "======================================="
echo "Displaying diff for test ${TEST}"
@ -75,7 +78,7 @@ check_result() {
cp "${RESULTS}/${TEST}" "${REGRESSION}/${TEST}.result"
elif [ "${ACCEPT}" = "x" ]; then
echo "./dav_test --dsn '${DSN}' ${WEBHOST} ${ALTHOST} --suite '${SUITE}' --case '${TEST}' --debug"
exit
if [ -z "$IS_CI" ]; then exit 2; fi
elif [ "${ACCEPT}" = "v" ]; then
echo "Showing test $REGRESSION/${TEST}.test"
cat "$REGRESSION/${TEST}.test"
@ -107,6 +110,7 @@ check_result() {
return 1
fi
else
report_test_success
echo "Test ${TEST} passed OK!"
fi
return 0
@ -184,6 +188,8 @@ run_regression_suite() {
mkdir -p "${RESULTS}"
mkdir -p "${REGRESSION}/diffs"
report_suite_setup
if [ -f "${REGRESSION}/initial.dbdump" ]; then
restore_database
else
@ -217,6 +223,8 @@ run_regression_suite() {
TCOUNT="$(( ${TCOUNT} + 1 ))"
done
report_suite_counts
}
@ -224,6 +232,8 @@ run_regression_suite() {
TSTART="`date +%s`"
TCOUNT=0
setup_report
if [ "${SUITE}" = "all" ]; then
for SUITE in ${ALLSUITES} ; do
echo "Running $SUITE"
@ -241,3 +251,5 @@ fi
TFINISH="`date +%s`"
echo "Regression test run took $(( ${TFINISH} - ${TSTART} )) seconds for ${TCOUNT} tests."
exit_based_on_reported_failures

View File

@ -1,9 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
<multistatus xmlns="DAV:" xmlns:A="http://apple.com/ns/ical/" xmlns:C="urn:ietf:params:xml:ns:caldav" xmlns:D="urn:org:davical">
<response>
<href>/caldav.php/user1/home/</href>
<propstat>
<prop>
<A:calendar-color>#0252D4FF</A:calendar-color>
<A:calendar-order>1</A:calendar-order>
<C:schedule-default-calendar-URL>
<href>/caldav.php/user1/home/</href>
</C:schedule-default-calendar-URL>
<D:outer>
<D:middle>
<D:inner>inside</D:inner>
<D:inner>inside2</D:inner>
</D:middle>
</D:outer>
<getcontenttype>httpd/unix-directory</getcontenttype>
<resourcetype>
<collection/>

View File

@ -1,9 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
<multistatus xmlns="DAV:" xmlns:A="http://apple.com/ns/ical/" xmlns:C="urn:ietf:params:xml:ns:caldav" xmlns:D="urn:org:davical">
<response>
<href>/caldav.php/user1/home/</href>
<propstat>
<prop>
<A:calendar-color>#0252D4FF</A:calendar-color>
<A:calendar-order>1</A:calendar-order>
<C:schedule-default-calendar-URL>
<href>/caldav.php/user1/home/</href>
</C:schedule-default-calendar-URL>
<D:outer>
<D:middle>
<D:inner>inside</D:inner>
<D:inner>inside2</D:inner>
</D:middle>
</D:outer>
<getcontenttype>httpd/unix-directory</getcontenttype>
<resourcetype>
<collection/>