diff --git a/.gitlab/build.sh b/.gitlab/build.sh
new file mode 100755
index 0000000000000000000000000000000000000000..30ff7d85b4c61b0dbbab9bb85ce9f2711221fee0
--- /dev/null
+++ b/.gitlab/build.sh
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash
+
+set -x
+
+export LOGNAME=chameleon_${VERSION}.log
+echo $LOGNAME
+echo build BUILD_OPTIONS $BUILD_OPTIONS | tee -a ${LOGNAME}
+echo build VERSION       $VERSION       | tee -a ${LOGNAME}
+ls -l *.log
+if [[ -d build-$VERSION ]]
+then
+  cd build-$VERSION
+  if [[ $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH ]]
+  then
+    SCAN="scan-build -plist --intercept-first --exclude CMakeFiles --analyze-headers -o analyzer_reports "
+  else
+    SCAN=""
+  fi
+  eval '${SCAN}cmake -C ../cmake_modules/gitlab-ci-initial-cache.cmake .. $BUILD_OPTIONS'
+  eval '${SCAN}ctest --no-compress-output -j 5 -V -T Build | tee ../${LOGNAME}'
+  make install | tee -a ../${LOGNAME}
+  rm install/ -r
+else
+  echo "$0: directory build-$VERSION does not exist, exit."
+  exit 1
+fi
diff --git a/.gitlab/common.yml b/.gitlab/common.yml
index 996dfa73ba9368555b4edbb735e8ca102c745a2c..f55aeb523a0a82330ad33ed72ed8dd3fa3c488f7 100644
--- a/.gitlab/common.yml
+++ b/.gitlab/common.yml
@@ -25,21 +25,7 @@ default:
   stage: build
   extends: .only-branches
   script:
-    - export LOGNAME=chameleon_${VERSION}.log
-    - echo $LOGNAME
-    - echo build BUILD_OPTIONS $BUILD_OPTIONS | tee -a ${LOGNAME}
-    - echo build VERSION       $VERSION       | tee -a ${LOGNAME}
-    - ls -l *.log
-    - (cd build-$VERSION &&
-       scan-build -plist --intercept-first --exclude CMakeFiles --analyze-headers -o analyzer_reports
-       cmake -C ../cmake_modules/gitlab-ci-initial-cache.cmake .. $BUILD_OPTIONS &&
-       scan-build -plist --intercept-first --exclude CMakeFiles --analyze-headers -o analyzer_reports
-       ctest --no-compress-output -j 5 -V
-             -T Build
-             | tee ../${LOGNAME})
-    - (cd build-$VERSION &&
-       make install | tee -a ../${LOGNAME} &&
-       rm install/ -r)
+    - ./.gitlab/build.sh
   artifacts:
     name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
     expire_in: 2 days
@@ -49,23 +35,7 @@ default:
 .test_script_template:
   stage: test
   script:
-    - export LOGNAME=chameleon_${VERSION}_${CATEGORY}_${PRECISION}
-    - echo $LOGNAME
-    - echo test TESTS_RESTRICTION $TESTS_RESTRICTION  | tee -a ${LOGNAME}.log
-    - echo test VERSION $VERSION     | tee -a ${LOGNAME}.log
-    - echo test CATEGORY $CATEGORY   | tee -a ${LOGNAME}.log
-    - echo test PRECISION $PRECISION | tee -a ${LOGNAME}.log
-    - ls -l *.log
-    - (cd build-$VERSION &&
-       eval "ctest --no-compress-output
-             $TESTS_RESTRICTION
-             -T Test
-             --output-junit ../${LOGNAME}.junit
-             | tee -a ../${LOGNAME}.log")
-    - gcovr --xml-pretty --exclude-unreachable-branches --print-summary -o ${LOGNAME}.cov --root ${CI_PROJECT_DIR}
-    - lcov --directory build-$VERSION --capture --output-file ${LOGNAME}.lcov
-    - cp ${LOGNAME}.junit junit.xml
-    - cp ${LOGNAME}.cov coverage.xml
+    - ./.gitlab/test.sh
   coverage: /^\s*lines:\s*\d+.\d+\%/
   artifacts:
     name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
diff --git a/.gitlab/test.sh b/.gitlab/test.sh
new file mode 100755
index 0000000000000000000000000000000000000000..2897800762ec6826873a7e9120b9cfad661bb469
--- /dev/null
+++ b/.gitlab/test.sh
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+
+set -x
+
+export LOGNAME=chameleon_${VERSION}_${CATEGORY}_${PRECISION}
+echo $LOGNAME
+echo test TESTS_RESTRICTION $TESTS_RESTRICTION  | tee -a ${LOGNAME}.log
+echo test VERSION $VERSION     | tee -a ${LOGNAME}.log
+echo test CATEGORY $CATEGORY   | tee -a ${LOGNAME}.log
+echo test PRECISION $PRECISION | tee -a ${LOGNAME}.log
+ls -l *.log
+if [[ -d build-$VERSION ]]
+then
+  cd build-$VERSION
+  eval "ctest --no-compress-output $TESTS_RESTRICTION -T Test --output-junit ../${LOGNAME}.junit | tee -a ../${LOGNAME}.log"
+  cd .. $CI_PROJECT_DIR
+  gcovr --xml-pretty --exclude-unreachable-branches --print-summary -o ${LOGNAME}.cov --root $CI_PROJECT_DIR
+  lcov --directory build-$VERSION --capture --output-file ${LOGNAME}.lcov
+  cp ${LOGNAME}.junit junit.xml
+  cp ${LOGNAME}.cov coverage.xml
+else
+  echo "$0: directory build-$VERSION does not exist, exit."
+  exit 1
+fi