diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 601e1e3abd46ab3f97c67d5e4a475f8fd6262afc..b8738287d78153fb73851c2acdb8813020b8f985 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -49,3 +49,4 @@ include:
   - local: '/scripts/ci/jobs/clang-sanitizer.yml'
   - local: '/scripts/ci/jobs/clang-tidy.yml'
   - local: '/scripts/ci/jobs/code-quality.yml'
+  - local: '/scripts/ci/jobs/meta.yml'
diff --git a/scripts/ci/jobs/build-docs.yml b/scripts/ci/jobs/build-docs.yml
index a6c15e92e198d1ed2dfef0adccb8be0b9a3a90fc..99d3beea632514aba2fb2ed7ac57dfdf9f4dc481 100644
--- a/scripts/ci/jobs/build-docs.yml
+++ b/scripts/ci/jobs/build-docs.yml
@@ -2,13 +2,12 @@ build docs:
   stage: build
   image:
     name: $CONTAINER_GCC_IMAGE
-  extends:
-    - .defaults
+  needs:
+    - job: meta
 
   before_script:
     # HACK to easier linking to the generated pages
     - echo '<meta http-equiv="REFRESH" content="0;URL=build/docs/index.html">' >> Doxygen.html
-    - git fetch --tags
     - mkdir -p build
     - cd build
 
diff --git a/scripts/ci/jobs/meta.yml b/scripts/ci/jobs/meta.yml
new file mode 100644
index 0000000000000000000000000000000000000000..213210e4fe1c0d3b252a7949f4cf936046f75c84
--- /dev/null
+++ b/scripts/ci/jobs/meta.yml
@@ -0,0 +1,11 @@
+meta:
+  stage: .pre
+  tags:
+    - envinf1-shell
+  script:
+    - git fetch --depth 500
+    - echo "OGS_VERSION=${CI_COMMIT_TAG:-`git describe --tags --long --dirty --always`}" >> build.env
+    - cat build.env
+  artifacts:
+    reports:
+      dotenv: build.env
diff --git a/scripts/cmake/ProjectSetup.cmake b/scripts/cmake/ProjectSetup.cmake
index 0f0f6f5eb46f2b6d76ed3499808ff043e7f3820e..33bbeba2e13a47ae815180611b06fa10ad5822a9 100644
--- a/scripts/cmake/ProjectSetup.cmake
+++ b/scripts/cmake/ProjectSetup.cmake
@@ -33,46 +33,51 @@ if(NOT IS_GIT_REPO)
     return()
 endif()
 
-# Get version info from Git, implementation based on
-# https://github.com/tomtom-international/cpp-dependencies
-execute_process(
-    COMMAND ${GIT_EXECUTABLE} describe --tags --long --dirty --always
-    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
-    RESULT_VARIABLE DESCRIBE_RESULT
-    OUTPUT_VARIABLE DESCRIBE_STDOUT
-)
-if(DESCRIBE_RESULT EQUAL 0)
-    string(STRIP "${DESCRIBE_STDOUT}" DESCRIBE_STDOUT)
-    message(STATUS "Git reported this project's version as '${DESCRIBE_STDOUT}'")
-    if(DESCRIBE_STDOUT MATCHES "^(.*)-(dirty)$")
-      set(DESCRIBE_DIRTY "${CMAKE_MATCH_2}")
-      set(DESCRIBE_STDOUT "${CMAKE_MATCH_1}")
-    endif()
-    if(DESCRIBE_STDOUT MATCHES "^([0-9a-f]+)$")
-      set(DESCRIBE_COMMIT_NAME "${CMAKE_MATCH_1}")
-      set(DESCRIBE_STDOUT "")
-    elseif(DESCRIBE_STDOUT MATCHES "^(.*)-g([0-9a-f]+)$")
-      set(DESCRIBE_COMMIT_NAME "g${CMAKE_MATCH_2}")
-      set(DESCRIBE_STDOUT "${CMAKE_MATCH_1}")
-    endif()
-    if(DESCRIBE_STDOUT MATCHES "^(.*)-([0-9]+)$")
-      set(DESCRIBE_COMMIT_COUNT "${CMAKE_MATCH_2}")
-      set(DESCRIBE_TAG "${CMAKE_MATCH_1}")
-      set(DESCRIBE_STDOUT "")
-    endif()
+if(DEFINED ENV{OGS_VERSION})
+    set(OGS_VERSION $ENV{OGS_VERSION})
+    message(STATUS "OGS VERSION: ${OGS_VERSION} (set via environment)")
+else()
+    # Get version info from Git, implementation based on
+    # https://github.com/tomtom-international/cpp-dependencies
+    execute_process(
+        COMMAND ${GIT_EXECUTABLE} describe --tags --long --dirty --always
+        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+        RESULT_VARIABLE DESCRIBE_RESULT
+        OUTPUT_VARIABLE DESCRIBE_STDOUT
+    )
+    if(DESCRIBE_RESULT EQUAL 0)
+        string(STRIP "${DESCRIBE_STDOUT}" DESCRIBE_STDOUT)
+        message(STATUS "Git reported this project's version as '${DESCRIBE_STDOUT}'")
+        if(DESCRIBE_STDOUT MATCHES "^(.*)-(dirty)$")
+          set(DESCRIBE_DIRTY "${CMAKE_MATCH_2}")
+          set(DESCRIBE_STDOUT "${CMAKE_MATCH_1}")
+        endif()
+        if(DESCRIBE_STDOUT MATCHES "^([0-9a-f]+)$")
+          set(DESCRIBE_COMMIT_NAME "${CMAKE_MATCH_1}")
+          set(DESCRIBE_STDOUT "")
+        elseif(DESCRIBE_STDOUT MATCHES "^(.*)-g([0-9a-f]+)$")
+          set(DESCRIBE_COMMIT_NAME "g${CMAKE_MATCH_2}")
+          set(DESCRIBE_STDOUT "${CMAKE_MATCH_1}")
+        endif()
+        if(DESCRIBE_STDOUT MATCHES "^(.*)-([0-9]+)$")
+          set(DESCRIBE_COMMIT_COUNT "${CMAKE_MATCH_2}")
+          set(DESCRIBE_TAG "${CMAKE_MATCH_1}")
+          set(DESCRIBE_STDOUT "")
+        endif()
 
-    set(OGS_VERSION ${DESCRIBE_TAG})
-    if(DESCRIBE_COMMIT_COUNT GREATER 0)
-      set(OGS_VERSION "${OGS_VERSION}-${DESCRIBE_COMMIT_COUNT}-${DESCRIBE_COMMIT_NAME}")
-    endif()
+        set(OGS_VERSION ${DESCRIBE_TAG})
+        if(DESCRIBE_COMMIT_COUNT GREATER 0)
+          set(OGS_VERSION "${OGS_VERSION}-${DESCRIBE_COMMIT_COUNT}-${DESCRIBE_COMMIT_NAME}")
+        endif()
 
-    if(DESCRIBE_DIRTY)
-      string(TIMESTAMP DESCRIBE_DIRTY_TIMESTAMP "%Y%m%d%H%M%S" UTC)
-      set(OGS_VERSION "${OGS_VERSION}.dirty.${DESCRIBE_DIRTY_TIMESTAMP}")
+        if(DESCRIBE_DIRTY)
+          string(TIMESTAMP DESCRIBE_DIRTY_TIMESTAMP "%Y%m%d%H%M%S" UTC)
+          set(OGS_VERSION "${OGS_VERSION}.dirty.${DESCRIBE_DIRTY_TIMESTAMP}")
+        endif()
+        message(STATUS "OGS VERSION: ${OGS_VERSION}")
+    else()
+        message(WARNING "Git repository contains no tags! Please run: git fetch --tags")
     endif()
-    message(STATUS "OGS VERSION: ${OGS_VERSION}")
-else()
-    message(WARNING "Git repository contains no tags! Please run: git fetch --tags")
 endif()
 
 # Get git commit