diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9aba36262a967d549c74be5c8bfaf8fd93c9246b..499e1ebdc2d4dc8c1759ec4b4721f65e35833c2a 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,8 +2,8 @@ stages:
   - linting
   - test
   - analyze
-  - release
   - build
+  - release
   - integration
   - deploy
 
@@ -40,16 +40,6 @@ test_storybook:
     - npx playwright install --with-deps
     - npm run test-storybook:ci
 
-semantic_release:
-  stage: release
-  script:
-    - npm install
-    - echo "@astron-sdc:registry=https://${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/" > .npmrc
-    - echo "//${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=${CI_JOB_TOKEN}" >> .npmrc
-    - npx semantic-release@22
-  rules:
-    - if: $CI_COMMIT_BRANCH == 'main'
-
 build_static_files:
   stage: build
   script:
@@ -68,6 +58,17 @@ build_package:
       - dist
     expire_in: "1w"
 
+semantic_release:
+  stage: release
+  needs: [build_package]
+  script:
+    - npm ci --ignore-scripts
+    - echo "@astron-sdc:registry=https://${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/" > .npmrc
+    - echo "//${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=${CI_JOB_TOKEN}" >> .npmrc
+    - npx semantic-release@22
+  rules:
+    - if: $CI_COMMIT_BRANCH == 'main'
+
 build_docker_image:
   stage: build
   image: docker:20-cli