diff --git a/.github/workflows/linux_build.yml b/.github/workflows/linux_build.yml
index e3fbb9cd474f..a22a9bbaf6c4 100644
--- a/.github/workflows/linux_build.yml
+++ b/.github/workflows/linux_build.yml
@@ -110,14 +110,6 @@ jobs:
             container: icc
             build_script: build.sh
 
-          - name: Ubuntu 18.04, gcc
-            id: ubuntu_18.04
-            container: ubuntu_18.04
-            build_script: build.sh
-            before_test_script: services.sh
-            test_script: test.sh
-            travis_branch: ubuntu_1804
-
           - name: Ubuntu 18.04, gcc 32-bit
             id: ubuntu_18.04_32bit
             container: ubuntu_18.04_32bit
diff --git a/.github/workflows/ubuntu_18.04/Dockerfile.ci b/.github/workflows/ubuntu_18.04/Dockerfile.ci
deleted file mode 100644
index fc0727492edd..000000000000
--- a/.github/workflows/ubuntu_18.04/Dockerfile.ci
+++ /dev/null
@@ -1,57 +0,0 @@
-FROM ubuntu:18.04
-
-ENV DEBIAN_FRONTEND=noninteractive
-
-RUN apt-get update && \
-      apt-get install -y --allow-unauthenticated locales python3-dev python3-pip python3-numpy libpng-dev libjpeg-dev libgif-dev liblzma-dev libgeos-dev libcurl4-gnutls-dev libproj-dev libxml2-dev libxslt-dev libexpat-dev libxerces-c-dev libnetcdf-dev netcdf-bin libpoppler-dev libpoppler-private-dev libspatialite-dev gpsbabel swig libhdf4-alt-dev libhdf5-serial-dev poppler-utils unixodbc-dev libwebp-dev libepsilon-dev liblcms2-2 libpcre3-dev libcrypto++-dev libfyba-dev libkml-dev libmysqlclient-dev mysql-client-core-5.7 libogdi3.2-dev libcfitsio-dev openjdk-8-jdk libzstd1-dev libblosc-dev liblz4-dev ccache bash zip curl libpq-dev postgresql-client postgis cmake libssl-dev libboost-dev autoconf automake sqlite3 libopenexr-dev g++ fossil libgeotiff-dev libopenjp2-7-dev libcairo2-dev doxygen libfcgi-dev git
-
-ENV LANG=en_US.UTF-8
-RUN echo "$LANG UTF-8" >/etc/locale.gen \
-  && dpkg-reconfigure --frontend=noninteractive locales \
-  && update-locale LANG=$LANG
-
-# MSSQL: client side
-RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
-RUN curl https://packages.microsoft.com/config/ubuntu/18.04/prod.list | tee /etc/apt/sources.list.d/msprod.list
-RUN apt-get update \
-   && ACCEPT_EULA=Y apt-get install -y msodbcsql17 unixodbc-dev
-
-RUN curl -L -O https://github.com/Esri/file-geodatabase-api/raw/master/FileGDB_API_1.5/FileGDB_API_1_5_64gcc51.tar.gz \
-	&& tar xzf FileGDB_API_1_5_64gcc51.tar.gz \
-	&& cp -r FileGDB_API-64gcc51/* /usr/ \
-	&& rm FileGDB_API_1_5_64gcc51.tar.gz \
-	&& rm -rf FileGDB_API-64gcc51 \
-	&& ldconfig
-
-RUN curl -L -O https://github.com/mongodb/mongo-c-driver/releases/download/1.13.0/mongo-c-driver-1.13.0.tar.gz
-
-RUN tar xzf mongo-c-driver-1.13.0.tar.gz && (cd mongo-c-driver-1.13.0 && mkdir build_cmake && cd build_cmake && CC='ccache gcc' CXX='ccache g++' cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DENABLE_TESTS=NO -DCMAKE_BUILD_TYPE=Debug && make -j3 && make -j3 install)
-
-RUN curl -L -O https://github.com/mongodb/mongo-cxx-driver/archive/r3.4.0.tar.gz
-RUN tar xzf r3.4.0.tar.gz && (cd mongo-cxx-driver-r3.4.0 && mkdir build_cmake && cd build_cmake && CC='ccache gcc' CXX='ccache g++' cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DBSONCXX_POLY_USE_BOOST=ON -DMONGOCXX_ENABLE_SLOW_TESTS=NO -DCMAKE_BUILD_TYPE=Debug && make -j3 && make -j3 install)
-
-# Build freexl
-RUN curl -O http://www.gaia-gis.it/gaia-sins/freexl-sources/freexl-2.0.0-RC0.tar.gz
-RUN tar xzf freexl-2.0.0-RC0.tar.gz
-RUN cd freexl-2.0.0-RC0 && CC='ccache gcc' CXX='ccache g++' ./configure  --disable-static --prefix=/usr && make -j3 && make -j3 install
-
-# Build libspatialite
-RUN fossil --user $(whoami) clone https://www.gaia-gis.it/fossil/libspatialite libspatialite.fossil && mkdir sl && (cd sl && fossil open ../libspatialite.fossil && CC='ccache gcc' CXX='ccache g++' ./configure  --disable-static --prefix=/usr --disable-geos370 --disable-rttopo --disable-geos3100 --disable-geos3110 && make -j3 && make -j3 install)
-
-# Build librasterlite2
-RUN fossil --user $(whoami) clone https://www.gaia-gis.it/fossil/librasterlite2 librasterlite2.fossil && mkdir rl2 && (cd rl2 && fossil open ../librasterlite2.fossil && fossil checkout 9dd8217cb9 && CC='ccache gcc' CXX='ccache g++' ./configure --disable-static --prefix=/usr --disable-lz4 --disable-zstd && make -j3 && make -j3 install)
-
-# Build proj
-RUN curl -O https://download.osgeo.org/proj/proj-6.0.0.tar.gz \
-  && tar xzvf proj-6.0.0.tar.gz \
-  && cd proj-6.0.0 \
-  && CC='ccache gcc' CXX='ccache g++' CFLAGS='-DPROJ_RENAME_SYMBOLS' CXXFLAGS='-DPROJ_RENAME_SYMBOLS' ./configure \
-    --disable-static \
-    --prefix=/usr/local || cat config.log \
-  && make -j3 install
-RUN apt-get remove -y libproj-dev && ldconfig
-
-ENV LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
-
-COPY requirements.txt /tmp/
-RUN python3 -m pip install -U -r /tmp/requirements.txt
diff --git a/.github/workflows/ubuntu_18.04/build.sh b/.github/workflows/ubuntu_18.04/build.sh
deleted file mode 100755
index c23411587b7d..000000000000
--- a/.github/workflows/ubuntu_18.04/build.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/sh
-
-set -e
-
-cmake ${GDAL_SOURCE_DIR:=..} \
-    -DCMAKE_BUILD_TYPE=Release \
-    -DCMAKE_C_FLAGS="-Werror -DPROJ_RENAME_SYMBOLS" \
-    -DCMAKE_CXX_FLAGS="-Werror -DPROJ_RENAME_SYMBOLS" \
-    -DCMAKE_SHARED_LINKER_FLAGS="-lstdc++" \
-    -DUSE_CCACHE=ON \
-    -DPROJ_ROOT=/usr/local \
-    -DCMAKE_INSTALL_PREFIX=/usr \
-    -DGDAL_USE_GEOTIFF_INTERNAL:BOOL=ON \
-    -DGDAL_USE_TIFF_INTERNAL:BOOL=ON
-make -j3
-
-# make install
-# ldconfig
-# ln -s libgdal.so /usr/lib/libgdal.so.20
-
-## Post-install testing
-#./autotest/postinstall/test_pkg-config.sh /usr
diff --git a/.github/workflows/ubuntu_18.04/services.sh b/.github/workflows/ubuntu_18.04/services.sh
deleted file mode 100755
index d4d9c002aa2c..000000000000
--- a/.github/workflows/ubuntu_18.04/services.sh
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/bin/sh
-
-set -ex
-
-##################
-# Start services #
-##################
-
-# MSSQL: server side
-docker rm -f gdal-sql1
-docker pull mcr.microsoft.com/mssql/server:2017-latest
-docker run  -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=DummyPassw0rd'  -p 1433:1433 --name gdal-sql1 -d mcr.microsoft.com/mssql/server:2017-latest
-
-# MySQL 8
-docker rm -f gdal-mysql1
-docker run --name gdal-mysql1 -e MYSQL_ROOT_PASSWORD=passwd -e "MYSQL_ROOT_HOST=%" -p 33060:3306 -d mysql/mysql-server:8.0.18 mysqld --default-authentication-plugin=mysql_native_password
-
-# MariaDB 10.3.9
-docker rm -f gdal-mariadb
-docker run --name gdal-mariadb -e MYSQL_ROOT_PASSWORD=passwd -e "MYSQL_ROOT_HOST=%" -p 33061:3306 -d mariadb:10.3.9
-
-# PostGIS
-docker rm -f gdal-postgis
-docker run -v /home:/home --name "gdal-postgis" -p 25432:5432 -e ALLOW_IP_RANGE=0.0.0.0/0 -d -t kartoza/postgis:13.0
-
-# Azurite (Azure simulator)
-docker rm -f gdal-azurite
-docker run -d -p 10000:10000 --name gdal-azurite mcr.microsoft.com/azure-storage/azurite azurite-blob --blobHost 0.0.0.0
-
-# Mongo
-docker rm -f gdal-mongo
-docker run --name gdal-mongo -p 27018:27017 -d mongo:4.4
-
-######################
-# Configure services #
-######################
-
-sleep 10
-
-# MSSQL
-docker exec -t gdal-sql1 /opt/mssql-tools/bin/sqlcmd -l 30 -S localhost -U SA -P DummyPassw0rd -Q "CREATE DATABASE TestDB"
-
-# MySQL
-docker exec gdal-mysql1 sh -c "echo 'CREATE DATABASE test; SELECT Version()' | mysql -uroot -ppasswd"
-
-# MariaDB
-docker exec gdal-mariadb sh -c "echo 'CREATE DATABASE test; SELECT Version()' | mysql -uroot -ppasswd"
-
-# PostGIS
-docker exec -e PGPASSWORD=docker gdal-postgis psql -h localhost -U docker -d gis -c "CREATE DATABASE autotest"
-docker exec -e PGPASSWORD=docker gdal-postgis psql -h localhost -U docker -d autotest -c "CREATE EXTENSION postgis; CREATE EXTENSION postgis_raster; SELECT postgis_full_version()"
-
diff --git a/.github/workflows/ubuntu_18.04/test.sh b/.github/workflows/ubuntu_18.04/test.sh
deleted file mode 100755
index 0a476d9f3d9d..000000000000
--- a/.github/workflows/ubuntu_18.04/test.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash
-
-set -e
-
-. ../scripts/setdevenv.sh
-
-export PYTEST="python3 -m pytest -vv -p no:sugar --color=no"
-
-# Run C++ tests
-make quicktest
-
-# Run ogr_fgdb test in isolation due to likely conflict with libxml2
-(cd autotest/ogr && $PYTEST ogr_fgdb.py)
-
-IP=host.docker.internal
-
-# Test /vsiaz/ against the Azurite simulator
-export AZURITE_STORAGE_CONNECTION_STRING="DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://${IP}:10000/devstoreaccount1;"
-AZURE_STORAGE_CONNECTION_STRING=${AZURITE_STORAGE_CONNECTION_STRING} python3 -c "from osgeo import gdal; import sys; sys.exit(gdal.Mkdir('/vsiaz/mycontainer', 0o755))"
-(cd autotest/gcore && AZURE_STORAGE_CONNECTION_STRING=${AZURITE_STORAGE_CONNECTION_STRING} AZ_RESOURCE=mycontainer $PYTEST vsiaz_real_instance_manual.py)
-
-# MySQL 8
-(cd autotest/ogr && OGR_MYSQL_CONNECTION_STRING=mysql:test,user=root,password=passwd,port=33060,host=$IP $PYTEST ogr_mysql.py)
-# MariaDB 10.3.9
-(cd autotest/ogr && OGR_MYSQL_CONNECTION_STRING=mysql:test,user=root,password=passwd,port=33061,host=$IP $PYTEST ogr_mysql.py)
-
-# PostGIS tests
-(cd autotest/ogr && OGR_PG_CONNECTION_STRING="host=$IP port=25432 dbname=autotest user=docker password=docker" $PYTEST --capture=no -ra ogr_pg.py)
-(cd autotest/gdrivers && PGHOST="$IP" PGPORT=25432 PGUSER=docker PGPASSWORD=docker $PYTEST --capture=no -ra postgisraster.py)
-
-# MongoDB v3
-(cd autotest/ogr && MONGODBV3_TEST_PORT=27018 MONGODBV3_TEST_HOST=$IP $PYTEST ogr_mongodbv3.py)
-
-(cd autotest/ogr && OGR_MSSQL_CONNECTION_STRING="MSSQL:server=$IP;database=TestDB;driver=ODBC Driver 17 for SQL Server;UID=SA;PWD=DummyPassw0rd" $PYTEST ogr_mssqlspatial.py)
-
-# ogr_ogdi.py Fails with ERROR 1: OGDI DataSource Open Failed: Could not find the dynamic library "vrf"
-# ogr_fgdb.py was already run above
-(cd autotest && $PYTEST \
-    --ignore=ogr_ogdi.py \
-    --ignore=ogr_fgdb.py \
-)