diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e8df49818bc8a127585684f6be810bb7090c6f38..72c0621d6a9fd73ff62791f69818335d873cae88 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -29,6 +29,9 @@ workflow:
         PIPELINE_NAME: "web only MR pipeline: $CI_MERGE_REQUEST_SOURCE_PROJECT_PATH $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME"
         BUILD_TESTS: "false"
         CTEST_INCLUDE_REGEX: "nb-"
+    - if: $CI_MERGE_REQUEST_LABELS =~ /.*ci::linux only.*/
+      variables:
+        PIPELINE_NAME: "linux only MR pipeline: $CI_MERGE_REQUEST_SOURCE_PROJECT_PATH $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME"
     - if: $CI_MERGE_REQUEST_IID # merge requests
       variables:
         PIPELINE_NAME: "MR pipeline: $CI_MERGE_REQUEST_SOURCE_PROJECT_PATH $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME"
@@ -42,12 +45,15 @@ workflow:
 
 include:
   - local: "scripts/ci/extends/*.yml"
+  - local: "/scripts/ci/pipelines/regular.yml"
+    rules:
+      - if: $CI_PIPELINE_SOURCE != "schedule" && $CI_MERGE_REQUEST_LABELS !~ /.*ci::\w* only.*/
   - local: "/scripts/ci/pipelines/web.yml"
     rules:
       - if: $CI_MERGE_REQUEST_LABELS =~ /.*ci::web only.*/
-  - local: "/scripts/ci/pipelines/regular.yml"
-    rules:
-      - if: $CI_PIPELINE_SOURCE != "schedule" && $CI_MERGE_REQUEST_LABELS !~ /.*ci::web only.*/
   - local: "/scripts/ci/pipelines/scheduled.yml"
     rules:
       - if: '$CI_PIPELINE_SOURCE == "schedule"'
+  - local: "/scripts/ci/pipelines/linux.yml"
+    rules:
+      - if: $CI_MERGE_REQUEST_LABELS =~ /.*ci::linux only.*/
diff --git a/scripts/ci/pipelines/linux.yml b/scripts/ci/pipelines/linux.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ddcad611c97a283643e15d7d2c4f76b6ed81d4c9
--- /dev/null
+++ b/scripts/ci/pipelines/linux.yml
@@ -0,0 +1,9 @@
+include:
+  - local: "/scripts/ci/extends/*.yml"
+  - local: "/scripts/ci/jobs/meta.yml"
+  - local: "/scripts/ci/jobs/ci_images.yml"
+  - local: "/scripts/ci/jobs/build-linux.yml"
+  - local: "/scripts/ci/jobs/build-linux-arch.yml"
+  - local: "/scripts/ci/jobs/build-linux-petsc.yml"
+  - local: "/scripts/ci/jobs/build-linux-frontend.yml"
+  - local: "/scripts/ci/jobs/build-gui-linux.yml"
diff --git a/scripts/ci/pipelines/regular.yml b/scripts/ci/pipelines/regular.yml
index 778cfc007da92856df8f5d545ce2691c4a0b7551..ab6ffb4be15db7a59b1609789a4d2ec33629229e 100644
--- a/scripts/ci/pipelines/regular.yml
+++ b/scripts/ci/pipelines/regular.yml
@@ -3,10 +3,7 @@ include:
   - local: "/scripts/ci/jobs/ci_images.yml"
   # jobs, can be indiviually disabled for testing
   - local: "/scripts/ci/jobs/pre-commit.yml"
-  - local: "/scripts/ci/jobs/build-linux.yml"
-  - local: "/scripts/ci/jobs/build-linux-arch.yml"
-  - local: "/scripts/ci/jobs/build-linux-petsc.yml"
-  - local: "/scripts/ci/jobs/build-linux-frontend.yml"
+  - local: "/scripts/ci/pipelines/linux.yml"
   - local: "/scripts/ci/jobs/build-docs.yml"
   - local: "/scripts/ci/jobs/build-win.yml"
   - local: "/scripts/ci/jobs/build-mac.yml"
@@ -14,7 +11,6 @@ include:
   - local: "/scripts/ci/jobs/jupyter.yml"
   - local: "/scripts/ci/jobs/code-quality.yml"
   - local: "/scripts/ci/jobs/code-coverage.yml"
-  - local: "/scripts/ci/jobs/build-gui-linux.yml"
   - local: "/scripts/ci/jobs/build-gui-win.yml"
   - local: "/scripts/ci/jobs/build-gui-mac.yml"
   - local: "/scripts/ci/jobs/check-header.yml"
diff --git a/scripts/ci/pipelines/web.yml b/scripts/ci/pipelines/web.yml
index 579d9635edb5a4257ee43f654290bb66be7eff8a..c112627753d39c27b9744d8b788e652eac53b549 100644
--- a/scripts/ci/pipelines/web.yml
+++ b/scripts/ci/pipelines/web.yml
@@ -1,5 +1,4 @@
 include:
-  - local: "/scripts/ci/extends/*.yml"
   - local: "/scripts/ci/jobs/meta.yml"
   - local: "/scripts/ci/jobs/ci_images.yml"
   - local: "/scripts/ci/jobs/build-linux-arch.yml"