summaryrefslogtreecommitdiffstats
path: root/debian/salsa-ci.yml
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--debian/salsa-ci.yml956
1 files changed, 956 insertions, 0 deletions
diff --git a/debian/salsa-ci.yml b/debian/salsa-ci.yml
new file mode 100644
index 00000000..d4ff17f8
--- /dev/null
+++ b/debian/salsa-ci.yml
@@ -0,0 +1,956 @@
+---
+# Include Salsa-CI as a base
+include:
+ - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
+ - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
+
+# Override Salsa-CI with MariaDB specific variations
+variables:
+ BUILT_PACKAGES: "libmariadb-dev libmariadb-dev-compat libmariadb3 libmariadbd19 libmariadbd-dev mariadb-common mariadb-client mariadb-server mariadb-backup mariadb-plugin-connect mariadb-plugin-s3 mariadb-plugin-rocksdb mariadb-plugin-oqgraph mariadb-plugin-mroonga mariadb-plugin-spider mariadb-plugin-cracklib-password-check mariadb-test mariadb-test-data"
+ DEB_BUILD_OPTIONS: "nocheck noautodbgsym"
+ RELEASE: sid
+ # Reprotest works, but takes very long time and often fails due to timeouts.
+ # Thus is is best kept disabled and only occasionally manually enabled to
+ # test that reproducibility works, along with atomic reprotest to directly
+ # pinpoint what aspect of the build is broken if not reproducible.
+ SALSA_CI_DISABLE_REPROTEST: 1
+ SALSA_CI_ENABLE_ATOMIC_REPROTEST: 0
+ SALSA_CI_DISABLE_MISSING_BREAKS: 0
+ SALSA_CI_DISABLE_RC_BUGS: 0
+
+# Extend Salsa-CI build jobs to have longer timeout as the default GitLab
+# timeout (1h) is often not enough
+.build-package:
+ timeout: 3h
+
+stages:
+ - provisioning
+ - build
+ - test
+ - upgrade MariaDB
+ - upgrade MariaDB and distro
+ - upgrade MariaDB variant
+ - test extras
+ - publish # Stage referenced by Salsa-CI template aptly stanza, so must exist even though not used
+
+gnitpick:
+ stage: provisioning
+ image: debian:sid-slim
+ script: |
+ # Bare minimal (<4MB) for apt-key and gnitpick to work
+ apt-get update -qq && apt-get -qq install --no-install-recommends --yes ca-certificates curl python3-minimal git
+ curl -sS https://raw.githubusercontent.com/Seravo/gnitpick/master/gnitpick.py -o /usr/bin/gnitpick; chmod +x /usr/bin/gnitpick
+ # Actual Gnitpick part
+ gnitpick --target-repository https://salsa.debian.org/mariadb-team/mariadb-server.git --target-branch debian/latest
+ except:
+ variables:
+ - $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
+ allow_failure: true # Gnitpick does not fully support this branch naming scheme so ignore it for now
+
+packaging-fix-checks:
+ stage: provisioning
+ image: debian:sid-slim
+ script:
+ - apt-get update -qq && apt-get -qq install --no-install-recommends --yes git devscripts python3-debian shellcheck make lsb-release
+ - |
+ if [ "$(find debian/patches/ -type f -not -name series | wc -l)" -eq "$(cat debian/patches/series | wc -l)" ]
+ then
+ echo "The directory debian/patches/ contents and debian/patches/series file match by count."
+ else
+ find debian/patches -type f -not -name series -printf "%P\n" | sort > /tmp/patches-directory-sorted
+ sort debian/patches/series > /tmp/patches-series-sorted
+ diff -y /tmp/patches-series-sorted /tmp/patches-directory-sorted
+ echo
+ echo "The directory debian/patches/ file count does not match that in debian/series. Check that there are no unaccounted patches!"
+ exit 1
+ fi
+ - |
+ wrap-and-sort -a
+ git checkout debian/tests/control # Revert touching this file, wrap-and-sort shouldn't do it
+ if [ "$(git diff --name-only | wc -l)" -eq 0 ]
+ then
+ echo "No uncommitted changes after 'wrap-and-sort -av', maintainer has done good job keeping files in order."
+ else
+ git diff
+ echo
+ echo "Debian packaging files are unordered! Please run 'wrap-and-sort -av'."
+ exit 1
+ fi
+ # Print syntax errors if found, otherwise continue silently
+ - make --dry-run --makefile=debian/rules > /dev/null
+ - |
+ shellcheck -x --shell=sh $(grep -Irnw debian/ -e '^#!.*/sh' | sort -u |cut -d ':' -f 1 | xargs)
+ shellcheck -x --shell=bash $(grep -Irnw debian/ -e '^#!.*/bash' | sort -u |cut -d ':' -f 1 | xargs)
+ except:
+ variables:
+ - $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
+
+build bullseye-backports:
+ extends: .build-package
+ variables:
+ RELEASE: bullseye-backports
+
+# Buster only has libfmt 6.1 but 7.0 is required, so backport build for Buster
+# is not possible unless somebody packages libfmt7-dev for Buster.
+
+test-crossbuild-arm64:
+ stage: build
+
+autopkgtest:
+ extends: .test-autopkgtest
+ artifacts:
+ reports:
+ junit: ${WORKING_DIR}/debci/artifacts/mysql-test-run-junit.xml
+
+piuparts:
+ stage: test extras
+
+blhc:
+ stage: test extras
+
+# In addition to Salsa-CI, also run these fully MariaDB specific build jobs
+
+# Define snippets used to construct jobs
+
+.test-prepare-container: &test-prepare-container |
+ cd ${WORKING_DIR} # Don't repeat this step, it's just cd ./debian/output
+ # Enable automatic restarts from maint scripts
+ sed -i "s/101/0/g" -i /usr/sbin/policy-rc.d
+ # Fake /sbin/runlevel to avoid warnings of "invoke-rc.d: could not determine current runlevel"
+ echo -e '#!/bin/sh\necho "N 5"' > /sbin/runlevel; chmod +x /sbin/runlevel
+ # Avoid the warnings of "debconf: unable to initialize frontend: Dialog"
+ echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
+ # Emit non-zero exit code also on warnings
+ echo 'APT::Update::Error-Mode "any";' > /etc/apt/apt.conf.d/non-zero-exit-on-warnings
+ # Prime the apt cache so later apt commands can run
+ apt-get update -qq
+
+# Readline was removed from Debian Sid (and Bullseye) in Feb 2021. To be able to install older
+# versions of MariaDB that depend on it, fetch and install it from Buster.
+.test-install-readline-in-sid-for-backwards-compat: &test-install-readline-in-sid-for-backwards-compat |
+ curl -sS -O https://snapshot.debian.org/archive/debian/20190316T031117Z/pool/main/r/readline5/libreadline5_5.2%2Bdfsg-3%2Bb13_amd64.deb
+ apt-get -qq install --no-install-recommends --yes ./libreadline5_5.2%2Bdfsg-3%2Bb13_amd64.deb
+
+# OpenSSL 1.1 was Debian Sid in Dec 2022 (as Bookworm will ship with OpenSSL 3.0
+# only). To be able to install versions of MariaDB that depend on OpenSSL 1.1,
+# fetch and install it manually.
+.test-install-openssl1-in-sid-for-backwards-compat: &test-install-openssl1-in-sid-for-backwards-compat |
+ curl -sS -O https://snapshot.debian.org/archive/debian/20220507T034236Z/pool/main/o/openssl/libssl1.1_1.1.1o-1_amd64.deb
+ apt-get -qq install --no-install-recommends --yes ./libssl1.1_1.1.1o-1_amd64.deb
+
+.test-verify-initial: &test-verify-initial |
+ dpkg -l | grep -iE 'maria|mysql|galera' || true # List installed
+ # MariaDB until 10.5 only had 'mysql', and since only 'mariadb', so try both
+ service mysql status || service mariadb status
+ mysql --skip-column-names -e "select @@version, @@version_comment" # Show version
+ mysql --table -e "SHOW DATABASES;" # List databases before upgrade
+ mysql --table -e "SELECT host,user,plugin,authentication_string FROM user;" mysql
+ mysql --table -e "SELECT * FROM plugin;" mysql
+ mysql --table -e "SHOW PLUGINS;" mysql
+
+.test-enable-sid-repos: &test-enable-sid-repos
+ # Apply usrmerge workaround for Stretch/Buster/Bullseye to Bookworm/Sid upgrades
+ - echo 'this system will not be supported in the future' > /etc/unsupported-skip-usrmerge-conversion
+ # Replace any old repos with just Sid
+ - echo 'deb http://deb.debian.org/debian sid main' > /etc/apt/sources.list
+ # Upgrade minimal stack first
+ - apt-get update -qq
+ # Next step will fail on https://bugs.debian.org/993755
+ # /usr/bin/perl: error while loading shared libraries: libcrypt.so.1: cannot
+ # open shared object file: No such file or directory
+ # dpkg: error processing package libc6:amd64 (--configure):
+ - apt-get install -y apt || true
+ # Apply workaround
+ - cd $(mktemp -d) # Use temp dir where apt can download and unpack files
+ - apt-get -y download libcrypt1
+ - dpkg-deb -x libcrypt1_*.deb .
+ - cp -ra lib/* /lib/ || true # libcryp1 < 1:4.4.36-3
+ - cp -ra usr/lib/* /lib/ || true # libxcrypt 1:4.4.36-3+
+ - cd - # Back to /builds/$USER/mariadb-server/debian/output
+ - find /lib/*/libcrypt.* -ls # Show that new libcrypt is there
+ - apt-get -y --fix-broken install
+ # Complete upgrade of minimal stack
+ - apt-get install -y apt
+
+.test-enable-bullseye-backports-repos: &test-enable-bullseye-backports-repos |
+ # Enable bullseye-backports (assumes environment already Debian Bullseye)
+ echo 'deb http://deb.debian.org/debian bullseye-backports main' > /etc/apt/sources.list.d/bullseye-backports.list
+ # Increase default backports priority policy from '100' to '500' so it can actually be used
+ cat << EOF > /etc/apt/preferences.d/enable-backports-to-satisfy-dependencies
+ Package: *
+ Pin: release n=bullseye-*
+ Pin-Priority: 500
+ EOF
+ apt-get update -qq
+
+.test-enable-artifacts-repo: &test-enable-artifacts-repo |
+ apt-get install -y apt-utils
+ apt-ftparchive packages . > Packages
+ echo "deb [trusted=yes] file:$(pwd) ./" > /etc/apt/sources.list.d/mariadb-local.list
+ apt-get update
+
+.test-install-all: &test-install-all
+ - *test-enable-artifacts-repo
+ - apt-get install -yq ${BUILT_PACKAGES}
+ # Verify installation of MariaDB built in this commit
+ - mariadb --version
+ - dpkg -l | grep -iE 'maria|mysql|galera'
+ - find /etc -name '*mariadb*' -ls -or -name '*mysql*' -ls | sort -k 11
+ # Purge old versions if they exist
+ - apt-get purge -y mariadb*10.?
+ - find /etc -name '*mariadb*' -ls -or -name '*mysql*' -ls | sort -k 11
+
+.test-full-upgrade: &test-full-upgrade
+ - *test-enable-artifacts-repo
+ - apt-get full-upgrade -y
+ # Verify installation of MariaDB built in this commit
+ - mariadb --version
+ - dpkg -l | grep -iE 'maria|mysql|galera'
+ - find /etc -name '*mariadb*' -ls -or -name '*mysql*' -ls | sort -k 11
+ # Purge old versions if they exist
+ - apt-get purge -y mariadb*10.?
+ - find /etc -name '*mariadb*' -ls -or -name '*mysql*' -ls | sort -k 11
+ # Purging the old server might stop the running server, so restart it just in case
+ - service mariadb restart
+
+.test-install-all-libs: &test-install-all-libs
+ - *test-enable-artifacts-repo
+ - apt-get install -yq --no-install-recommends libmariadb-dev-compat libmariadbd-dev
+ # Installs 31 packages, including:
+ # libmariadb3 libmariadb-dev libmariadb-dev-compat libmariadbd19 libmariadbd-dev
+
+.test-full-upgrade-libs: &test-full-upgrade-libs
+ - *test-enable-artifacts-repo
+ - apt-get full-upgrade -y
+ - dpkg -l | grep -iE 'maria|mysql|galera'
+ # library tests don't have the mariadb client nor server, so don't check them
+
+.test-verify-final: &test-verify-final |
+ mkdir -p debug # Ensure dir exists before using it
+ find /var/lib/mysql -ls > debug/var-lib-mysql.list || true # Ignore errors about "no such file or directory"
+ cp -ra /etc/mysql debug/etc-mysql
+ mariadb --skip-column-names -e "select @@version, @@version_comment" # Show version
+ mariadb --table -e "SHOW DATABASES;" # List databases
+ mariadb --table -e "SELECT host,user,plugin,authentication_string FROM user;" mysql
+ mariadb --table -e "SELECT * FROM plugin;" mysql
+ mariadb --table -e "SHOW PLUGINS;" mysql
+ # Test that InnoDB works and that command 'mysql' is also still usable
+ mysql -e "CREATE DATABASE test; USE test; CREATE TABLE t(a INT PRIMARY KEY) ENGINE=INNODB; INSERT INTO t VALUEs (1); SELECT * FROM t; DROP TABLE t; DROP DATABASE test;"
+
+.test-verify-libs: &test-verify-libs
+ # Don't use a collapsed command as Gitlab-CI would hide each command from the output
+ - ldconfig -p | grep -e mariadb -e mysql
+ - pkg-config --list-all
+ - pkg-config --cflags --libs mysqlclient
+ - pkg-config --cflags --libs libmariadb
+ - pkg-config --cflags --libs mariadb
+ - apt-get install -y --no-install-recommends g++
+ - |
+ # Build a test binary that depends on libmysqlclient
+ cat > b933063.cpp <<EOF
+ #include <iostream>
+ #include <mysql/mysql.h>
+ #include <stdexcept>
+ int main()
+ {
+ MYSQL h;
+ if (!mysql_init(&h)
+ || mysql_options(&h, MYSQL_READ_DEFAULT_GROUP, "")
+ // || mysql_options(&h, MYSQL_SET_CHARSET_NAME, "utf8mb4")
+ || !mysql_real_connect(&h, "", "", NULL, "", 0, NULL, 0))
+ throw std::runtime_error(mysql_error(&h));
+ std::string q = "show variables like '%char%'";
+ if (mysql_real_query(&h, q.data(), q.size()))
+ throw std::runtime_error(mysql_error(&h));
+ MYSQL_RES* result = mysql_store_result(&h);
+ if (!result && mysql_errno(&h))
+ throw std::runtime_error(mysql_error(&h));
+ while (MYSQL_ROW row = mysql_fetch_row(result))
+ {
+ std::cout << row[0] << ": " << row[1] << "\n";
+ }
+ return 0;
+ }
+ EOF
+ apt-get install -y ./*.deb # Server must be installed for client to connect
+ echo "Testing -l mysqlclient"
+ g++ b933063.cpp -l mysqlclient && ./a.out | tee result
+ if grep --quiet latin result; then echo "ERROR: Charset latin found!"; exit 1; fi
+ echo "Testing -l mariadbclient"
+ g++ b933063.cpp -l mariadbclient && ./a.out | tee result
+ if grep --quiet latin result; then echo "ERROR: Charset latin found!"; exit 1; fi
+ - |
+ # Build a test binary to verify API version strings
+ cat > b1031863.cpp <<EOF
+ #include <cstring>
+ #include <iostream>
+ #include <mysql/mysql.h>
+ using namespace std;
+
+ void test_if_starts_with(const string expected, const string tested, const string name) {
+ int r = strncmp(tested.c_str(), expected.c_str(), expected.size());
+ if (r == 0) {
+ cout << name << ": " << tested << "\n";
+ } else {
+ cout << "ERROR: " << name << " started with " << tested << " instead of the expected " << expected << "!\n";
+ exit(1);
+ }
+ }
+
+ int main()
+ {
+ MYSQL h;
+ // Constants refer to server version
+ test_if_starts_with("1011", to_string(MARIADB_VERSION_ID), "MARIADB_VERSION_ID");
+ test_if_starts_with("1011", to_string(MYSQL_VERSION_ID), "MYSQL_VERSION_ID");
+ // Client ABI returns connector version
+ test_if_starts_with("303", to_string(mysql_get_client_version()), "mysql_get_client_version()");
+ test_if_starts_with("3.3", mysql_get_client_info(), "mysql_get_client_info()");
+ return 0;
+ }
+ EOF
+ g++ b1031863.cpp -l mysqlclient && ./a.out
+
+
+.salsa-ci-template-for-mariadb:
+ stage: test
+ needs:
+ - job: build
+ image: debian:${RELEASE}
+ artifacts:
+ when: always
+ name: "$CI_BUILD_NAME"
+ paths:
+ - ${WORKING_DIR}/debug
+ script:
+ - echo "This script section must be overridden in each test" && exit 1
+ variables:
+ GIT_STRATEGY: none
+ except:
+ variables:
+ - $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
+
+.salsa-ci-template-for-mariadb-upgrade:
+ stage: test
+ needs:
+ - job: build
+ image: debian:${RELEASE}
+ artifacts:
+ when: always
+ name: "$CI_BUILD_NAME"
+ paths:
+ - ${WORKING_DIR}/debug
+ before_script:
+ - *test-prepare-container
+ - apt-get -qq install --no-install-recommends --yes ca-certificates curl
+ - |
+ [[ -d /etc/apt/keyrings ]] || mkdir /etc/apt/keyrings
+ curl -sS https://mariadb.org/mariadb_release_signing_key.pgp -o /etc/apt/keyrings/mariadb-keyring.pgp
+ cat >/etc/apt/sources.list.d/mariadb.sources <<EOF
+ X-Repolib-Name: MariaDB
+ Types: deb
+ URIs: https://archive.mariadb.org/mariadb-${MARIADB_VERSION}/repo/debian
+ Suites: ${RELEASE}
+ Components: main
+ Signed-By: /etc/apt/keyrings/mariadb-keyring.pgp
+ EOF
+ - apt-get update -qq
+ script:
+ - echo "This script section must be overridden in each test" && exit 1
+ variables:
+ GIT_STRATEGY: none
+ MARIADB_VERSION: "10.0"
+ except:
+ variables:
+ - $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
+
+fresh install:
+ extends: .salsa-ci-template-for-mariadb
+ script:
+ - *test-prepare-container
+ - *test-install-all
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.5+
+ - *test-verify-final
+
+simple upgrade:
+ extends: .salsa-ci-template-for-mariadb
+ stage: upgrade MariaDB
+ script:
+ - *test-prepare-container
+ - apt-get install -y 'default-mysql*' ${BUILT_PACKAGES}
+ - *test-full-upgrade
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.5+
+ - *test-verify-final
+
+mariadb-10.5 with Bullseye backports upgrade:
+ extends: .salsa-ci-template-for-mariadb
+ stage: upgrade MariaDB
+ needs:
+ - job: build bullseye-backports
+ image: debian:bullseye
+ script:
+ - *test-prepare-container
+ # Install everything MariaDB currently in Debian Bullseye
+ - apt-get install -y 'default-mysql*' 'mariadb-*' 'libmariadb*'
+ # Verify installation of MariaDB from Bullseye
+ - dpkg -l | grep -e "mariadb-server.*10.5"
+ - *test-verify-initial
+ - *test-enable-bullseye-backports-repos
+ - *test-full-upgrade
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.5+
+ - *test-verify-final
+
+mariadb-10.6 and Bookworm-20230208 upgrade:
+ extends: .salsa-ci-template-for-mariadb
+ stage: upgrade MariaDB and distro
+ image: debian:bookworm-20230208
+ script:
+ - *test-prepare-container
+ - |
+ echo 'deb [check-valid-until=no] http://snapshot.debian.org/archive/debian/20230208T130000Z bookworm main' > /etc/apt/sources.list.d/bookworm.list
+ rm /etc/apt/sources.list.d/debian.sources
+ apt-get update -qq
+ # In February 2023 Bookworm snapshot this will install MariaDB 10.6
+ - apt-get install -y mariadb-server
+ - dpkg -l | grep -e "mariadb-server.*10.6"
+ - *test-verify-initial
+ - *test-enable-sid-repos
+ # Ensure mariadbd will not crash on next shutdown for any reason
+ - service mariadb restart
+ - *test-enable-artifacts-repo
+ - apt-get install -y mariadb-server
+ - *test-full-upgrade
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.5+
+ - *test-verify-final
+
+mariadb-10.5 and Bullseye upgrade:
+ extends: .salsa-ci-template-for-mariadb
+ stage: upgrade MariaDB and distro
+ image: debian:bullseye
+ script:
+ - *test-prepare-container
+ # Install everything MariaDB currently in Debian Bullseye
+ - apt-get install -y 'default-mysql*' 'mariadb-*' 'libmariadb*'
+ # Verify installation of MariaDB from Bullseye
+ - dpkg -l | grep -e "mariadb-server.*10.5"
+ - *test-verify-initial
+ - *test-enable-sid-repos
+ # Ensure mariadbd will not crash on next shutdown for any reason
+ - service mariadb restart
+ - *test-full-upgrade
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.5+
+ - *test-verify-final
+
+mariadb-10.3 and Buster upgrade:
+ extends: .salsa-ci-template-for-mariadb
+ stage: upgrade MariaDB and distro
+ image: debian:buster
+ script:
+ - *test-prepare-container
+ # Install everything MariaDB currently in Debian Buster
+ - apt-get install -y 'default-mysql*' 'mariadb-*' 'libmariadb*'
+ # Verify installation of MariaDB from Buster
+ - dpkg -l | grep -e "mariadb-server.*10.3"
+ - *test-verify-initial
+ - *test-enable-sid-repos
+ # Ensure mariadbd will not crash on next shutdown for any reason
+ - service mysql restart # in 10.3 service name is still 'mysql'
+ - *test-full-upgrade
+ # mariadb-10.3 in Buster ships a /etc/init.d/mysql and it continues to exist
+ # after upgrade, but is be removed on purge
+ - service mysql status || service mariadb status
+ - *test-verify-final
+
+# Similar to the Cacti install test, check that MariaDB consumer Zoph upgrades
+default-mysql-server and Bullseye upgrade:
+ extends: .salsa-ci-template-for-mariadb
+ stage: upgrade MariaDB and distro
+ image: debian:bullseye
+ script:
+ - *test-prepare-container
+ # Install everything MariaDB currently in Debian Bullseye
+ - apt-get install -y default-mysql-server zoph
+ # Verify installation of MariaDB from Bullseye
+ - *test-verify-initial
+ - *test-enable-sid-repos
+ - *test-enable-artifacts-repo
+ # Start with partial upgrade
+ - apt-get install -y default-mysql-server
+ - *test-full-upgrade
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.5+
+ - *test-verify-final
+
+test basic features:
+ extends: .salsa-ci-template-for-mariadb
+ script:
+ - *test-prepare-container
+ - *test-install-all
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.5+
+ - *test-verify-final
+ - |
+ # Print info about server
+ mariadb --skip-column-names -e "select @@version, @@version_comment"
+ mariadb --skip-column-names -e "select engine, support, transactions, savepoints from information_schema.engines order by engine" | sort
+ mariadb --skip-column-names -e "select plugin_name, plugin_status, plugin_type, plugin_library, plugin_license from information_schema.all_plugins order by plugin_name, plugin_library"
+ # Test various features
+ mariadb -e "CREATE DATABASE db"
+ mariadb -e "CREATE TABLE db.t_innodb(a1 SERIAL, c1 CHAR(8)) ENGINE=InnoDB; INSERT INTO db.t_innodb VALUES (1,'"'"'foo'"'"'),(2,'"'"'bar'"'"')"
+ mariadb -e "CREATE TABLE db.t_myisam(a2 SERIAL, c2 CHAR(8)) ENGINE=MyISAM; INSERT INTO db.t_myisam VALUES (1,'"'"'foo'"'"'),(2,'"'"'bar'"'"')"
+ mariadb -e "CREATE TABLE db.t_aria(a3 SERIAL, c3 CHAR(8)) ENGINE=Aria; INSERT INTO db.t_aria VALUES (1,'"'"'foo'"'"'),(2,'"'"'bar'"'"')"
+ mariadb -e "CREATE TABLE db.t_memory(a4 SERIAL, c4 CHAR(8)) ENGINE=MEMORY; INSERT INTO db.t_memory VALUES (1,'"'"'foo'"'"'),(2,'"'"'bar'"'"')"
+ mariadb -e "CREATE ALGORITHM=MERGE VIEW db.v_merge AS SELECT * FROM db.t_innodb, db.t_myisam, db.t_aria"
+ mariadb -e "CREATE ALGORITHM=TEMPTABLE VIEW db.v_temptable AS SELECT * FROM db.t_innodb, db.t_myisam, db.t_aria"
+ mariadb -e "CREATE PROCEDURE db.p() SELECT * FROM db.v_merge"
+ mariadb -e "CREATE FUNCTION db.f() RETURNS INT DETERMINISTIC RETURN 1"
+ # Test that the features still work (this step can be done e.g. after an upgrade)
+ mariadb -e "SHOW TABLES IN db"
+ mariadb -e "SELECT * FROM db.t_innodb; INSERT INTO db.t_innodb VALUES (3,'"'"'foo'"'"'),(4,'"'"'bar'"'"')"
+ mariadb -e "SELECT * FROM db.t_myisam; INSERT INTO db.t_myisam VALUES (3,'"'"'foo'"'"'),(4,'"'"'bar'"'"')"
+ mariadb -e "SELECT * FROM db.t_aria; INSERT INTO db.t_aria VALUES (3,'"'"'foo'"'"'),(4,'"'"'bar'"'"')"
+ mariadb -e "SELECT * FROM db.t_memory; INSERT INTO db.t_memory VALUES (3,'"'"'foo'"'"'),(4,'"'"'bar'"'"')"
+ mariadb -e "SELECT COUNT(*) FROM db.v_merge"
+ mariadb -e "SELECT COUNT(*) FROM db.v_temptable"
+ mariadb -e "CALL db.p()"
+ mariadb -e "SELECT db.f()"
+ - |
+ # Test TLS connections
+ dpkg -l | grep -i -e tls -e ssl
+ # Create user for TCP connection, must have password
+ mariadb -e "SET PASSWORD FOR 'mysql'@'localhost' = PASSWORD('asdf234');"
+ cat <<EOF > /root/.my.cnf
+ [client]
+ user=mysql
+ password=asdf234
+ protocol=tcp
+ EOF
+ export CERT_PATH=/usr/share/mysql/mysql-test/std_data
+ openssl verify -CAfile $CERT_PATH/cacert.pem $CERT_PATH/server-cert.pem
+ openssl x509 -subject -issuer -noout -in $CERT_PATH/cacert.pem
+ openssl x509 -subject -issuer -noout -in $CERT_PATH/server-cert.pem
+ cat <<EOF > /etc/mysql/mariadb.conf.d/tls.cnf
+ [client-server]
+ ssl = on
+ ssl-ca = $CERT_PATH/cacert.pem
+ ssl-cert = $CERT_PATH/server-cert.pem
+ ssl-key = $CERT_PATH/server-key.pem
+ [server]
+ require-secure-transport = on
+ [client]
+ ssl-verify-server-cert = on
+ EOF
+ service mariadb restart
+ mariadb -Bse 'STATUS' | tee result
+ # Ensure important values present, otherwise fail job
+ grep --quiet "localhost via TCP/IP" result
+ mariadb -Bse 'SHOW VARIABLES' | grep -e tls -e ssl | tee result
+ grep --quiet "have_ssl YES" result
+ grep --quiet TLSv1.3 result
+ mariadb -Bse 'SHOW SESSION STATUS' | grep -i -e tls -e ssl | tee result
+ grep --quiet TLSv1.3 result
+
+# Install Cacti, which in uses dbconfig-common to configure the MariaDB user and
+# connection automatically in order to validate that at least one downstream
+# server consumer continues to work.
+test consumer cacti:
+ extends: .salsa-ci-template-for-mariadb
+ script:
+ - *test-prepare-container
+ - *test-enable-artifacts-repo
+ - apt-get install -y cacti
+ - mariadb -E -e "SHOW CREATE TABLE version;" cacti
+
+# Build a piece of software that was designed for libmysqlclient-dev but using the
+# libmariadb-dev-compat layer. Should always end up using libmariadb.so.3 run-time.
+build mariadbclient consumer Python-MySQLdb:
+ extends: .salsa-ci-template-for-mariadb
+ script:
+ - *test-prepare-container
+ - *test-install-all-libs
+ - apt-get install -y pkg-config python3-pip
+ # See what MySQLdb will build with
+ - pkg-config --cflags --libs mysqlclient
+ # MySQLdb is also available in Debian as package python3-mysqldb, but
+ # install it from pip to force that the client is compiled with
+ # libmariadb-dev-compat on-the-fly.
+ # Python 3.11 needs `--break-system-packages` to proceed with this.
+ - pip3 install --break-system-packages mysqlclient # Compiles module against libmysqlclient
+ - apt-get purge -y libmariadb-dev # Not needed for run-time
+ - python3 -c "import MySQLdb; print(MySQLdb.get_client_info())"
+
+libmysql* to libmariadb* upgrade:
+ extends: .salsa-ci-template-for-mariadb
+ stage: upgrade MariaDB
+ script:
+ - *test-prepare-container
+ # Install all libmysql* available in Debian unstable
+ - apt-get install -y pkg-config libmysqlclient-dev
+ - pkg-config --list-all
+ - pkg-config --cflags mysqlclient # mysqlclient.pc from original package
+ - *test-enable-artifacts-repo
+ - apt-get install -y libmariadb3
+ - pkg-config --list-all
+ - apt-get install -y libmariadb-dev
+ - pkg-config --list-all
+ - apt-get install -y libmariadb-dev-compat
+ - pkg-config --cflags mysqlclient # mysqlclient.pc from compat package
+ - pkg-config --list-all
+ - apt-get install -y libmariadbd19
+ - pkg-config --list-all
+ - apt-get install -y libmariadbd-dev
+ - pkg-config --list-all
+ - apt-get install -y default-libmysqlclient-dev default-libmysqld-dev
+ - *test-verify-libs
+
+default-libmysqlclient-dev upgrade:
+ extends: .salsa-ci-template-for-mariadb
+ stage: upgrade MariaDB
+ script:
+ - *test-prepare-container
+ - apt-get install -y pkg-config default-libmysqlclient-dev default-libmysqld-dev
+ - pkg-config --list-all
+ - *test-full-upgrade-libs
+ - *test-verify-libs
+
+default-libmysqlclient-dev and Bullseye upgrade:
+ extends: .salsa-ci-template-for-mariadb
+ stage: upgrade MariaDB and distro
+ image: debian:bullseye
+ script:
+ - *test-prepare-container
+ - apt-get install -y pkg-config default-libmysqlclient-dev
+ - pkg-config --list-all
+ - *test-enable-sid-repos
+ - *test-full-upgrade-libs
+ - *test-verify-libs
+
+default-libmysqlclient-dev and Buster upgrade:
+ extends: .salsa-ci-template-for-mariadb
+ stage: upgrade MariaDB and distro
+ image: debian:buster
+ script:
+ - *test-prepare-container
+ - apt-get install -y pkg-config default-libmysqlclient-dev
+ - pkg-config --list-all
+ - *test-enable-sid-repos
+ - *test-full-upgrade-libs
+ - *test-verify-libs
+
+default-libmysqlclient-dev with Bullseye backports upgrade:
+ extends: .salsa-ci-template-for-mariadb
+ stage: upgrade MariaDB
+ needs:
+ - job: build bullseye-backports
+ image: debian:bullseye
+ script:
+ - *test-prepare-container
+ - apt-get install -y pkg-config default-libmysqlclient-dev
+ - pkg-config --list-all
+ - *test-enable-bullseye-backports-repos
+ - *test-full-upgrade-libs
+ - *test-verify-libs
+
+# Upgrading from MySQL 8.0 with datadir in place is not possible. Users need to do a data dump.
+# The Debian maintainer scripts detect this situation and simply moves old datadir aside and start fresh.
+mysql-8.0 in Sid upgrade:
+ extends: .salsa-ci-template-for-mariadb
+ stage: upgrade MariaDB variant
+ image: debian:sid
+ script:
+ - *test-prepare-container
+ # The postinst fails often if 'ps' is missing from system, so install procps
+ - apt-get install -y procps mysql-server 'libmysqlc*'
+ # Ensure MySQL 8.0 package actually got installed
+ - dpkg -l | grep -e "mysql-server.*8.0"
+ - *test-verify-initial
+ - *test-install-all
+ # Due to some (currently unknown) changes in MySQL 8.0 packaging or apt
+ # behaviour changes, a system with a previous installation of MySQL 8.0 will
+ # on upgrades to MariaDB first fully remove MySQL, including the
+ # /etc/init.d/mysql file, so previous techniques in
+ # mariadb-server-10.6.postinst to maintain backwards compatibility with
+ # 'service mysql status' after installing MariaDB on top MySQL no longer
+ # works. Thus the step to test it now intentionally has a fallback to use
+ # the service name 'mariadb' instead, and the fallback is always used.
+ - sleep 5 # Give the mysql_upgrade a bit of time to complete before querying the server
+ - service mysql status || service mariadb status
+ - *test-verify-final
+
+# Upgrading from MySQL 8.0 with datadir in place is not possible. Users need to do a data dump.
+# The Debian maintainer scripts detect this situation and simply moves old datadir aside and start fresh.
+#
+# Testing on Focal binaries on Buster works. Using Jammy binaries on Bullseye
+# does not work as libc in Jammy is too new.
+mysql-8.0 from Ubuntu 22.04 with Bullseye backports upgrade:
+ extends: .salsa-ci-template-for-mariadb
+ stage: upgrade MariaDB variant
+ needs:
+ - job: build bullseye-backports
+ image: debian:bullseye
+ script:
+ - *test-prepare-container
+ # Add Ubuntu Focal archive keys and repository
+ - apt-get install --no-install-recommends --yes gpg gpg-agent dirmngr ca-certificates # Bare minimal (<4MB) for apt-key to work
+ - apt-key adv --recv-keys --keyserver hkps://keyserver.ubuntu.com:443 871920D1991BC93C 3B4FE6ACC0B21F32
+ - echo "deb http://archive.ubuntu.com/ubuntu/ focal main restricted" > /etc/apt/sources.list.d/ubuntu.list
+ - apt-get update -qq
+ # First install often fail due to bug in mysql-8.0
+ - apt-get install -y mysql-server 'libmysqlc*' || true
+ # Ensure MySQL 8.0 package actually got installed
+ - dpkg -l | grep -e "mysql-server.*8.0"
+ - sleep 10 && apt-get install -f
+ - *test-verify-initial
+ # Enable backports to make galera-4 available
+ - echo "deb http://deb.debian.org/debian bullseye-backports main" > /etc/apt/sources.list.d/backports.list && apt-get update -qq
+ - *test-install-all
+ - service mysql status
+ - sleep 5 # Give the mysql_upgrade a bit of time to complete before querying the server
+ - *test-verify-final
+
+# Upgrading from MySQL 8.0 with datadir in place is not possible. Users need to do a data dump.
+# The Debian maintainer scripts detect this situation and simply moves old datadir aside and start fresh.
+mysql-community-cluster-8.0 from MySQL.com with Bullseye backports upgrade:
+ extends: .salsa-ci-template-for-mariadb
+ stage: upgrade MariaDB variant
+ needs:
+ - job: build bullseye-backports
+ image: debian:bullseye
+ script:
+ - *test-prepare-container
+ - apt-get install --no-install-recommends --yes ca-certificates curl systemctl
+ - curl -sS "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xbca43417c3b485dd128ec6d4b7b3b788a8d3785c" -o /etc/apt/trusted.gpg.d/mysql.asc
+ - echo "deb https://repo.mysql.com/apt/debian/ bullseye mysql-cluster-8.0" > /etc/apt/sources.list.d/mysql.list
+ - apt-get update -qq
+ - apt-get install -y mysql-cluster-community-server
+ - sed 's/ExecStartPre=+/ExecStartPre=/' -i /lib/systemd/system/mysql.service # Hack to make file compatible with systemctl shim
+ - systemctl start mysql
+ - dpkg -l | grep -iE 'maria|mysql|galera'
+ - systemctl status mysql; mysql -e 'SELECT VERSION()'
+ - systemctl stop mysql # Stop manually as maintainer scripts don't handle this with systemctl shim
+ # Enable backports to make galera-4 available
+ - echo "deb http://deb.debian.org/debian bullseye-backports main" > /etc/apt/sources.list.d/backports.list && apt-get update -qq
+ - *test-install-all
+ # Ignore systemctl shim result as MariaDB systemd file is incompatible with it and yields:
+ # ERROR:systemctl:the ExecStartPre control process exited with error code
+ - systemctl status mysql || true
+ - mysql -e 'SELECT VERSION()' || true
+ - sleep 5 # Give the mysql_upgrade a bit of time to complete before querying the server
+ - *test-verify-final
+
+mariadb.org-10.11 upgrade:
+ extends: .salsa-ci-template-for-mariadb-upgrade
+ stage: upgrade MariaDB variant
+ variables:
+ MARIADB_VERSION: "10.11"
+ script:
+ - apt-get install -y mariadb-server
+ - *test-verify-initial
+ # Install MariaDB built in this commit
+ # Force downgrades so our version installs on top of upstream revision, e.g. 1:11.10.1-1 vs 1:11.10.1+mariadb~sid
+ - apt-get install -y --allow-downgrades ./*.deb
+ # Verify installation of MariaDB built in this commit
+ - dpkg -l | grep -iE 'maria|mysql|galera' || true # List installed
+ - mariadb --version # Client version
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.5+
+ - *test-verify-final
+
+mariadb.org-10.10 upgrade:
+ extends: .salsa-ci-template-for-mariadb-upgrade
+ stage: upgrade MariaDB variant
+ variables:
+ MARIADB_VERSION: "10.10"
+ script:
+ # this should not use Sid to begin with
+ - apt-get install -y mariadb-server=1:10.10.2+maria~debunstable mariadb-client=1:10.10.2+maria~debunstable
+ - *test-verify-initial
+ - *test-full-upgrade
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.5+
+ - *test-verify-final
+
+mariadb.org-10.9 upgrade:
+ extends: .salsa-ci-template-for-mariadb-upgrade
+ stage: upgrade MariaDB variant
+ variables:
+ MARIADB_VERSION: "10.9"
+ script:
+ # this should not use Sid to begin with
+ - apt-get install -y mariadb-server=1:10.9.4+maria~debunstable mariadb-client=1:10.9.4+maria~debunstable
+ - *test-verify-initial
+ - *test-full-upgrade
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.5+
+ - *test-verify-final
+
+mariadb.org-10.8 upgrade:
+ extends: .salsa-ci-template-for-mariadb-upgrade
+ stage: upgrade MariaDB variant
+ variables:
+ MARIADB_VERSION: "10.8"
+ script:
+ - apt-get install -y mariadb-server-10.8
+ - *test-verify-initial
+ - *test-install-all
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.5+
+ - *test-verify-final
+
+mariadb.org-10.7 upgrade:
+ extends: .salsa-ci-template-for-mariadb-upgrade
+ stage: upgrade MariaDB variant
+ variables:
+ MARIADB_VERSION: "10.7"
+ script:
+ - apt-get install -y mariadb-server-10.7
+ - *test-verify-initial
+ - *test-install-all
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.5+
+ - *test-verify-final
+
+mariadb.org-10.6 upgrade:
+ extends: .salsa-ci-template-for-mariadb-upgrade
+ stage: upgrade MariaDB variant
+ variables:
+ MARIADB_VERSION: "10.6"
+ script:
+ # Package libmariadbclient-dev from mariadb.org conflicts with libmariadb-dev in Sid, so cannot use wildcard that would include it
+ # Enable this line when there is a way to install them only from the mariadb.org repo
+ # - apt-get install -y 'mariadb*' libmariadb3 'libmariadb-*' 'libmariadbd*'
+ - apt-get install -y mariadb-server-10.6
+ - *test-verify-initial
+ - *test-install-all
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.5+
+ - *test-verify-final
+
+# archive.mariadb.org for Debian Sid latest is 10.5.13
+mariadb.org-10.5 upgrade:
+ extends: .salsa-ci-template-for-mariadb-upgrade
+ stage: upgrade MariaDB variant
+ variables:
+ MARIADB_VERSION: "10.5"
+ script:
+ - *test-install-openssl1-in-sid-for-backwards-compat
+ - apt-get install -y mariadb-server-10.5
+ - *test-verify-initial
+ - *test-install-all
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.5+
+ - *test-verify-final
+
+# archive.mariadb.org for Debian Sid latest is 10.4.17
+mariadb.org-10.4 upgrade:
+ extends: .salsa-ci-template-for-mariadb-upgrade
+ stage: upgrade MariaDB variant
+ variables:
+ MARIADB_VERSION: "10.4"
+ script:
+ - *test-install-readline-in-sid-for-backwards-compat
+ - *test-install-openssl1-in-sid-for-backwards-compat
+ - apt-get install -y mariadb-server-10.4
+ # MariaDB.org version of 10.4 and early 10.5 do not install an init file, so
+ # it must be installed here manually
+ - cp /usr/share/mysql/mysql.init /etc/init.d/mysql; chmod +x /etc/init.d/mysql; service mysql start; sleep 5
+ - *test-verify-initial
+ - *test-install-all
+ - sleep 5 # Give the mysql_upgrade a bit of time to complete before querying the server
+ - service mysql status
+ - service mariadb status
+ - *test-verify-final
+
+# archive.mariadb.org for Debian Sid latest is 10.3.27
+mariadb.org-10.3 upgrade:
+ extends: .salsa-ci-template-for-mariadb-upgrade
+ stage: upgrade MariaDB variant
+ variables:
+ MARIADB_VERSION: "10.3"
+ script:
+ - *test-install-readline-in-sid-for-backwards-compat
+ - *test-install-openssl1-in-sid-for-backwards-compat
+ - apt-get install -y mariadb-server-10.3
+ - *test-verify-initial
+ - *test-install-all
+ # mariadb-10.3 in Buster ships a /etc/init.d/mysql and it continues to exist
+ # after upgrade, but is be removed on purge
+ - service mysql status || service mariadb status
+ # Give the mariadb-upgrade plenty of time to complete, otherwise next commands
+ # fail on non-existing mariadb.sys user
+ - sleep 15
+ - *test-verify-final
+
+# archive.mariadb.org for Debian Sid latest is 10.2.21
+mariadb.org-10.2 upgrade:
+ extends: .salsa-ci-template-for-mariadb-upgrade
+ stage: upgrade MariaDB variant
+ variables:
+ MARIADB_VERSION: "10.2"
+ script:
+ - *test-install-readline-in-sid-for-backwards-compat
+ - *test-install-openssl1-in-sid-for-backwards-compat
+ - apt-get install -y mariadb-server-10.2
+ # Verify initial state before upgrade
+ - dpkg -l | grep -iE 'maria|mysql|galera' || true # List installed
+ - service mysql status
+ # prepending with --defaults-file=/etc/mysql/debian.cnf is needed in upstream 5.5–10.3
+ - |
+ mysql --defaults-file=/etc/mysql/debian.cnf --skip-column-names -e "SELECT @@version, @@version_comment"
+ mysql --defaults-file=/etc/mysql/debian.cnf --table -e "SHOW DATABASES;"
+ mysql --defaults-file=/etc/mysql/debian.cnf --table -e "SELECT * FROM mysql.user; SHOW CREATE USER root@localhost;"
+ mysql --defaults-file=/etc/mysql/debian.cnf --table -e "SELECT * FROM mysql.plugin; SHOW PLUGINS;"
+ - *test-install-all
+ # mariadb-10.2 in ships a /etc/init.d/mysql and it continues to exist
+ # after upgrade, but is be removed on purge
+ - service mysql status || service mariadb status
+ # Give the mariadb-upgrade plenty of time to complete, otherwise next commands
+ # fail on non-existing mariadb.sys user
+ - sleep 15
+ - *test-verify-final
+
+mysql.com-5.7 with Buster upgrade:
+ extends: .salsa-ci-template-for-mariadb
+ stage: upgrade MariaDB variant
+ needs:
+ - job: build
+ image: debian:buster
+ script:
+ - *test-prepare-container
+ - |
+ apt-get install --no-install-recommends --yes gpg gpg-agent dirmngr ca-certificates # Bare minimal (<4MB) for apt-key to work
+ apt-key adv --recv-keys --keyserver hkps://keyserver.ubuntu.com:443 B7B3B788A8D3785C
+ echo "deb https://repo.mysql.com/apt/debian/ buster mysql-5.7" > /etc/apt/sources.list.d/mysql.list
+ apt-get update -qq
+ apt-get install -y 'mysql*' 'libmysqlc*'
+ # Ensure MySQL 5.7 package actually got installed
+ - dpkg -l | grep -e "mysql-server.*5.7"
+ - *test-verify-initial
+ - *test-enable-sid-repos
+ - *test-install-all
+ # Due to some (currently unknown) changes in MySQL 5.7 packaging or apt
+ # behaviour changes, a system with a previous installation of MySQL will
+ # on upgrades to MariaDB first fully remove MySQL, including the
+ # /etc/init.d/mysql file, so previous techniques in
+ # mariadb-server-10.6.postinst to maintain backwards compatibility with
+ # 'service mysql status' after installing MariaDB on top MySQL no longer
+ # works. Thus the step to test it now intentionally has a fallback to use
+ # the service name 'mariadb' instead, and the fallback is always used.
+ - sleep 5 # Give the mysql_upgrade a bit of time to complete before querying the server
+ - service mysql status || service mariadb status
+ - sleep 15 # Give the mysql_upgrade a bit of extra time to complete with MySQL 5.7 before querying the server
+ - *test-verify-final
+
+percona-xtradb-5.7 with Bullseye backports upgrade:
+ extends: .salsa-ci-template-for-mariadb
+ stage: upgrade MariaDB variant
+ needs:
+ - job: build bullseye-backports
+ image: debian:bullseye
+ script:
+ - *test-prepare-container
+ - |
+ apt-get install --no-install-recommends --yes gpg gpg-agent dirmngr ca-certificates # Bare minimal (<4MB) for apt-key to work
+ apt-key adv --recv-keys --keyserver hkps://keyserver.ubuntu.com:443 9334A25F8507EFA5
+ echo "deb https://repo.percona.com/apt/ bullseye main" > /etc/apt/sources.list.d/mysql.list
+ apt-get update -qq
+ apt-get install -y percona-xtradb-cluster-full-57 percona-xtrabackup-24 percona-toolkit pmm2-client
+ - service mysql status
+ - *test-verify-initial
+ # Enable backports to make galera-4 available
+ - echo "deb http://deb.debian.org/debian bullseye-backports main" >> /etc/apt/sources.list.d/backports.list && apt-get update -qq
+ - *test-install-all
+ - service mysql status
+ - sleep 15 # Give the mysql_upgrade a bit of extra time to complete with MySQL 5.7 before querying the server
+ - *test-verify-final