diff --git a/includes/docker-build.yml b/includes/docker-build.yml
index c997d29c2d51af73023fa3a5763b0dc494c81275..9c37c4768114deff0c7c7d2dde3615a11c64b965 100644
--- a/includes/docker-build.yml
+++ b/includes/docker-build.yml
@@ -53,33 +53,19 @@
 
 .docker-build-storybook:
   stage: docker-build
-  only:
-    refs:
-      - master
-      - main
-      - production
-      - tags
-      - merge_requests
-    variables:
-      - $STORYBOOK == "true"
-  extends: .docker-build-storybook-base
+
+  extends:
+    - .rules-stoybook
+    - .docker-build-storybook-base
   needs: ["storybook-build"]
 
 .storybook-build:
   extends:
+    - .rules-stoybook
     - .cache-node-modules
   cache:
     policy: pull
   stage: build
-  only:
-    refs:
-      - master
-      - main
-      - production
-      - tags
-      - merge_requests
-    variables:
-      - $STORYBOOK == "true"
 
   needs: ["setup-build-info"]
   # don't do it after the semantic release commit, but do it after tag
diff --git a/includes/rules.yml b/includes/rules.yml
index 5064ec6d1715a56c637df96f078f08b8cca456b2..5500e40b49969f48db0a25e77bb063e66c264cda 100644
--- a/includes/rules.yml
+++ b/includes/rules.yml
@@ -43,3 +43,14 @@
       when: on_success
     - if: $CI_COMMIT_TAG
       when: manual
+
+.rules-stoybook:
+  rules:
+    - if: $STORYBOOK != "true"
+      when: never
+    - if: $CI_COMMIT_TAG
+    - if: $CI_COMMIT_MESSAGE =~ /^chore\(release\).*/ # not after semantic release commit
+      when: never
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+    - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\.([0-9]+|x)\.x$/ # hotfix branches
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'