diff --git a/.gitlab-ci-env.sh b/.gitlab-ci-env.sh
index ba9cd4dcfa9f48b59dde7a0b91cb2c2b18bdb957..e57ebda1d369065294c6486137ca6f27711244bb 100755
--- a/.gitlab-ci-env.sh
+++ b/.gitlab-ci-env.sh
@@ -1,5 +1,7 @@
 #!/bin/bash
 
+set -x
+
 # custom environment used during CI tests with gitlab ci
 
 # these paths may depend on the runner used, please be careful and add
@@ -15,15 +17,34 @@ export STARPU_WORKERS_NOBIND=1
 # initialize empty to get just what we need
 export PKG_CONFIG_PATH=""
 
-# if simgrid change the default starpu dir to use
-if [ "$1" == "simu" ]; then
-  export STARPU_DIR=$STARPUSIMGRID_DIR
-  export PKG_CONFIG_PATH=$SIMGRID_DIR/lib/pkgconfig:$PKG_CONFIG_PATH
+# define the starpu dir depending on the build variant
+STARPU_VARIANT=""
+if [ ! -z "$1" ]
+then
+   STARPU_VARIANT="-$1"
 fi
+export STARPU_DIR=/home/gitlab/install/starpu${STARPU_VARIANT}
+
+# add additional env. var. depending on the starpu variant
+case $STARPU_VARIANT in
+  -hip )
+    export CMAKE_PREFIX_PATH=$STARPU_DIR:/opt/rocm
+    export LD_LIBRARY_PATH=/opt/rocm/lib
+    ;;
+  -hipcuda )
+    export CMAKE_PREFIX_PATH=$STARPU_DIR:$HIPCUDA_DIR
+    export LD_LIBRARY_PATH=$HIPCUDA_DIR/lib
+    export HIP_PLATFORM=nvidia
+    export HIP_PATH=$HIPCUDA_DIR
+    ;;
+  * )
+    ;;
+esac
 
 # for build: better to rely on pkg-config than to guess libraries with the env. var.
 export PKG_CONFIG_PATH=$PARSEC_DIR/lib/pkgconfig:$PKG_CONFIG_PATH
 export PKG_CONFIG_PATH=$STARPU_DIR/lib/pkgconfig:$PKG_CONFIG_PATH
+export PKG_CONFIG_PATH=$SIMGRID_DIR/lib/pkgconfig:$PKG_CONFIG_PATH
 
 # for ctest: we need this at runtime
 export LD_LIBRARY_PATH=$PARSEC_DIR/lib:$LD_LIBRARY_PATH
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index b8567fc1f04c1b88767d582ccb568db4f5d7b018..d8b822d39283599f02292a1638d73d43109d7e0f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -15,7 +15,7 @@ before_script:
   - git config --global --add safe.directory $CI_PROJECT_DIR/hqr
   - git config --global --add safe.directory $CI_PROJECT_DIR/testing/test_fembem
   - git submodule update --init --recursive
-  - source .gitlab-ci-env.sh $SIMU
+  - source .gitlab-ci-env.sh $CHAM_CI_ENV_ARG
   - mkdir -p build-$VERSION
 
 include:
diff --git a/.gitlab/build.sh b/.gitlab/build.sh
new file mode 100755
index 0000000000000000000000000000000000000000..4847e3929aeeb501e53068daeef690c65043857e
--- /dev/null
+++ b/.gitlab/build.sh
@@ -0,0 +1,31 @@
+#!/usr/bin/env bash
+
+fatal() {
+    echo "$0: error occurred, exit"
+    exit 1
+}
+
+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' || fatal
+  eval '${SCAN}ctest --no-compress-output -j 5 -V -T Build | tee ../${LOGNAME}' || fatal
+  make install | tee -a ../${LOGNAME} || fatal
+  rm install/ -r || fatal
+else
+  echo "$0: directory build-$VERSION does not exist, exit."
+  exit 1
+fi
diff --git a/.gitlab/build.yml b/.gitlab/build.yml
index ad45a43e9622c4e20db32e3e70a29b0a5b632d44..dff1db4cba7c310b6874a7b3f515d462897d5072 100644
--- a/.gitlab/build.yml
+++ b/.gitlab/build.yml
@@ -29,10 +29,24 @@ build_starpu:
     BUILD_OPTIONS: "-DCHAMELEON_USE_CUDA=ON -DCHAMELEON_USE_MPI=ON"
     VERSION: starpu
 
+build_starpu_hip:
+  extends: .build_script_template
+  variables:
+    CHAM_CI_ENV_ARG: hip
+    BUILD_OPTIONS: "-DCHAMELEON_USE_HIP_ROC=ON -DCHAMELEON_USE_MPI=ON"
+    VERSION: starpu_hip
+
+build_starpu_hipcuda:
+  extends: .build_script_template
+  variables:
+    CHAM_CI_ENV_ARG: hipcuda
+    BUILD_OPTIONS: "-DCHAMELEON_USE_HIP_CUDA=ON -DCHAMELEON_HIPBLAS_PATH=/home/gitlab/hipcuda/hipblas -DCHAMELEON_USE_MPI=ON"
+    VERSION: starpu_hipcuda
+
 build_starpu_simgrid:
   extends: .build_script_template
   variables:
-    SIMU: simu
+    CHAM_CI_ENV_ARG: simgrid
     BUILD_OPTIONS: "-DCHAMELEON_SIMULATION=ON -DCHAMELEON_USE_CUDA=ON -DCHAMELEON_USE_MPI=OFF"
     VERSION: starpu_simgrid
 
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..6432472ae95c55fe21dd0d0a360379572682d34e
--- /dev/null
+++ b/.gitlab/test.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+
+fatal() {
+    echo "$0: error occurred, exit"
+    exit 1
+}
+
+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" || fatal
+  cd $CI_PROJECT_DIR || fatal
+  gcovr --xml-pretty --exclude-unreachable-branches --print-summary -o ${LOGNAME}.cov --root $CI_PROJECT_DIR || fatal
+  lcov --directory build-$VERSION --capture --output-file ${LOGNAME}.lcov || fatal
+  cp ${LOGNAME}.junit junit.xml || fatal
+  cp ${LOGNAME}.cov coverage.xml || fatal
+else
+  echo "$0: directory build-$VERSION does not exist, exit."
+  exit 1
+fi
diff --git a/.gitlab/test_starpu_simgrid.yml b/.gitlab/test_starpu_simgrid.yml
index 5c688dc94e89a36d11aac62767d86d26c601b766..0cd7b9ff3cbc40739592a7ee3694fc2a465a0daf 100644
--- a/.gitlab/test_starpu_simgrid.yml
+++ b/.gitlab/test_starpu_simgrid.yml
@@ -18,7 +18,7 @@ test_starpu_simgrid_simu_all:
   <<: *test_starpu_simgrid_branches
   variables:
     STARPU_WORKERS_NOBIND: 1
-    SIMU: simu
+    CHAM_CI_ENV_ARG: simgrid
     VERSION: starpu_simgrid
     CATEGORY: simu
     PRECISION: all