diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9e6559cb6357465a9844bde9f749ea957c286c4b..5e53c9ee9de181d804885f033e4f91190f90b87e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -115,11 +115,9 @@ clang-tidy:
   before_script:
     - git clone https://gitlab.com/aroffringa/aocommon.git
   script:
-    - cmake --version
     - mkdir build && cd build
-    - cmake -DAOCOMMON_INCLUDE_DIR=../aocommon/include -DBUILD_TESTING=ON -DCMAKE_INSTALL_PREFIX=.. -DCMAKE_CXX_FLAGS="-coverage" -DCMAKE_EXE_LINKER_FLAGS="-coverage" ..
-    - make -j`nproc`
-    - make install
+    - cmake -DAOCOMMON_INCLUDE_DIR=../aocommon/include -DBUILD_TESTING=ON -DCMAKE_CXX_FLAGS="${CXX_FLAGS}" -DCMAKE_EXE_LINKER_FLAGS="${LINKER_FLAGS}" ..
+    - make -j`nproc` install
   artifacts:
     paths:
       - aocommon
@@ -130,31 +128,28 @@ build-2004:
 
 build-2204:
   extends: [".needs-2204",".build"]
-
-.test:
-  stage: test
-  script:
-     - cd build/
-     - ctest -j`nproc` --output-on-failure -T test
-     - mkdir coverage-unit
-     - gcovr -j`nproc` -r ../ -e '.*/external/.*' -e '.*/CompilerIdCXX/.*' -e '.*/test/.*' --txt coverage.txt --xml coverage.xml --html-details coverage-unit/coverage.html
-     - cat coverage.txt
+  variables:
+    CXX_FLAGS: -coverage -fprofile-update=atomic
+    LINKER_FLAGS: -coverage
 
 test-2004:
-  extends: .test
+  stage: test
   needs: ["versioning","build-2004"]
   image: $BASE_IMAGE_2004
+  script:
+    - cd build/
+    - ctest -j`nproc` --output-on-failure -T test
 
 test-2204:
-  extends: .test
+  stage: test
   needs: ["versioning","build-2204"]
   image: $BASE_IMAGE_2204
-  after_script:
-     - cd build/
-     - tar cfz coverage-unit.tar.gz coverage-unit/
+  script:
+    - cd build
+    - ctest -j`nproc` --output-on-failure -T test
+    - gcovr -j`nproc` -r .. -e '.*/external/.*' -e '.*/CompilerIdCXX/.*' -e '.*/test/.*' --txt --xml coverage.xml .
+  coverage: /^TOTAL.*\s+(\d+\%)$/
   artifacts:
-    paths:
-      - build/coverage-unit.tar.gz
     reports:
       coverage_report:
         coverage_format: cobertura
diff --git a/docker/ubuntu_20_04_base b/docker/ubuntu_20_04_base
index c592989598ee091fa3b0966d88cc6cb818bffaaa..37f9d43440cb75f1fc67ad0bc379b00bba596c7f 100644
--- a/docker/ubuntu_20_04_base
+++ b/docker/ubuntu_20_04_base
@@ -3,19 +3,13 @@
 
 # base
 FROM ubuntu:20.04
-RUN export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get upgrade -y && \
+RUN export DEBIAN_FRONTEND=noninteractive \
+    && apt-get update && apt-get upgrade -y \
 # install astronomy packages
-    apt-get -y install libcfitsio-dev wcslib-dev libfftw3-dev libgsl-dev \
+    && apt-get -y install libcfitsio-dev wcslib-dev libfftw3-dev libgsl-dev \
 # install misc packages
     wget git make cmake g++ doxygen \
 # install dependencies
     libboost-all-dev libhdf5-dev libpython3-dev python3-pip \
-    casacore-dev casacore-tools clang-format-12 clang-tidy-12 \
-    && rm -rf /var/lib/apt/lists/* \
-# The formatter needs a binary named 'clang-format', not 'clang-format-12'.
-# Same for clang-tidy-12.
-    && ln -sf clang-format-12 /usr/bin/clang-format \
-    && ln -sf clang-tidy-12 /usr/bin/clang-tidy \
-# 20220624: The latest GCOVR (5.1) is broken, so use 5.0.
-# jinja2<3.1 is required for the html details of GCOVR 5.0
-    && python3 -m pip install gcovr==5.0 'jinja2<3.1' cmake-format isort
\ No newline at end of file
+    casacore-dev casacore-tools \
+    && rm -rf /var/lib/apt/lists/*
diff --git a/docker/ubuntu_22_04_base b/docker/ubuntu_22_04_base
index 4c62b2c0180681a05459dc8df385f0620678cfba..f7c4aab0af8096cde557f7a5be83cf3fe4a4553c 100644
--- a/docker/ubuntu_22_04_base
+++ b/docker/ubuntu_22_04_base
@@ -3,9 +3,10 @@
 
 # base
 FROM ubuntu:22.04
-RUN export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get upgrade -y && \
+RUN export DEBIAN_FRONTEND=noninteractive \
+    && apt-get update && apt-get upgrade -y \
 # install astronomy packages
-    apt-get -y install libcfitsio-dev wcslib-dev libfftw3-dev libgsl-dev \
+    && apt-get -y install libcfitsio-dev wcslib-dev libfftw3-dev libgsl-dev \
 # install misc packages
     wget git make cmake g++ doxygen \
 # install dependencies
@@ -16,6 +17,4 @@ RUN export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get upgrade -
 # Same for clang-tidy-12.
     && ln -sf clang-format-12 /usr/bin/clang-format \
     && ln -sf clang-tidy-12 /usr/bin/clang-tidy \
-# 20220624: The latest GCOVR (5.1) is broken, so use 5.0.
-# jinja2<3.1 is required for the html details of GCOVR 5.0
-    && python3 -m pip install gcovr==5.0 'jinja2<3.1' black cmake-format isort
\ No newline at end of file
+    && python3 -m pip install gcovr black cmake-format isort