diff --git a/.ci/deploy.sh b/.ci/deploy.sh
new file mode 100644
index 0000000000000000000000000000000000000000..3b07b3de598331cf59d45fdde691dcf830f138d9
--- /dev/null
+++ b/.ci/deploy.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# install npm
+npm install -g npm@latest yo grunt-cli generator-reveal bower
+npm install
+
+# build the master version into stable
+git fetch --tags
+latestTag=$(git describe --tags `git rev-list --tags --max-count=1`)
+git checkout $latestTag
+grunt dist
+mkdir stable
+mv public/* stable/.
+
+# build the develop version into latest
+git checkout -f develop
+git fetch origin develop
+git reset --hard origin/develop
+grunt dist
+mkdir latest
+mv public/* latest/.
+
+# deploy the stable and latest directories
+mv stable public/.
+mv latest public/.
+
+# auto redirect file
+cp .ci/.autoRedirect public/index.html
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 3dcb04a71fca8a5e8832cff9e7eb07466de3f151..5dc5cb26adde1afb1413c5c791eb49e47d54458e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -7,31 +7,7 @@ pages:
     - master
   script:
     # install npm
-    - npm install -g npm@latest yo grunt-cli generator-reveal bower
-    - npm install
-
-    # build the master version into stable
-    - git fetch --tags
-    - latestTag=$(git describe --tags `git rev-list --tags --max-count=1`)
-    - git checkout $latestTag
-    - grunt dist
-    - mkdir stable
-    - mv public/* stable/.
-
-    # build the develop version into latest
-    - git checkout -f develop
-    - git fetch origin develop
-    - git reset --hard origin/develop
-    - grunt dist
-    - mkdir latest
-    - mv public/* latest/.
-
-    # deploy the stable and latest directories
-    - mv stable public/.
-    - mv latest public/.
-
-    # auto redirect file
-    - cp .autoRedirect public/index.html
+    - bash .ci/deploy.sh
 
   artifacts:
     paths: