diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5040700096b5227648a9fb62921a4700b31e6408..857ef73fa2461747c557925d7255a88968dbfe9f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -163,6 +163,7 @@ test:debian10-ninja:
         - .debian10_ninja
         - .cmake_test_linux_release
         - .linux_builder_tags_qt
+        - .cmake_junit_artifacts
         - .run_dependent
         - .needs_centos6_x86_64
 
@@ -171,6 +172,7 @@ test:debian10-aarch64-ninja:
         - .debian10_aarch64_ninja
         - .cmake_test_linux_release
         - .linux_builder_tags_aarch64_qt
+        - .cmake_junit_artifacts
         - .run_dependent
         - .needs_centos7_aarch64
     variables:
@@ -209,6 +211,7 @@ test:fedora34-makefiles-nospace:
         - .fedora34_makefiles
         - .cmake_test_linux_release
         - .linux_builder_tags_qt
+        - .cmake_junit_artifacts
         - .run_dependent
         - .needs_centos6_x86_64
     variables:
@@ -231,6 +234,7 @@ test:cuda10.2-nvidia:
         - .cuda10.2_nvidia
         - .cmake_test_linux_release
         - .linux_builder_tags_cuda
+        - .cmake_junit_artifacts
         - .run_dependent
         - .needs_centos6_x86_64
 
@@ -269,6 +273,7 @@ test:fedora34-ninja-multi:
         - .fedora34_ninja_multi
         - .cmake_test_linux_external
         - .linux_builder_tags_qt
+        - .cmake_junit_artifacts
         - .run_dependent
     dependencies:
         - test:fedora34-ninja
@@ -635,6 +640,7 @@ test:macos-x86_64-xcode:
         - .macos_x86_64_xcode
         - .cmake_test_macos_external
         - .macos_x86_64_builder_ext_tags
+        - .cmake_junit_artifacts
         - .run_dependent
     dependencies:
         - test:macos-x86_64-ninja
@@ -646,6 +652,7 @@ test:macos-arm64-xcode:
         - .macos_arm64_xcode
         - .cmake_test_macos_external
         - .macos_arm64_builder_ext_tags
+        - .cmake_junit_artifacts
         - .run_dependent
     dependencies:
         - test:macos-arm64-ninja
@@ -727,6 +734,7 @@ test:windows-vs2019-x64:
         - .windows_vs2019_x64
         - .cmake_test_windows_external
         - .windows_builder_ext_tags
+        - .cmake_junit_artifacts
         - .run_dependent
     dependencies:
         - test:windows-vs2019-x64-ninja
diff --git a/.gitlab/artifacts.yml b/.gitlab/artifacts.yml
index edd313f5aa9ce40c1ab66fe07b1726774f63b14d..45e4c5b526de50b13f3d3698190f61f21605bb82 100644
--- a/.gitlab/artifacts.yml
+++ b/.gitlab/artifacts.yml
@@ -82,11 +82,22 @@
             - build/cmake-*.tar.gz
             - build/cmake-*.zip
 
+.cmake_junit_artifacts:
+    artifacts:
+        expire_in: 1d
+        when: always
+        reports:
+            junit:
+                - build/junit.xml
+
 .cmake_test_artifacts:
     artifacts:
         expire_in: 1d
         # External testing can be useful even if test jobs fail.
         when: always
+        reports:
+            junit:
+                - build/junit.xml
         paths:
             # Take the install tree.
             - build/install/
diff --git a/.gitlab/ci/cmake.ps1 b/.gitlab/ci/cmake.ps1
index 3d6fb81ed5729c680eeff5fec2427f4b68860465..a16fe459baf1289aa38f04cff1824198483f347f 100755
--- a/.gitlab/ci/cmake.ps1
+++ b/.gitlab/ci/cmake.ps1
@@ -1,8 +1,8 @@
 $erroractionpreference = "stop"
 
-$version = "3.19.7"
-$sha256sum = "E6788D6E23B3026C37FCFA7658075D6B5F9113F26FAE17FE372AD4A7EE62D5FD"
-$filename = "cmake-$version-win64-x64"
+$version = "3.21.0-rc2"
+$sha256sum = "AF88454243BCBAF9F537458562D669DAF0DBEDA8C0FD82C1D93BC2B4285AE4C7"
+$filename = "cmake-$version-windows-x86_64"
 $tarball = "$filename.zip"
 
 $outdir = $pwd.Path
diff --git a/.gitlab/ci/cmake.sh b/.gitlab/ci/cmake.sh
index e02eb8a33e68861912af592cccd109c7c0c772d1..ff59d2867bc761d0a84e438eba381ce99c4664a2 100755
--- a/.gitlab/ci/cmake.sh
+++ b/.gitlab/ci/cmake.sh
@@ -2,22 +2,22 @@
 
 set -e
 
-readonly version="3.19.3"
+readonly version="3.21.0-rc2"
 
 case "$(uname -s)-$(uname -m)" in
     Linux-x86_64)
         shatool="sha256sum"
-        sha256sum="c18b65697e9679e5c88dccede08c323cd3d3730648e59048047bba82097e0ffc"
-        platform="Linux-x86_64"
+        sha256sum="31d4f5f4bb8793127eb441c8311fd4baad4d2a86c26fd37b43d4ef23887c332e"
+        platform="linux-x86_64"
         ;;
     Linux-aarch64)
         shatool="sha256sum"
-        sha256sum="66e507c97ffb586d7ca6567890808b792c8eb004b645706df6fbf27826a395a2"
-        platform="Linux-aarch64"
+        sha256sum="437565f32e3f28fd8322f96a5472b196825eaf5ef6139e1c383afe624decc476"
+        platform="linux-aarch64"
         ;;
     Darwin-*)
         shatool="shasum -a 256"
-        sha256sum="a6b79ad05f89241a05797510e650354d74ff72cc988981cdd1eb2b3b2bda66ac"
+        sha256sum="5ab0ee4edb45de33080f571cf69300b2abd92dc02a9c624b3c289a4a14cab160"
         platform="macos-universal"
         ;;
     *)
diff --git a/.gitlab/ci/ctest_test.cmake b/.gitlab/ci/ctest_test.cmake
index facf9ba4ba10eb899564dfa907add46c0af28e80..b02d032fa50861c1e844a4815b1ff44131324fd3 100644
--- a/.gitlab/ci/ctest_test.cmake
+++ b/.gitlab/ci/ctest_test.cmake
@@ -20,6 +20,7 @@ include("${CMAKE_CURRENT_LIST_DIR}/ctest_exclusions.cmake")
 ctest_test(
   PARALLEL_LEVEL "${nproc}"
   TEST_LOAD "${nproc}"
+  OUTPUT_JUNIT "${CTEST_BINARY_DIRECTORY}/junit.xml"
   RETURN_VALUE test_result
   EXCLUDE "${test_exclusions}")
 ctest_submit(PARTS Test)
diff --git a/.gitlab/ci/ctest_test_external.cmake b/.gitlab/ci/ctest_test_external.cmake
index 6576c26329177497dd20cad3c09d34494733d153..48e910b9966521821b2ef76b959ff94184dce70b 100644
--- a/.gitlab/ci/ctest_test_external.cmake
+++ b/.gitlab/ci/ctest_test_external.cmake
@@ -74,6 +74,7 @@ include("${CMAKE_CURRENT_LIST_DIR}/ctest_exclusions.cmake")
 ctest_test(
   PARALLEL_LEVEL "${nproc}"
   TEST_LOAD "${nproc}"
+  OUTPUT_JUNIT "${CTEST_BINARY_DIRECTORY}/junit.xml"
   RETURN_VALUE test_result
   ${ctest_label_args}
   EXCLUDE "${test_exclusions}")